public void AddEdge(TwoTriaMeshVertex other) { if (edges.Contains(other) == false) { edges.Add(other); } }
public override bool Equals(object obj) { if (obj.GetType() == typeof(TwoTriaMeshVertex)) { TwoTriaMeshVertex other = (TwoTriaMeshVertex)obj; return(other.x == x && other.y == y); } return(false); }
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; } } }