Я пытаюсь реализовать предложение тринитротолуола для проверки, является ли многоугольник вогнутым или выпуклым, найденным в здесь .
То, что я до сих пор пробовал, реализует это предложениеиспользуя glm , но по тем или иным причинам я получаю ложный результат.
Вот мои вершины, которые дают вогнутый многоугольник:
glm::vec2 v1(0.0f, 0.0f);
glm::vec2 v2(1.0f, 0.0f);
glm::vec2 v3(0.5f, 0.5f);
glm::vec2 v4(1.0f, 1.0f);
glm::vec2 v5(0.0f, 1.0f);
std::vector<glm::vec2> vertices;
vertices.push_back(v1);
vertices.push_back(v2);
vertices.push_back(v3);
vertices.push_back(v4);
vertices.push_back(v5);
А вотреализовано ли решение:
bool IsConvex(const std::vector<glm::vec2> &vertices)
{
glm::mat2 mat(vertices.at(0).x, vertices.at(1).x, vertices.at(0).y, vertices.at(1).y);
float rez = glm::determinant(mat);
for (int i = 1; i < vertices.size(); i++)
{
glm::mat2 mat(vertices.at(i).x, vertices.at(i).y, vertices.at((i+1)%vertices.size()).x, vertices.at((i + 1) % vertices.size()).y);
float det = glm::determinant(mat);
rez = rez * det;
}
if (rez < 0)
return false;
else
return true;
}
Данный многоугольник является вогнутым, но реализация подсказки тринитротолуола дает мне ложный результат, получая в качестве выходного значения true
для IsConvex()
, что означаетчто многоугольник является выпуклым, когда он должен иметь значение false
.