public Triangle(Vertex v1, Vertex v2, Vertex v3) { V1 = v1; V2 = v2; V3 = v3; // Boundary box. float b1x = Math.Min(Math.Min(v1.Position.X, v2.Position.X), v3.Position.X); float b1y = Math.Min(Math.Min(v1.Position.Y, v2.Position.Y), v3.Position.Y); float b2x = Math.Max(Math.Max(v1.Position.X, v2.Position.X), v3.Position.X); float b2y = Math.Max(Math.Max(v1.Position.Y, v2.Position.Y), v3.Position.Y); B1 = new Vector2(b1x, b1y); B2 = new Vector2(b2x, b2y); }
private static bool CheckPointToSegment(Vertex sA, Vertex sB, Vertex point) { if ((sA.Position.Y < point.Position.Y && sB.Position.Y >= point.Position.Y) || (sB.Position.Y < point.Position.Y && sA.Position.Y >= point.Position.Y)) { float x = sA.Position.X + (point.Position.Y - sA.Position.Y) / (sB.Position.Y - sA.Position.Y) * (sB.Position.X - sA.Position.X); if (x < point.Position.X) return true; } return false; }
public bool ContainsPoint(Vertex point) { if (B1.X <= point.Position.X && point.Position.X <= B2.X && B1.Y <= point.Position.Y && point.Position.Y <= B2.Y) { bool oddNodes = false; if (CheckPointToSegment(V3, V1, point)) oddNodes = !oddNodes; if (CheckPointToSegment(V1, V2, point)) oddNodes = !oddNodes; if (CheckPointToSegment(V2, V3, point)) oddNodes = !oddNodes; return oddNodes; } return false; }
public bool Equals(Vertex obj) { // Duplicate vertexes are now allowed, so no need to check index. return obj.Position.Equals(Position); }
public bool HavePoint(Vertex point) { return V1.Equals(point) || V2.Equals(point) || V3.Equals(point); }