public void Initialize(NavigationPolygons polygons) { Reset(); this.polygons = polygons; Tesselation(); for (int i = 0; i < this.tesselationAlgorithm.ElementCount; i++) { var v0 = this.tesselationAlgorithm.Vertices[this.tesselationAlgorithm.Elements[i * 3]].Position.ToIntPoint(); var v1 = this.tesselationAlgorithm.Vertices[this.tesselationAlgorithm.Elements[i * 3 + 1]].Position.ToIntPoint(); var v2 = this.tesselationAlgorithm.Vertices[this.tesselationAlgorithm.Elements[i * 3 + 2]].Position.ToIntPoint(); var triangle = new NavigationTriangle(v0, v1, v2); AllTriangle.Add(triangle); } // Refine(); foreach (var triangle in AllTriangle) { AddTriangleToPointMap(triangle.U, triangle); AddTriangleToPointMap(triangle.V, triangle); AddTriangleToPointMap(triangle.W, triangle); AddTriangleToPointMap(triangle.S0.Midpoint(), triangle); AddTriangleToPointMap(triangle.S1.Midpoint(), triangle); AddTriangleToPointMap(triangle.S2.Midpoint(), triangle); } }
void UpdateTriangulation(NavigationTriangle t, DeterministicVector2 p) { var v = new DeterministicVector2(p); AllTriangle.Add(new NavigationTriangle(t.U, t.V, v)); AllTriangle.Add(new NavigationTriangle(t.V, t.W, v)); AllTriangle.Add(new NavigationTriangle(t.W, t.U, v)); AllTriangle.Remove(t); }
private void AddTriangleToPointMap(DeterministicVector2 p, NavigationTriangle tri) { if (!triangleMapping.ContainsKey(p)) { triangleMapping.Add(p, new List <NavigationTriangle>()); } triangleMapping[p].Add(tri); }
private void AddTriangleToQueue(NavigationTriangle triangle, AStarNode parent, AStarContext context) { AddPointToQueue(triangle.U, parent, context); AddPointToQueue(triangle.V, parent, context); AddPointToQueue(triangle.W, parent, context); AddPointToQueue(triangle.S0.Midpoint(), parent, context); AddPointToQueue(triangle.S1.Midpoint(), parent, context); AddPointToQueue(triangle.S2.Midpoint(), parent, context); }
void SplitTriangle(NavigationTriangle t) { if (t.S0.GetLengthSquared() <= 4 || t.S1.GetLengthSquared() <= 4 || t.S2.GetLengthSquared() <= 4) { return; } var c = t.GetMiddlePoint(); if (t.IsPointInTriangle(c)) { UpdateTriangulation(t, c); } }