public void AddsARoadToAnEdge() { var node1 = new Node(); var node2 = new Node(); var node3 = new Node(); var edge1 = new Edge(node1, node2); var edge2 = new Edge(node2, node3); var road = new Road(); edge1.Add(road); var context = CreateContext( edge2, new Dictionary<Node, IEnumerable<Edge>> { {node1, new[] {edge1}}, {node2, new[] {edge1, edge2}}, {node3, new[] {edge2}} }); context.Player.Roads.Add(road); new PlaceRoad().Execute(context); Assert.Equal(context.Player.Roads[1], edge2.Get<Road>()); }
public void Awake() { this.vertexes = Vertex.Get(this, this.vertexes); this.triangles = Triangle.Get(this, this.triangles); this.edges = Edge.Get(this, this.edges); }
public static List <List <Edge> > GetBorderEdgeLoops(Mesh mesh) { var borderEdgeLoops = new List <List <Edge> > (); var edgesTriangles = new Dictionary <Edge, int> (); var adjacency = new List <int> [mesh.vertices.Length]; var vertices = mesh.vertices; for (int i = 0; i < vertices.Length; ++i) { adjacency [i] = new List <int> (); } var triangles = mesh.triangles; for (int i = 0; i < triangles.Length; i += 3) { var a = triangles [i]; var b = triangles [i + 1]; var c = triangles [i + 2]; adjacency [a].Add(b); adjacency [a].Add(c); adjacency [b].Add(a); adjacency [b].Add(c); adjacency [c].Add(a); adjacency [c].Add(b); var e1 = Edge.Get(a, b); var e2 = Edge.Get(b, c); var e3 = Edge.Get(c, a); int value; edgesTriangles [e1] = edgesTriangles.TryGetValue(e1, out value) ? value + 1 : 1; edgesTriangles [e2] = edgesTriangles.TryGetValue(e2, out value) ? value + 1 : 1; edgesTriangles [e3] = edgesTriangles.TryGetValue(e3, out value) ? value + 1 : 1; } var edgesVisited = new HashSet <Edge> (); foreach (var item in edgesTriangles) { var edge = item.Key; var numTrianglesForEdge = item.Value; if (numTrianglesForEdge <= 0 || numTrianglesForEdge > 2) { Debug.Assert(numTrianglesForEdge > 0 && numTrianglesForEdge <= 2); // don't expect ill-formed meshes } // edges with one adjacent triangle are "border" edges if (numTrianglesForEdge != 1) { continue; } if (edgesVisited.Contains(edge)) { continue; } // don't care what direction we go, let's choose v1 int startingVertex = edge.v1; int currentEdgeLoopVertex = startingVertex; Edge currentEdge; List <Edge> border = new List <Edge> (); do { currentEdge = null; foreach (var adjacentVertex in adjacency[currentEdgeLoopVertex]) { var loopEdge = Edge.Get(currentEdgeLoopVertex, adjacentVertex); if (edgesVisited.Contains(loopEdge)) { continue; } if (edgesTriangles [loopEdge] != 1) { continue; } currentEdge = loopEdge; currentEdgeLoopVertex = adjacentVertex; break; } if (currentEdge == null) { // could not find the next border edge break; } edgesVisited.Add(currentEdge); border.Add(currentEdge); } while (currentEdgeLoopVertex != startingVertex); borderEdgeLoops.Add(border); } return(borderEdgeLoops); }
public void Awake() { this.edges = Edge.Get(this, this.edges); }