Example #1
0
 public void AddTriangle(TensileTriangle _tt)
 {
     if (!ConnectedTriangles.Contains(_tt))
     {
         ConnectedTriangles.Add(_tt);
     }
 }
    public void AddVertexEdgeTriangle(TensileEdge SE, int index)
    {
        int V0 = SE.StartVertice;
        int V1 = SE.EndVertice;

        if (SE.GetConnecetedTriangles().Count() == 1)
        {
            Vector3 _p = SE.PosToGrow(index);

            _edgeGraph.edgeGraph.AddVertex();

            int V = _edgeGraph.edgeGraph.VertexCount - 1;

            _edgeGraph.edgeGraph.AddEdge(V, V0);
            _edgeGraph.edgeGraph.AddEdge(V, V1);


            addPosition(_p);
            var tObj = Instantiate(TGVertexPrefab, transform);
            tObj.SetBarHolder(BarsHolder);
            tObj.SetStrHolder(StringHolder);
            tObj.transform.localPosition = _p;

            tObj.SetupStructure(Scale, DefState, V);

            _edgeGraph.TensileVertexObjects[V0].AddConnectedVertObjInLayer(tObj);
            _edgeGraph.TensileVertexObjects[V1].AddConnectedVertObjInLayer(tObj);

            _edgeGraph.TensileVertexObjects.Add(tObj);

            SE.AddDiagonalVertex(tObj);
            SE.NeighborVertexEnd = tObj;


            var eObj0 = Instantiate(TGEdgePrefab, transform);
            eObj0.SetBarHolder(BarsHolder);
            eObj0.SetStrHolder(StringHolder);
            eObj0.SetupStructure(Scale, DefState, V, V0, savedPositions);

            _edgeGraph.TensileEdgeObjects.Add(eObj0);

            var eObj1 = Instantiate(TGEdgePrefab, transform);
            eObj1.SetBarHolder(BarsHolder);
            eObj1.SetStrHolder(StringHolder);
            eObj1.SetupStructure(Scale, DefState, V, V1, savedPositions);

            _edgeGraph.TensileEdgeObjects.Add(eObj1);

            var tri = new TensileTriangle();

            tri.SetupTriangle(V, V0, V1, savedPositions);

            _edgeGraph.TensileTriangle.Add(tri);

            tri.addTensileEdgeObjs(SE);
            tri.addTensileEdgeObjs(eObj0);
            tri.addTensileEdgeObjs(eObj1);

            tri.addTensileVertexObjs(tObj);
            tri.addTensileVertexObjs(_edgeGraph.TensileVertexObjects[V0]);
            tri.addTensileVertexObjs(_edgeGraph.TensileVertexObjects[V1]);

            SE.AddTriangle(tri);

            eObj0.AddTriangle(tri);

            eObj0.AddConnectedVertex(tObj);
            eObj0.AddConnectedVertex(_edgeGraph.TensileVertexObjects[V0]);

            eObj0.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[V1]);

            tObj.AddEdgeObjs(eObj0);
            _edgeGraph.TensileVertexObjects[V0].AddEdgeObjs(eObj0);



            eObj1.AddTriangle(tri);

            eObj1.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[V0]);

            eObj1.AddConnectedVertex(tObj);
            eObj1.AddConnectedVertex(_edgeGraph.TensileVertexObjects[V1]);
            tObj.AddEdgeObjs(eObj1);
            _edgeGraph.TensileVertexObjects[V1].AddEdgeObjs(eObj1);

            List <TensileEdge> SharedPointEdges = new List <TensileEdge>();

            foreach (var e in _edgeGraph.TensileEdgeObjects)
            {
                if (e.GetPositionToGrow().Count != 0)
                {
                    var P = e.GetPositionToGrow()[index];

                    if (P == _p && e != SE)
                    {
                        SharedPointEdges.Add(e);
                        var tp = e.PosToGrow(index);
                    }
                }
            }

            if (SharedPointEdges.Count != 0)
            {
                foreach (var e in SharedPointEdges)
                {
                    var _v0 = e.StartVertice;
                    var _v1 = e.EndVertice;
                    int _v2 = V;

                    e.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[V]);
                    TensileTriangle _tri = new TensileTriangle();

                    _tri.SetupTriangle(_v0, _v1, _v2, savedPositions);

                    e.AddTriangle(_tri);
                    _tri.addTensileEdgeObjs(e);

                    _tri.addTensileVertexObjs(_edgeGraph.TensileVertexObjects[_v0]);
                    _tri.addTensileVertexObjs(_edgeGraph.TensileVertexObjects[_v1]);
                    _tri.addTensileVertexObjs(_edgeGraph.TensileVertexObjects[_v2]);

                    TensileEdge ne;

                    List <TensileEdge> NearEdges = new List <TensileEdge>(2);

                    int NearEdgeCount = 0;

                    foreach (var ve in _edgeGraph.TensileVertexObjects[V].GetConnectedEdgeObjs())
                    {
                        if (ve.StartVertice == _v0 || ve.EndVertice == _v0)
                        {
                            NearEdgeCount++;
                            NearEdges.Add(ve);
                        }
                        else if (ve.StartVertice == _v1 || ve.EndVertice == _v1)
                        {
                            NearEdgeCount++;
                            NearEdges.Add(ve);
                        }
                    }

                    if (NearEdgeCount == 1)
                    {
                        foreach (var ve in _edgeGraph.TensileVertexObjects[V].GetConnectedEdgeObjs())
                        {
                            if (ve.StartVertice == _v0 || ve.EndVertice == _v0)
                            {
                                //NearEdgeCount++;
                                ne = ve;
                                ne.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v1]);
                                ne.AddTriangle(_tri);
                                _tri.addTensileEdgeObjs(ne);

                                var eObj2 = Instantiate(TGEdgePrefab, transform);
                                eObj2.SetBarHolder(BarsHolder);
                                eObj2.SetStrHolder(StringHolder);

                                eObj2.SetupStructure(Scale, DefState, _v1, _v2, savedPositions);
                                eObj2.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v0]);
                                _edgeGraph.edgeGraph.AddEdge(_v1, _v2);

                                eObj2.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v1]);
                                eObj2.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v2]);

                                eObj2.AddTriangle(_tri);
                                _tri.addTensileEdgeObjs(eObj2);

                                _edgeGraph.TensileEdgeObjects.Add(eObj2);

                                _edgeGraph.TensileVertexObjects[_v2].AddEdgeObjs(eObj2);
                                _edgeGraph.TensileVertexObjects[_v1].AddEdgeObjs(eObj2);
                                _edgeGraph.TensileVertexObjects[_v1].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_v2]);


                                break;
                            }
                            else if (ve.StartVertice == _v1 || ve.EndVertice == _v1)
                            {
                                // NearEdgeCount++;
                                ne = ve;
                                ne.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v0]);
                                ne.AddTriangle(_tri);
                                _tri.addTensileEdgeObjs(ne);


                                var eObj2 = Instantiate(TGEdgePrefab, transform);
                                eObj2.SetBarHolder(BarsHolder);
                                eObj2.SetStrHolder(StringHolder);

                                eObj2.SetupStructure(Scale, DefState, _v0, _v2, savedPositions);
                                eObj2.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v1]);
                                _edgeGraph.edgeGraph.AddEdge(_v0, _v2);

                                eObj2.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v0]);
                                eObj2.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v2]);

                                eObj2.AddTriangle(_tri);
                                _tri.addTensileEdgeObjs(eObj2);

                                _edgeGraph.TensileEdgeObjects.Add(eObj2);
                                _edgeGraph.TensileVertexObjects[_v2].AddEdgeObjs(eObj2);
                                _edgeGraph.TensileVertexObjects[_v0].AddEdgeObjs(eObj2);
                                _edgeGraph.TensileVertexObjects[_v0].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_v2]);

                                break;
                            }
                            else
                            {
                                continue;
                            }
                        }
                    }


                    if (NearEdgeCount == 0)
                    {
                        ne = Instantiate(TGEdgePrefab, transform);;
                        ne.SetBarHolder(BarsHolder);
                        ne.SetStrHolder(StringHolder);

                        ne.SetupStructure(Scale, DefState, _v1, _v2, savedPositions);
                        ne.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v0]);
                        _edgeGraph.edgeGraph.AddEdge(_v1, _v2);

                        ne.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v1]);
                        ne.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v2]);

                        ne.AddTriangle(_tri);
                        _tri.addTensileEdgeObjs(ne);

                        _edgeGraph.TensileEdgeObjects.Add(ne);
                        _edgeGraph.TensileVertexObjects[_v2].AddEdgeObjs(ne);
                        _edgeGraph.TensileVertexObjects[_v1].AddEdgeObjs(ne);


                        var eObj2 = Instantiate(TGEdgePrefab, transform);
                        eObj2.SetBarHolder(BarsHolder);
                        eObj2.SetStrHolder(StringHolder);

                        eObj2.SetupStructure(Scale, DefState, _v0, _v2, savedPositions);
                        eObj2.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v1]);
                        _edgeGraph.edgeGraph.AddEdge(_v0, _v2);

                        eObj2.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v0]);
                        eObj2.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_v2]);

                        eObj2.AddTriangle(_tri);
                        _tri.addTensileEdgeObjs(eObj2);

                        _edgeGraph.TensileEdgeObjects.Add(eObj2);
                        _edgeGraph.TensileVertexObjects[_v2].AddEdgeObjs(eObj2);
                        _edgeGraph.TensileVertexObjects[_v0].AddEdgeObjs(eObj2);

                        _edgeGraph.TensileVertexObjects[_v0].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_v2]);
                        _edgeGraph.TensileVertexObjects[_v1].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_v2]);
                    }

                    if (NearEdgeCount == 2)
                    {
                        NearEdges[0].AddTriangle(_tri);
                        NearEdges[1].AddTriangle(_tri);

                        NearEdges[0].AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v1]);
                        NearEdges[1].AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_v0]);

                        _tri.addTensileEdgeObjs(NearEdges[0]);
                        _tri.addTensileEdgeObjs(NearEdges[1]);

                        _edgeGraph.TensileVertexObjects[_v0].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_v2]);
                        _edgeGraph.TensileVertexObjects[_v1].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_v2]);
                    }
                }
            }
            if (_edgeGraph.TensileVertexObjects[V].GetConnectedEdgeObjs().Count() == 6)
            {
                List <TensileEdge> ToTriEdges = new List <TensileEdge>(2);
                foreach (var ce in _edgeGraph.TensileVertexObjects[V].GetConnectedEdgeObjs())
                {
                    if (ce.GetConnecetedTriangles().Count() == 1)
                    {
                        ToTriEdges.Add(ce);
                    }
                }

                int _vt0;
                int _vt1;

                if (ToTriEdges[0].StartVertice == V)
                {
                    _vt0 = ToTriEdges[0].EndVertice;
                }
                else
                {
                    _vt0 = ToTriEdges[0].StartVertice;
                }
                if (ToTriEdges[1].StartVertice == V)
                {
                    _vt1 = ToTriEdges[1].EndVertice;
                }
                else
                {
                    _vt1 = ToTriEdges[1].StartVertice;
                }

                TensileTriangle TT = new TensileTriangle();

                TT.SetupTriangle(_vt0, _vt1, V, savedPositions);

                ToTriEdges[0].AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_vt1]);
                ToTriEdges[1].AddDiagonalVertex(_edgeGraph.TensileVertexObjects[_vt0]);

                ToTriEdges[0].AddTriangle(TT);
                ToTriEdges[1].AddTriangle(TT);

                var te = Instantiate(TGEdgePrefab, transform);
                te.SetBarHolder(BarsHolder);
                te.SetStrHolder(StringHolder);

                te.SetupStructure(Scale, DefState, _vt0, _vt1, savedPositions);
                te.AddDiagonalVertex(_edgeGraph.TensileVertexObjects[V]);
                _edgeGraph.edgeGraph.AddEdge(_vt0, _vt1);

                te.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_vt0]);
                te.AddConnectedVertex(_edgeGraph.TensileVertexObjects[_vt1]);

                te.AddTriangle(TT);
                TT.addTensileEdgeObjs(te);

                _edgeGraph.TensileEdgeObjects.Add(te);
                _edgeGraph.TensileVertexObjects[_vt1].AddEdgeObjs(te);
                _edgeGraph.TensileVertexObjects[_vt0].AddEdgeObjs(te);

                _edgeGraph.TensileVertexObjects[_vt0].AddConnectedVertObjInLayer(_edgeGraph.TensileVertexObjects[_vt1]);
            }
        }
    }
    IEnumerable <TensileTriangle> CreateTriangle()
    {
        List <TensileTriangle> T = new List <TensileTriangle>();


        int xSize = SegmentCount - 1;
        int zSize = SegmentCount - 1;

        int[] triangleVerts = new int[xSize * zSize * 3 * LayerCount];
        for (int y = 0, ti = 0, vi = 0; y < LayerCount; y++, vi += 1)
        {
            for (int z = 0; z < zSize; z++, vi++)
            {
                for (int x = 0; x < xSize - z; x++, vi++)
                {
                    {
                        if (x < xSize - z - 1)
                        {
                            triangleVerts[ti]     = vi;
                            triangleVerts[ti + 1] = vi + xSize - z + 1;
                            triangleVerts[ti + 2] = vi + 1;
                            triangleVerts[ti + 3] = vi + 1;
                            triangleVerts[ti + 4] = vi + xSize - z + 1;
                            triangleVerts[ti + 5] = vi + xSize - z + 2;
                            ti += 6;
                        }
                        else
                        {
                            triangleVerts[ti]     = vi;
                            triangleVerts[ti + 1] = vi + xSize - z + 1;
                            triangleVerts[ti + 2] = vi + 1;
                            ti += 3;
                        }
                    }
                }
            }
        }

        TriangleVerts = triangleVerts;
        for (int i = 0; i < triangleVerts.Length; i += 3)
        {
            TensileTriangle Tri = new TensileTriangle();
            int             v0  = triangleVerts[i];
            int             v1  = triangleVerts[i + 1];
            int             v2  = triangleVerts[i + 2];

            //print(v0 + "," + v1 + "," + v2);

            Tri.SetupTriangle(v0, v1, v2, savedPositions);
            foreach (var te in Tri.GetTriEdges())
            {
                int S = te[0];
                int E = te[1];

                int D = Tri.GiveDiagonalVertice(S, E);

                Tri.addTensileEdgeObjs(EdgeObj2d[S, E]);
                EdgeObj2d[S, E].AddTriangle(Tri);
                EdgeObj2d[S, E].AddDiagonalVertex(_edgeGraph.TensileVertexObjects[D]);
            }
            T.Add(Tri);
        }
        return(T);
    }
Example #4
0
    IEnumerable <TensileTriangle> CreateTriangle()
    {
        List <TensileTriangle> T = new List <TensileTriangle>();


        int xSize = countX - 1;
        int zSize = countZ - 1;

        int[] triangles = new int[xSize * zSize * 6 * countY];
        for (int y = 0, ti = 0, vi = 0; y < countY; y++, vi += countX)
        {
            for (int z = 0; z < zSize; z++, vi++)
            {
                for (int x = 0; x < xSize; x++, ti += 6, vi++)
                {
                    if (z % 2 == 0)
                    {
                        //if (x < xSize - 1)
                        {
                            triangles[ti]     = vi;
                            triangles[ti + 3] = triangles[ti + 2] = vi + 1;
                            triangles[ti + 4] = triangles[ti + 1] = vi + xSize + 1;
                            triangles[ti + 5] = vi + xSize + 2;
                        }
                    }
                    else
                    {
                        triangles[ti]     = triangles[ti + 3] = vi;
                        triangles[ti + 1] = vi + xSize + 1;
                        triangles[ti + 2] = triangles[ti + 4] = vi + xSize + 2;
                        triangles[ti + 5] = vi + 1;
                    }
                }
            }
        }

        TriangleVerts = triangles;
        for (int i = 0; i < triangles.Length; i += 3)
        {
            TensileTriangle Tri = new TensileTriangle();
            int             v0  = triangles[i];
            int             v1  = triangles[i + 1];
            int             v2  = triangles[i + 2];

            //print(v0 + "," + v1 + "," + v2);

            Tri.SetupTriangle(v0, v1, v2, currentPositions);
            foreach (var te in Tri.GetTriEdges())
            {
                int S = te[0];
                int E = te[1];

                int D = Tri.GiveDiagonalVertice(S, E);

                Tri.addTensileEdgeObjs(EdgeObj2d[S, E]);
                EdgeObj2d[S, E].AddTriangle(Tri);
                EdgeObj2d[S, E].AddDiagonalVertex(_edgeGraph.TensileVertexObjects[D]);
            }
            T.Add(Tri);
        }
        return(T);
    }