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 rectangle_in_rectangle_by_triangle(Vector2f p1_r1, Vector2f p2_r1, Vector2f p3_r1, Vector2f p4_r1, Vector2f p1_r2, Vector2f p2_r2, Vector2f p3_r2, Vector2f p4_r2) { Vector2f center_r1 = new Vector2f((p3_r1.x + p1_r1.x) / 2, (p3_r1.y + p1_r1.y) / 2); Vector2f center_r2 = new Vector2f((p3_r2.x + p1_r2.x) / 2, (p3_r2.y + p1_r2.y) / 2); Trianglef triangle = new Trianglef(); triangle.v0 = p1_r1; triangle.v1 = p2_r1; triangle.v2 = p3_r1; if (point_in_triangle(center_r2, triangle)) { return(true); } triangle.v0 = p1_r1; triangle.v1 = p4_r1; triangle.v2 = p3_r1; if (point_in_triangle(center_r2, triangle)) { return(true); } triangle.v0 = p1_r2; triangle.v1 = p2_r2; triangle.v2 = p3_r2; if (point_in_triangle(center_r1, triangle)) { return(true); } triangle.v0 = p1_r2; triangle.v1 = p4_r2; triangle.v2 = p3_r2; if (point_in_triangle(center_r1, triangle)) { return(true); } return(false); }
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); }
static public bool lineseg_intersect_rectangle_by_triangle(Vector2f p1_l1, Vector2f p2_l1, Vector2f p1_r2, Vector2f p2_r2, Vector2f p3_r2, Vector2f p4_r2) { Trianglef triangle = new Trianglef(); triangle.v0 = p1_r2; triangle.v1 = p2_r2; triangle.v2 = p3_r2; if (point_in_triangle(p1_l1, triangle)) { return(true); } triangle.v0 = p1_r2; triangle.v1 = p4_r2; triangle.v2 = p3_r2; if (point_in_triangle(p1_l1, triangle)) { return(true); } triangle.v0 = p1_r2; triangle.v1 = p2_r2; triangle.v2 = p3_r2; if (point_in_triangle(p2_l1, triangle)) { return(true); } triangle.v0 = p1_r2; triangle.v1 = p4_r2; triangle.v2 = p3_r2; if (point_in_triangle(p2_l1, triangle)) { return(true); } LineSegf l1 = new LineSegf(); LineSegf l2 = new LineSegf(); l1.vertex0 = p1_l1; l1.vertex1 = p2_l1; l2.vertex0 = p1_r2; l2.vertex1 = p2_r2; if (lineseg_intersect_lineseg(l1, l2)) { return(true); } l2.vertex0 = p2_r2; l2.vertex1 = p3_r2; if (lineseg_intersect_lineseg(l1, l2)) { return(true); } l2.vertex0 = p3_r2; l2.vertex1 = p4_r2; if (lineseg_intersect_lineseg(l1, l2)) { return(true); } l2.vertex0 = p4_r2; l2.vertex1 = p1_r2; if (lineseg_intersect_lineseg(l1, l2)) { return(true); } return(false); }
public void printTriangleWireframe(Trianglef triangle, Vec3f color) { printLine(new Linef(triangle.v0, triangle.v1), color); printLine(new Linef(triangle.v1, triangle.v2), color); printLine(new Linef(triangle.v2, triangle.v0), color); }