Идея с выпуклой резиновой лентой - только в состоянии нарисовать 4 линии

У меня запущена программа с выпуклым корпусом, но осталась только одна проблема - на диаграмме она захватывает только 4 точки. В некотором смысле, если бы я сделал 5-е очко, он бы заменил только одну из первоначальных 4, чтобы сохранить тот же 4-сторонний предел. Интересно, где я все испортил, когда я использовал пример wikibooks в качестве своей базы.

https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain

ПРИМЕЧАНИЕ: сортировка работает, так как я отлаживал эту часть, и она фиксирует все сделанные точки, проблема заключается, вероятно, в части кода верхнего / нижнего корпуса, но я не уверен, что неправильно / отсутствует. Хотелось бы просто еще один набор глаз, чтобы помочь.

double cross(const QPointF &O, const QPointF &A, const QPointF &B)
    {
        return (long)(A.x() - O.x()) * (B.y() - O.y())
                - (long)(A.y() - O.y()) * (B.x() - O.x());
    }

    void culling(QPainter * painter)
    {
        int n = vecPoints.size();
        int k = 0;
        std::vector<QPointF> H(2*n);

        // Sort points lexicographically
        std::sort(vecPoints.begin(),vecPoints.end(), lexicalSort());

        // Build lower hull
        for (int i = 0; i < n; ++i)
        {
            while (k >= 2 && cross(H[k-2], H[k-1], vecPoints[i]) <= 0)
                k--;
            H[k++] = vecPoints[i];
        }

        // Build upper hull
        for (int i = n-2, t = k+1; i >= 0; i--)
        {
            while (k >= t && cross(H[k-2], H[k-1], vecPoints[i]) <= 0) k--;
            H[k++] = vecPoints[i];
        }

        H.resize(k);

        //draw the rubber band around outter points
        QPointF tmp;
        for (std::vector<QPointF>::const_iterator it = H.begin(); it != H.end(); it++)
        {
            if (it == H.begin())
                tmp = *it;
            else
            {
                painter->drawLine(tmp, *it);
                tmp = *it;
            }
        }
    }

0 ответов

Другие вопросы по тегам