quickhull/Utility.h

53 lines
1.3 KiB
C++

#pragma once
#ifndef UTILITY_H
static float sign (Point &p1, Point &p2, Point &p3)
{
return (p1.x() - p3.x()) * (p2.y() - p3.y()) - (p2.x() - p3.x()) * (p1.y() - p3.y());
}
static bool IsPointInTriangle(Point &pt, Point &p1, Point &p2, Point &p3)
{
float d1 = sign(pt, p1, p2);
float d2 = sign(pt, p2, p3);
float d3 = sign(pt, p3, p1);
bool has_neg = (d1 < 0) || (d2 < 0) || (d3 < 0);
bool has_pos = (d1 > 0) || (d2 > 0) || (d3 > 0);
return !(has_neg && has_pos);
}
static bool SortForMinXMaxY (const Point& a, const Point& b)
{
if (a.x() != b.x())
{
return (a.x() < b.x());
}
return (a.y() > b.y());
}
static bool SortForMinYMaxX(const Point& a, const Point& b)
{
if (a.y() != b.y())
{
return (a.x() < b.x());
}
return (a.y() > b.y());
}
static void sortPoints (std::vector<Point>& pts)
{
std::sort(pts.begin(), pts.end(), SortForMinXMaxY);
}
// TODO: what happens if all/more points are on hor/vert line? -> sort for x, than y should handle this
static std::pair<Point, Point> getMinMaxX(std::vector<Point>& pts)
{
// TODO: check if already sorted? assume array is sorted? call sort utility function???
//sortPoints(pts);
std::sort(pts.begin(), pts.end(), SortForMinXMaxY);
return std::make_pair(pts[0], pts[pts.size() - 1]);
}
#endif // UTILITY_H