#pragma once #ifndef UTILITY_H static float sign(float x1, float y1, float x2, float y2, float x3, float y3) { return (x1 - x3) * (y2 - y3) - (x2 - x3) * (y1 - y3); } 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& 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 getMinMaxX(std::vector& 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