diff --git a/Assets/Scripts/Editor/GeodesicMesh.cs b/Assets/Scripts/Editor/GeodesicMesh.cs index 773b2f0..304e7ad 100644 --- a/Assets/Scripts/Editor/GeodesicMesh.cs +++ b/Assets/Scripts/Editor/GeodesicMesh.cs @@ -30,44 +30,47 @@ namespace Metamesh //float PHI = (1 + Mathf.Sqrt(5f)) / 2; const float PHI = 1.618034f; + public PolyhedronData IDATA = new PolyhedronData( "icosahedron", "Regular", - new List { - new Vector3(0, PHI, -1), - new Vector3(-PHI, 1, 0), - new Vector3(-1, 0, -PHI), - new Vector3(1, 0, -PHI), - new Vector3(PHI, 1, 0), - new Vector3(0, PHI, 1), - new Vector3(-1, 0, PHI), - new Vector3(-PHI, -1, 0), - new Vector3(0, -PHI, -1), - new Vector3(PHI, -1, 0), - new Vector3(1, 0, PHI), - new Vector3(0, -PHI, 1), + new List + { + new Vector3(0, PHI, -1), + new Vector3(-PHI, 1, 0), + new Vector3(-1, 0, -PHI), + new Vector3(1, 0, -PHI), + new Vector3(PHI, 1, 0), + new Vector3(0, PHI, 1), + new Vector3(-1, 0, PHI), + new Vector3(-PHI, -1, 0), + new Vector3(0, -PHI, -1), + new Vector3(PHI, -1, 0), + new Vector3(1, 0, PHI), + new Vector3(0, -PHI, 1), }, - new List> { - new List {0, 2, 1}, - new List {0, 3, 2}, - new List {0, 4, 3}, - new List {0, 5, 4}, - new List {0, 1, 5}, - new List {7, 6, 1}, - new List {8, 7, 2}, - new List {9, 8, 3}, - new List {10, 9, 4}, - new List {6, 10, 5}, - new List {2, 7, 1}, - new List {3, 8, 2}, - new List {4, 9, 3}, - new List {5, 10, 4}, - new List {1, 6, 5}, - new List {11, 6, 7}, - new List {11, 7, 8}, - new List {11, 8, 9}, - new List {11, 9, 10}, - new List {11, 10, 6}, + new List> + { + new List { 0, 2, 1 }, + new List { 0, 3, 2 }, + new List { 0, 4, 3 }, + new List { 0, 5, 4 }, + new List { 0, 1, 5 }, + new List { 7, 6, 1 }, + new List { 8, 7, 2 }, + new List { 9, 8, 3 }, + new List { 10, 9, 4 }, + new List { 6, 10, 5 }, + new List { 2, 7, 1 }, + new List { 3, 8, 2 }, + new List { 4, 9, 3 }, + new List { 5, 10, 4 }, + new List { 1, 6, 5 }, + new List { 11, 6, 7 }, + new List { 11, 7, 8 }, + new List { 11, 8, 9 }, + new List { 11, 9, 10 }, + new List { 11, 10, 6 }, } ); @@ -78,11 +81,11 @@ namespace Metamesh { return b; } + return HighestCommonFactor(b, r); } - public void SetIndices() { var indexCount = 12; // 12 vertices already assigned @@ -96,6 +99,7 @@ namespace Metamesh { g = HighestCommonFactor(m, n); } + m1 = m / g; n1 = n / g; @@ -137,6 +141,7 @@ namespace Metamesh { vecToidx[idx] = vecToidx[idxR]; } + if (vDist[isoId][0] > 2) { closestTo[vecToidx[idx]] = new List { -vDist[isoId][0], vDist[isoId][1], vecToidx[idx] }; @@ -148,7 +153,8 @@ namespace Metamesh }; - this.IDATA.edgematch = new List<(int, string, int, string)> { + this.IDATA.edgematch = new List<(int, string, int, string)> + { (1, "B", 0, ""), (2, "B", 0, ""), (3, "B", 0, ""), @@ -261,11 +267,13 @@ namespace Metamesh vecToidx[idx] = indexCount++; if (vDist[isoId][0] > 2) { - closestTo[vecToidx[idx]] = new List { -vDist[isoId][0], vDist[isoId][1], vecToidx[idx] }; + closestTo[vecToidx[idx]] = new List + { -vDist[isoId][0], vDist[isoId][1], vecToidx[idx] }; } else { - closestTo[vecToidx[idx]] = new List { verts[vDist[isoId][0]], vDist[isoId][1], vecToidx[idx] }; + closestTo[vecToidx[idx]] = new List + { verts[vDist[isoId][0]], vDist[isoId][1], vecToidx[idx] }; } } } @@ -299,11 +307,14 @@ namespace Metamesh { if (x < this.max[y] && x < this.max[y + 1] + 1) { - this.innerFacets.Add(new List { "|" + x + "|" + y, "|" + x + "|" + (y + 1), "|" + (x + 1) + "|" + y }); + this.innerFacets.Add(new List + { "|" + x + "|" + y, "|" + x + "|" + (y + 1), "|" + (x + 1) + "|" + y }); } + if (y > 0 && x < this.max[y - 1] && x + 1 < this.max[y] + 1) { - this.innerFacets.Add(new List { "|" + x + "|" + y, "|" + (x + 1) + "|" + y, "|" + (x + 1) + "|" + (y - 1) }); + this.innerFacets.Add(new List + { "|" + x + "|" + y, "|" + (x + 1) + "|" + y, "|" + (x + 1) + "|" + (y - 1) }); } } } @@ -383,8 +394,10 @@ namespace Metamesh { point.RotateNeg120(this.m, this.n); } + temp.Add(point.Clone()); } + this.isoVecsOBOA.Add(temp); } } @@ -403,8 +416,10 @@ namespace Metamesh { point.Rotate120(this.m, this.n); } + temp.Add(point.Clone()); } + this.isoVecsBAOA.Add(temp); } } @@ -445,7 +460,6 @@ namespace Metamesh /**Creates a primary triangle * @internal */ - public PrimaryIsoTriangle Build(int m, int n) { var vertices = new List(); @@ -490,16 +504,11 @@ namespace Metamesh } } } + //order vertices by x and then y - vertices.Sort((a, b) => - { - return a.x - b.x; - }); + vertices.Sort((a, b) => { return a.x - b.x; }); - vertices.Sort((a, b) => - { - return a.y - b.y; - }); + vertices.Sort((a, b) => { return a.y - b.y; }); var min = Enumerable.Repeat(int.MaxValue, m + n + 1).ToList(); var max = Enumerable.Repeat(int.MinValue, m + n + 1).ToList(); @@ -524,14 +533,17 @@ namespace Metamesh { v.RotateNeg120(m, n); } + if (primVert == "B") { v.Rotate120(m, n); } + if (v.x < 0) { return v.y; } + return v.x + v.y; }; @@ -571,40 +583,32 @@ namespace Metamesh closest = 6; dist = distFromO[i]; } + if (distFromO[i] < distFromA[i] && distFromO[i] < distFromB[i]) { closest = 2; dist = distFromO[i]; } + if (distFromA[i] < distFromO[i] && distFromA[i] < distFromB[i]) { closest = 1; dist = distFromA[i]; } + if (distFromB[i] < distFromA[i] && distFromB[i] < distFromO[i]) { closest = 0; dist = distFromB[i]; } + vertData.Add(new List { closest, dist, vertices[i].x, vertices[i].y }); } - vertData.Sort((a, b) => - { - return a[2].CompareTo(b[2]); - }); - vertData.Sort((a, b) => - { - return a[3].CompareTo(b[3]); - }); - vertData.Sort((a, b) => - { - return a[1].CompareTo(b[1]); - }); - vertData.Sort((a, b) => - { - return a[0].CompareTo(b[0]); - }); + vertData.Sort((a, b) => { return a[2].CompareTo(b[2]); }); + vertData.Sort((a, b) => { return a[3].CompareTo(b[3]); }); + vertData.Sort((a, b) => { return a[1].CompareTo(b[1]); }); + vertData.Sort((a, b) => { return a[0].CompareTo(b[0]); }); for (var v = 0; v < vertData.Count; v++) { @@ -652,17 +656,16 @@ namespace Metamesh public int sharedNodes; public int poleNodes; - public GeodesicData( + private GeodesicData( string name, string category, List vertex, List> face ) : base(name, category, vertex, face) { - } - public void innerToData(int face, PrimaryIsoTriangle primTri) + private void InnerToData(int face, PrimaryIsoTriangle primTri) { for (var i = 0; i < primTri.innerFacets.Count; i++) { @@ -670,7 +673,7 @@ namespace Metamesh } } - public void MapABOBtoDATA(int faceNb, PrimaryIsoTriangle primTri) + private void MapABOBtoDATA(int faceNb, PrimaryIsoTriangle primTri) { var fr = primTri.IDATA.edgematch[faceNb].Item1; for (var i = 0; i < primTri.isoVecsABOB.Count; i++) @@ -687,13 +690,13 @@ namespace Metamesh temp.Add(fr + "|" + primTri.isoVecsABOB[i][j].x + "|" + primTri.isoVecsABOB[i][j].y); } } - this.face.Add(new List { primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); + + this.face.Add(new List + { primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); } } - /** - * @internal - */ - public void MapOBOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) + + private void MapOBOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) { var fr = primTri.IDATA.edgematch[faceNb].Item1; for (var i = 0; i < primTri.isoVecsOBOA.Count; i++) @@ -710,13 +713,13 @@ namespace Metamesh temp.Add(fr + "|" + primTri.isoVecsOBOA[i][j].x + "|" + primTri.isoVecsOBOA[i][j].y); } } - this.face.Add(new List { primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); + + this.face.Add(new List + { primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); } } - /** - * @internal - */ - public void MapBAOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) + + private void MapBAOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) { var fr = primTri.IDATA.edgematch[faceNb].Item3; for (var i = 0; i < primTri.isoVecsBAOA.Count; i++) @@ -733,19 +736,20 @@ namespace Metamesh temp.Add(fr + "|" + primTri.isoVecsBAOA[i][j].x + "|" + primTri.isoVecsBAOA[i][j].y); } } - this.face.Add(new List { primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); + + this.face.Add(new List + { primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); } } - /** - * @internal - */ - public void OrderData(PrimaryIsoTriangle primTri) + + private void OrderData(PrimaryIsoTriangle primTri) { var nearTo = new Dictionary>>(); for (var i = 0; i < 13; i++) { nearTo[i] = new List>(); } + var close = primTri.closestTo; for (var i = 0; i < close.Count; i++) { @@ -761,6 +765,7 @@ namespace Metamesh nearTo[12].Add(new List { i, close[i][0] }); } } + /* var near = new List(); for (var i = 0; i < 12; i++) @@ -772,10 +777,7 @@ namespace Metamesh var nearIndex = 12; for (var i = 0; i < 12; i++) { - nearTo[i].Sort((a, b) => - { - return a[1] - b[1]; - }); + nearTo[i].Sort((a, b) => { return a[1] - b[1]; }); /* for (var j = 0; j < nearTo[i].Count; j++) { @@ -787,6 +789,7 @@ namespace Metamesh near[item[0]] = nearIndex++; } } + /* for (var j = 0; j < nearTo[12].Count; j++) { @@ -797,6 +800,7 @@ namespace Metamesh { near[item[0]] = nearIndex++; } + /* for (var i = 0; i < this.vertex.Count; i++) { @@ -833,7 +837,7 @@ namespace Metamesh this.poleNodes = this.vertex.Count - this.sharedNodes; } - public List SetOrder(int m, List faces) + private List SetOrder(int m, List faces) { var adjVerts = new List(); var dualFaces = new List(); @@ -863,13 +867,15 @@ namespace Metamesh f++; } } + this.adjacentFaces.Add(adjVerts); return dualFaces; } public PolyhedronData ToGoldbergPolyhedronData() { - var goldbergPolyhedronData = new PolyhedronData("GeoDual", "Goldberg", new List(), new List>()); + var goldbergPolyhedronData = + new PolyhedronData("GeoDual", "Goldberg", new List(), new List>()); goldbergPolyhedronData.name = "GD dual"; var verticesNb = this.vertex.Count; var map = new List[verticesNb]; @@ -877,6 +883,7 @@ namespace Metamesh { map[v] = new List(); } + for (var f = 0; f < this.face.Count; f++) { for (var i = 0; i < 3; i++) @@ -884,6 +891,7 @@ namespace Metamesh map[this.face[f][i]].Add(f); } } + float cx; float cy; float cz; @@ -901,6 +909,7 @@ namespace Metamesh { goldbergPolyhedronData.face[m] = tempFace; } + foreach (var el in map[m]) { cx = 0; @@ -925,8 +934,10 @@ namespace Metamesh goldbergPolyhedronData.vertex[el] = tempVertex; } } + ; } + return goldbergPolyhedronData; } @@ -936,7 +947,8 @@ namespace Metamesh var geodesicData = new GeodesicData( "Geodesic-m-n", "Geodesic", - new List() { + new List() + { new Vector3(0, PHI, -1), new Vector3(-PHI, 1, 0), new Vector3(-1, 0, -PHI), @@ -963,15 +975,17 @@ namespace Metamesh for (var f = 0; f < primTri.IDATA.face.Count; f++) { primTri.MapToFace(f, geodesicData); - geodesicData.innerToData(f, primTri); + geodesicData.InnerToData(f, primTri); if (primTri.IDATA.edgematch[f].Item2 == "B") { geodesicData.MapABOBtoDATA(f, primTri); } + if (primTri.IDATA.edgematch[f].Item2 == "O") { geodesicData.MapOBOAtoDATA(f, primTri); } + if (primTri.IDATA.edgematch[f].Item4 == "A") { geodesicData.MapBAOAtoDATA(f, primTri); @@ -995,5 +1009,4 @@ namespace Metamesh return geodesicData; } } - -} +} \ No newline at end of file