Идея выпуклой резиновой ленты — только в состоянии нарисовать 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector