Esempio n. 1
0
 public void AddEdge(TwoTriaMeshVertex other)
 {
     if (edges.Contains(other) == false)
     {
         edges.Add(other);
     }
 }
Esempio n. 2
0
    public override bool Equals(object obj)
    {
        if (obj.GetType() == typeof(TwoTriaMeshVertex))
        {
            TwoTriaMeshVertex other = (TwoTriaMeshVertex)obj;
            return(other.x == x && other.y == y);
        }

        return(false);
    }
Esempio n. 3
0
    public void FillMiddle(Vector2 startPoint)
    {
        fillRecMiddle((int)startPoint.x, (int)startPoint.y);

        for (int i = 0; i < activeTrianglesMiddle.GetLength(0); i++)
        {
            for (int j = 0; j < activeTrianglesMiddle.GetLength(1); j++)
            {
                if (activeTrianglesMiddle[i, j])
                {
                    int absX = i - translateX;
                    int absY = j - translateY;

                    TwoTriaMeshVertex vertex1;
                    TwoTriaMeshVertex vertex2;
                    TwoTriaMeshVertex vertex3;

                    // Upside down
                    if ((absX + absY) % 2 == 0)
                    {
                        vertex1 = new TwoTriaMeshVertex(absX, absY);
                        vertex2 = new TwoTriaMeshVertex(absX - 1, absY + 1);
                        vertex3 = new TwoTriaMeshVertex(absX + 1, absY + 1);
                    }
                    // Upright
                    else
                    {
                        vertex1 = new TwoTriaMeshVertex(absX - 1, absY);
                        vertex2 = new TwoTriaMeshVertex(absX + 1, absY);
                        vertex3 = new TwoTriaMeshVertex(absX, absY + 1);
                    }
                    vertex1.deg = 1;
                    vertex2.deg = 1;
                    vertex3.deg = 1;

                    bool v1Found = false;
                    for (int k = verticesInt.Count - 1; k >= 0; k--)
                    {
                        if (verticesInt[k] == vertex1)
                        {
                            verticesInt[k].deg++;
                            triangles.Add(k);
                            v1Found = true;
                            break;
                        }
                    }
                    if (!v1Found)
                    {
                        verticesInt.Add(vertex1);
                        triangles.Add(verticesInt.Count - 1);
                    }


                    bool v2Found = false;
                    for (int k = verticesInt.Count - 1; k >= 0; k--)
                    {
                        if (verticesInt[k] == vertex2)
                        {
                            verticesInt[k].deg++;
                            triangles.Add(k);
                            v2Found = true;
                            break;
                        }
                    }
                    if (!v2Found)
                    {
                        verticesInt.Add(vertex2);
                        triangles.Add(verticesInt.Count - 1);
                    }


                    bool v3Found = false;
                    for (int k = verticesInt.Count - 1; k >= 0; k--)
                    {
                        if (verticesInt[k] == vertex3)
                        {
                            verticesInt[k].deg++;
                            triangles.Add(k);
                            v3Found = true;
                            break;
                        }
                    }
                    if (!v3Found)
                    {
                        verticesInt.Add(vertex3);
                        triangles.Add(verticesInt.Count - 1);
                    }


                    verticesInt[triangles[triangles.Count - 1]].AddEdge(verticesInt[triangles[triangles.Count - 2]]);
                    verticesInt[triangles[triangles.Count - 1]].AddEdge(verticesInt[triangles[triangles.Count - 3]]);
                    verticesInt[triangles[triangles.Count - 2]].AddEdge(verticesInt[triangles[triangles.Count - 3]]);
                    verticesInt[triangles[triangles.Count - 2]].AddEdge(verticesInt[triangles[triangles.Count - 1]]);
                    verticesInt[triangles[triangles.Count - 3]].AddEdge(verticesInt[triangles[triangles.Count - 2]]);
                    verticesInt[triangles[triangles.Count - 3]].AddEdge(verticesInt[triangles[triangles.Count - 1]]);
                }
            }
        }

        List <int> outerFace         = new List <int>();
        List <int> outerFaceUnsorted = new List <int>();

        for (int i = 0; i < verticesInt.Count; i++)
        {
            if (verticesInt[i].deg < 6)
            {
                outerFaceUnsorted.Add(i);
            }
            vertices.Add(new Vector2(verticesInt[i].x, verticesInt[i].y - 0.5f));
        }

        outerFace.Add(outerFaceUnsorted[0]);
        for (int i = 1; i < outerFaceUnsorted.Count; i++)
        {
            for (int j = 0; j < outerFaceUnsorted.Count; j++)
            {
                if (outerFace.Contains(outerFaceUnsorted[j]) == false && verticesInt[outerFace[outerFace.Count - 1]].edges.Contains(verticesInt[outerFaceUnsorted[j]]))
                {
                    outerFace.Add(outerFaceUnsorted[j]);
                    break;
                }
            }
        }

        int leftPointsIndex = vertices.Count;

        for (int i = 0; i < leftPoints.Length; i++)
        {
            vertices.Add(leftPoints[i]);
        }
        int rightPointsIndex = vertices.Count;

        for (int i = 0; i < rightPoints.Length; i++)
        {
            vertices.Add(rightPoints[i]);
        }

        int   iPoints       = 0;
        int   iFace         = 0;
        float minDistance   = float.MaxValue;
        int   faceDirection = 1;

        for (int i = 0; i < outerFace.Count; i++)
        {
            if (Vector2.Distance(vertices[outerFace[i]], leftPoints[iPoints]) < minDistance)
            {
                iFace = i;
            }
        }
        int tempNextI = 1;

        if (Vector2.Distance(vertices[outerFace[(iFace + 1) % outerFace.Count]], leftPoints[tempNextI]) > Vector2.Distance(vertices[outerFace[(iFace - 1 < 0 ? outerFace.Count - 1 : iFace - 1)]], leftPoints[tempNextI]))
        {
            faceDirection = -1;
        }

        while (iPoints < leftPoints.Length)
        {
            int nextI    = (iPoints + 1) % leftPoints.Length;
            int nextFace = ((iFace + faceDirection) < 0 ? outerFace.Count - 1 : (iFace + faceDirection)) % outerFace.Count;

            float distanceFaceNext = Vector2.Distance(vertices[iPoints + leftPointsIndex], vertices[outerFace[nextFace]]);
            float distanceLeftNext = Vector2.Distance(vertices[nextI + leftPointsIndex], vertices[outerFace[iFace]]);

            if (distanceLeftNext < distanceFaceNext)
            {
                triangles.Add(iPoints + leftPointsIndex);
                triangles.Add(iFace);
                triangles.Add(nextI + leftPointsIndex);
                iPoints++;
            }
            else
            {
                triangles.Add(iFace);
                triangles.Add(iPoints + leftPointsIndex);
                triangles.Add(nextFace);
                iFace = ((iFace + faceDirection) < 0 ? outerFace.Count - 1 : (iFace + faceDirection)) % outerFace.Count;
            }
        }
    }