Add Akl Heuristic in performance mode
Doesn't seem to make much of a difference though :( but another issue was fixed in the meantime (we weren't actually usign the leftmost and rightmost points!)
This commit is contained in:
parent
ef01f37834
commit
7bfa0f0ed2
3
Line.h
3
Line.h
@ -42,8 +42,7 @@ public:
|
||||
other -= from();
|
||||
|
||||
// Cross product greater than zero?
|
||||
// Note: We need ">=" here so that we include points which are directly on the existing hull.
|
||||
if (m_to_from_origin.x() * other.y() - m_to_from_origin.y() * other.x() >= 0)
|
||||
if (m_to_from_origin.x() * other.y() - m_to_from_origin.y() * other.x() > 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
38
Quickhull.h
38
Quickhull.h
@ -8,6 +8,7 @@
|
||||
|
||||
#include "Display.h"
|
||||
#include "Triangle.h"
|
||||
#include "Utility.h" // For IsPointInRectangle
|
||||
|
||||
class Quickhull
|
||||
{
|
||||
@ -19,11 +20,45 @@ public:
|
||||
// Get leftmost and rightmost point
|
||||
Point leftmost(INFINITY, 0.0), rightmost(-INFINITY, 0.0);
|
||||
|
||||
if (akl)
|
||||
{
|
||||
// Also get highest and lowest point
|
||||
Point lowest(0.0, -INFINITY), highest(0.0, INFINITY);
|
||||
|
||||
for (const Point &point : input)
|
||||
{
|
||||
if (point.x() < leftmost.x()) {
|
||||
leftmost = point;
|
||||
} else if (point.y() > rightmost.y()) {
|
||||
} else if (point.x() > rightmost.x()) {
|
||||
rightmost = point;
|
||||
}
|
||||
|
||||
if (point.y() < highest.y()) {
|
||||
highest = point;
|
||||
} else if (point.y() > lowest.y()) {
|
||||
lowest = point;
|
||||
}
|
||||
}
|
||||
|
||||
Triangle t1(highest, rightmost, lowest);
|
||||
Triangle t2(lowest, leftmost, highest);
|
||||
|
||||
// Remove all points in this rectangle
|
||||
input.remove_if([highest, leftmost, lowest, rightmost](const Point &point)
|
||||
{
|
||||
return IsPointInRectangle(point, highest, leftmost, lowest, rightmost);
|
||||
});
|
||||
|
||||
output.emplace_back(leftmost);
|
||||
output.emplace_back(rightmost);
|
||||
output.emplace_back(highest);
|
||||
output.emplace_back(lowest);
|
||||
} else {
|
||||
for (const Point &point : input)
|
||||
{
|
||||
if (point.x() < leftmost.x()) {
|
||||
leftmost = point;
|
||||
} else if (point.x() > rightmost.x()) {
|
||||
rightmost = point;
|
||||
}
|
||||
}
|
||||
@ -34,6 +69,7 @@ public:
|
||||
// Remove them from the input (as well as duplicates)
|
||||
input.remove(leftmost);
|
||||
input.remove(rightmost);
|
||||
}
|
||||
|
||||
// Create a line from leftmost to rightmost
|
||||
Line line = Line(leftmost, rightmost);
|
||||
|
Loading…
x
Reference in New Issue
Block a user