static public bool point_in_triangle(Vector2f pt, Trianglef triangle) { float minX = triangle.v0.x; float minY = triangle.v0.y; float maxX = triangle.v0.x; float maxY = triangle.v0.y; minX = minX < triangle.v1.x ? minX : triangle.v1.x; minX = minX < triangle.v2.x ? minX : triangle.v2.x; minY = minY < triangle.v1.y ? minY : triangle.v1.y; minY = minY < triangle.v2.y ? minY : triangle.v2.y; maxX = maxX > triangle.v1.x ? maxX : triangle.v1.x; maxX = maxX > triangle.v2.x ? maxX : triangle.v2.x; maxY = maxY > triangle.v1.y ? maxY : triangle.v1.y; maxY = maxY > triangle.v2.y ? maxY : triangle.v2.y; if (pt.x < minX || pt.x > maxX || pt.y < minY || pt.y > maxY) { return(false); } int count = 0; for (uint i = 0; i < 3; i++) { LineSegf line = triangle.side(i); if (point_in_lineseg(pt, line)) { return(true); } if (point_lineseg_side(pt, line) > 0) { if (count != 0 && count != 1) { return(false); } count = 1; } else { if (count != 0 || count != -1) { return(false); } count = -1; } } return(true); }
static public bool circle_intersect_triangle(Vector2f center, float radius, Trianglef triangle) { if (Geometryalgorithm2d.point_in_triangle(center, triangle)) { return(true); } for (uint i = 0; i < 3; i++) { LineSegf line = triangle.side(i); Vector2f pt = Geometryalgorithm2d.point_line_intersect(center, line); float distance = pt.Subtract(center).length(); if (distance < radius) { return(true); } } return(false); }
static public bool lineseg_intersect_triangle(LineSegf lineseg, Trianglef triangle) { if (point_in_triangle(lineseg.vertex0, triangle)) { return(true); } if (point_in_triangle(lineseg.vertex1, triangle)) { return(true); } for (uint j = 0; j < 3; j++) { if (lineseg_intersect_lineseg(lineseg, triangle.side(j))) { return(true); } } return(false); }