Попытка определить, является ли 2D-многоугольник вогнутым или выпуклым, путем реализации данного предложения - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь реализовать предложение тринитротолуола для проверки, является ли многоугольник вогнутым или выпуклым, найденным в здесь .

То, что я до сих пор пробовал, реализует это предложениеиспользуя 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.

...