/// <summary> /// DON'T FORGET TO IMPOSE OWNERSHIP AFTER CREATION! /// </summary> /// <param name="nodes"></param> public Polygon(List<MeshNode> nodes) { mEdges = new List<Edge>(); int length = nodes.Count; for (int i = 0; i < length; i++) { Edge e = new Edge(nodes[i % length], nodes[(i + 1) % length]); e.ImposeOwnership(); mEdges.Add(e); } }
/// <summary> /// For code testing purpose: /// Returns a new special-shaped mesh instance. /// </summary> public static NavigationMesh[] GetTestInstanceForCleanUp() { NavigationMesh[] result = new NavigationMesh[3]; for (int x = 0; x < 3; x++) { MeshNode a = new MeshNode(0, 0); MeshNode b = new MeshNode(0, 10); MeshNode c = new MeshNode(5, 10); MeshNode d = new MeshNode(5, 0); MeshNode e = new MeshNode(0, 15); MeshNode f = new MeshNode(10, 15); MeshNode g = new MeshNode(10, 10); MeshNode h = new MeshNode(15, 15); MeshNode i = new MeshNode(15, 0); MeshNode j = new MeshNode(10, 0); Edge ab = new Edge(a, b); ab.ImposeOwnership(); Edge bc = new Edge(b, c); bc.ImposeOwnership(); Edge cd = new Edge(c, d); cd.ImposeOwnership(); Edge da = new Edge(d, a); da.ImposeOwnership(); Edge be = new Edge(b, e); be.ImposeOwnership(); Edge ef = new Edge(e, f); ef.ImposeOwnership(); Edge fg = new Edge(f, g); fg.ImposeOwnership(); Edge gc = new Edge(g, c); gc.ImposeOwnership(); Edge cb = new Edge(c, b); cb.ImposeOwnership(); Edge fh = new Edge(f, h); fh.ImposeOwnership(); Edge hi = new Edge(h, i); hi.ImposeOwnership(); Edge ij = new Edge(i, j); ij.ImposeOwnership(); Edge jg = new Edge(j, g); jg.ImposeOwnership(); Edge gf = new Edge(g, f); gf.ImposeOwnership(); Polygon pA = new Polygon(new List<Edge> { ab, bc, cd, da }); pA.ImposeOwnership(); Polygon pB = new Polygon(new List<Edge> { be, ef, fg, gc, cb }); pB.ImposeOwnership(); Polygon pC = new Polygon(new List<Edge> { fh, hi, ij, jg, gf }); pC.ImposeOwnership(); result[x] = new NavigationMesh(15,15); result[x].AddPolygon(pA); result[x].AddPolygon(pB); result[x].AddPolygon(pC); } return result; }
/// <summary> /// pure function /// </summary> /// <param name="edge2"></param> /// <returns></returns> public Edge GetUnion(Edge edge2) { Debug.Assert(mEndNode == edge2.mStartNode, "Edge union failed!"); Edge result = new Edge(mStartNode, edge2.mEndNode); result.ImposeOwnership(); return result; }
public List<Edge> GetSplit(MeshNode node) { Debug.Assert(mStartNode != node && mEndNode != node); Debug.Assert(HelperMethods.PointOnLine(node.mVector, mStartNode.mVector, mEndNode.mVector, 0)); Edge e1 = new Edge(mStartNode, node); Edge e2 = new Edge(node, mEndNode); e1.ImposeOwnership(); e2.ImposeOwnership(); return new List<Edge>{e1, e2}; }