0

我有一个凸包程序,但唯一剩下的问题是它只能捕获图表上的 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;
            }
        }
    }
4

0 回答 0