quickhull/Utility.h

38 lines
1.1 KiB
C

#pragma once
#ifndef UTILITY_H
static float sign(float x, float y, float x1, float y1, float x2, float y2)
{
return (x - x2) * (y1 - y2) - (x1 - x2) * (y - y2);
}
static float sign (const Point &pt, const Point &p1, const Point &p2)
{
return (pt.x() - p2.x()) * (p1.y() - p2.y()) - (p1.x() - p2.x()) * (pt.y() - p2.y());
}
static bool IsPointInTriangle(const Point &pt, const Point &p1, const Point &p2, const 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 IsPointInRectangle(const Point& pt, const Point& p1, const Point& p2, const Point& p3, const Point& p4)
{
float d1 = sign(pt, p1, p2);
float d2 = sign(pt, p2, p3);
float d3 = sign(pt, p3, p4);
float d4 = sign(pt, p4, p1);
bool has_neg = (d1 <= 0) || (d2 <= 0) || (d3 <= 0) || (d4 <= 0);
bool has_pos = (d1 >= 0) || (d2 >= 0) || (d3 >= 0) || (d4 >= 0);
return !(has_neg && has_pos);
}
#endif // UTILITY_H