Example #1
0
        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>());
        }
Example #2
0
 public void Awake()
 {
     this.vertexes  = Vertex.Get(this, this.vertexes);
     this.triangles = Triangle.Get(this, this.triangles);
     this.edges     = Edge.Get(this, this.edges);
 }
Example #3
0
        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);
        }
Example #4
0
 public void Awake()
 {
     this.edges = Edge.Get(this, this.edges);
 }