chore: refine code

master
uc-hoba 10 months ago
parent 3e61fb3eb8
commit 177b58944d
  1. 201
      Assets/Scripts/Editor/GeodesicMesh.cs

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