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