|
|
|
@ -34,20 +34,20 @@ namespace Metamesh |
|
|
|
public PolyhedronData IDATA = new PolyhedronData( |
|
|
|
public PolyhedronData IDATA = new PolyhedronData( |
|
|
|
"icosahedron", |
|
|
|
"icosahedron", |
|
|
|
"Regular", |
|
|
|
"Regular", |
|
|
|
new List<Vector3> |
|
|
|
new Dictionary<int, Vector3> |
|
|
|
{ |
|
|
|
{ |
|
|
|
new Vector3(0, PHI, -1), |
|
|
|
{0,new Vector3(0, PHI, -1)}, |
|
|
|
new Vector3(-PHI, 1, 0), |
|
|
|
{1,new Vector3(-PHI, 1, 0)}, |
|
|
|
new Vector3(-1, 0, -PHI), |
|
|
|
{2,new Vector3(-1, 0, -PHI)}, |
|
|
|
new Vector3(1, 0, -PHI), |
|
|
|
{3,new Vector3(1, 0, -PHI)}, |
|
|
|
new Vector3(PHI, 1, 0), |
|
|
|
{4,new Vector3(PHI, 1, 0)}, |
|
|
|
new Vector3(0, PHI, 1), |
|
|
|
{5,new Vector3(0, PHI, 1)}, |
|
|
|
new Vector3(-1, 0, PHI), |
|
|
|
{6,new Vector3(-1, 0, PHI)}, |
|
|
|
new Vector3(-PHI, -1, 0), |
|
|
|
{7,new Vector3(-PHI, -1, 0)}, |
|
|
|
new Vector3(0, -PHI, -1), |
|
|
|
{8,new Vector3(0, -PHI, -1)}, |
|
|
|
new Vector3(PHI, -1, 0), |
|
|
|
{9,new Vector3(PHI, -1, 0)}, |
|
|
|
new Vector3(1, 0, PHI), |
|
|
|
{10,new Vector3(1, 0, PHI)}, |
|
|
|
new Vector3(0, -PHI, 1), |
|
|
|
{11,new Vector3(0, -PHI, 1)}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
new List<List<int>> |
|
|
|
new List<List<int>> |
|
|
|
{ |
|
|
|
{ |
|
|
|
@ -464,12 +464,10 @@ namespace Metamesh |
|
|
|
var tempVec = x * this.cartesian[i].x + y * this.cartesian[i].y + O; |
|
|
|
var tempVec = x * this.cartesian[i].x + y * this.cartesian[i].y + O; |
|
|
|
//mapped[i] = tempVec; |
|
|
|
//mapped[i] = tempVec; |
|
|
|
idx = faceNb + "|" + this.vertices[i].x + "|" + this.vertices[i].y; |
|
|
|
idx = faceNb + "|" + this.vertices[i].x + "|" + this.vertices[i].y; |
|
|
|
while (this.vecToidx[idx] >= geodesicData.vertex.Count) |
|
|
|
|
|
|
|
geodesicData.vertex.Add(Vector3.zero); |
|
|
|
|
|
|
|
geodesicData.vertex[this.vecToidx[idx]] = tempVec; |
|
|
|
geodesicData.vertex[this.vecToidx[idx]] = tempVec; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public PrimaryIsoTriangle Build(int m, int n) |
|
|
|
public PrimaryIsoTriangle Build(int m, int n) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var vertices = new List<Vector2Int>(); |
|
|
|
var vertices = new List<Vector2Int>(); |
|
|
|
@ -641,14 +639,14 @@ namespace Metamesh |
|
|
|
{ |
|
|
|
{ |
|
|
|
public string name; |
|
|
|
public string name; |
|
|
|
public string category; |
|
|
|
public string category; |
|
|
|
public List<Vector3> vertex; |
|
|
|
public Dictionary<int, Vector3> vertex; |
|
|
|
public List<List<int>> face; |
|
|
|
public List<List<int>> face; |
|
|
|
public List<(int, string, int, string)> edgematch; |
|
|
|
public List<(int, string, int, string)> edgematch; |
|
|
|
|
|
|
|
|
|
|
|
public PolyhedronData( |
|
|
|
public PolyhedronData( |
|
|
|
string name, |
|
|
|
string name, |
|
|
|
string category, |
|
|
|
string category, |
|
|
|
List<Vector3> vertex, |
|
|
|
Dictionary<int, Vector3> vertex, |
|
|
|
List<List<int>> face |
|
|
|
List<List<int>> face |
|
|
|
) |
|
|
|
) |
|
|
|
{ |
|
|
|
{ |
|
|
|
@ -669,7 +667,7 @@ namespace Metamesh |
|
|
|
private GeodesicData( |
|
|
|
private GeodesicData( |
|
|
|
string name, |
|
|
|
string name, |
|
|
|
string category, |
|
|
|
string category, |
|
|
|
List<Vector3> vertex, |
|
|
|
Dictionary<int, Vector3> vertex, |
|
|
|
List<List<int>> face |
|
|
|
List<List<int>> face |
|
|
|
) : base(name, category, vertex, face) |
|
|
|
) : base(name, category, vertex, face) |
|
|
|
{ |
|
|
|
{ |
|
|
|
@ -705,7 +703,7 @@ namespace Metamesh |
|
|
|
{ primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); |
|
|
|
{ primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void MapOBOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) |
|
|
|
private void MapOBOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var fr = primTri.IDATA.edgematch[faceNb].Item1; |
|
|
|
var fr = primTri.IDATA.edgematch[faceNb].Item1; |
|
|
|
@ -728,7 +726,7 @@ namespace Metamesh |
|
|
|
{ primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); |
|
|
|
{ primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void MapBAOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) |
|
|
|
private void MapBAOAtoDATA(int faceNb, PrimaryIsoTriangle primTri) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var fr = primTri.IDATA.edgematch[faceNb].Item3; |
|
|
|
var fr = primTri.IDATA.edgematch[faceNb].Item3; |
|
|
|
@ -751,7 +749,7 @@ namespace Metamesh |
|
|
|
{ primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); |
|
|
|
{ primTri.vecToidx[temp[0]], primTri.vecToidx[temp[1]], primTri.vecToidx[temp[2]] }); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void OrderData(PrimaryIsoTriangle primTri) |
|
|
|
private void OrderData(PrimaryIsoTriangle primTri) |
|
|
|
{ |
|
|
|
{ |
|
|
|
var nearTo = new Dictionary<int, List<List<int>>>(); |
|
|
|
var nearTo = new Dictionary<int, List<List<int>>>(); |
|
|
|
@ -775,30 +773,42 @@ namespace Metamesh |
|
|
|
nearTo[12].Add(new List<int> { i, close[i][0] }); |
|
|
|
nearTo[12].Add(new List<int> { i, close[i][0] }); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//var near = Enumerable.Range(0, 12).ToList(); |
|
|
|
//var near = Enumerable.Range(0, 12).ToList(); |
|
|
|
var near = Enumerable.Range(0, 12).ToDictionary(i => i); |
|
|
|
var near = Enumerable.Range(0, 12).ToDictionary(i => i); |
|
|
|
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) => { return a[1].CompareTo(b[1]); }); |
|
|
|
nearTo[i].Sort((a, b) => { return a[1].CompareTo(b[1]); }); |
|
|
|
|
|
|
|
|
|
|
|
foreach (var item in nearTo[i]) |
|
|
|
foreach (var item in nearTo[i]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
near[item[0]] = nearIndex++; |
|
|
|
near[item[0]] = nearIndex++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
foreach (var item in nearTo[12]) |
|
|
|
foreach (var item in nearTo[12]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
near[item[0]] = nearIndex++; |
|
|
|
near[item[0]] = nearIndex++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// TODO |
|
|
|
|
|
|
|
/* |
|
|
|
this.vertex = this.vertex |
|
|
|
this.vertex = this.vertex |
|
|
|
.Select((v, i) => (Vertex: v, SortKey: near[i])) |
|
|
|
.Select((v, i) => (Vertex: v, SortKey: near[i])) |
|
|
|
.OrderBy(x => x.SortKey) |
|
|
|
.OrderBy(x => x.SortKey) |
|
|
|
.Select(x => x.Vertex) |
|
|
|
.Select(x => x.Vertex) |
|
|
|
.ToList(); |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
var values = this.vertex.Values |
|
|
|
|
|
|
|
.Select((v, i) => (Vertex: v, SortKey: near[i])) |
|
|
|
|
|
|
|
.OrderBy(x => x.SortKey) |
|
|
|
|
|
|
|
.Select(x => x.Vertex) |
|
|
|
|
|
|
|
.ToArray(); |
|
|
|
|
|
|
|
var keys = this.vertex.Keys.ToArray(); |
|
|
|
|
|
|
|
for (int i = 0; i < keys.Length; ++i) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
this.vertex[keys[i]] = values[i]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < this.face.Count; i++) |
|
|
|
for (var i = 0; i < this.face.Count; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
@ -850,7 +860,7 @@ namespace Metamesh |
|
|
|
public PolyhedronData ToGoldbergPolyhedronData() |
|
|
|
public PolyhedronData ToGoldbergPolyhedronData() |
|
|
|
{ |
|
|
|
{ |
|
|
|
var goldbergPolyhedronData = |
|
|
|
var goldbergPolyhedronData = |
|
|
|
new PolyhedronData("GeoDual", "Goldberg", new List<Vector3>(), new List<List<int>>()); |
|
|
|
new PolyhedronData("GeoDual", "Goldberg", new Dictionary<int, 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]; |
|
|
|
@ -901,17 +911,7 @@ namespace Metamesh |
|
|
|
cz += vertex.z; |
|
|
|
cz += vertex.z; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var tempVertex = new Vector3(cx / 3, cy / 3, cz / 3); |
|
|
|
goldbergPolyhedronData.vertex[el] = new Vector3(cx / 3, cy / 3, cz / 3); |
|
|
|
if (goldbergPolyhedronData.vertex.Count <= el) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (goldbergPolyhedronData.face.Count != el) |
|
|
|
|
|
|
|
Debug.Log($"goldbergPolyhedronData.face.Count != el: {goldbergPolyhedronData.face.Count} != {el}"); |
|
|
|
|
|
|
|
goldbergPolyhedronData.vertex.Add(tempVertex); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
goldbergPolyhedronData.vertex[el] = tempVertex; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
; |
|
|
|
@ -926,20 +926,20 @@ namespace Metamesh |
|
|
|
var geodesicData = new GeodesicData( |
|
|
|
var geodesicData = new GeodesicData( |
|
|
|
"Geodesic-m-n", |
|
|
|
"Geodesic-m-n", |
|
|
|
"Geodesic", |
|
|
|
"Geodesic", |
|
|
|
new List<Vector3>() |
|
|
|
new Dictionary<int, Vector3>() |
|
|
|
{ |
|
|
|
{ |
|
|
|
new Vector3(0, PHI, -1), |
|
|
|
{0, new Vector3(0, PHI, -1)}, |
|
|
|
new Vector3(-PHI, 1, 0), |
|
|
|
{1,new Vector3(-PHI, 1, 0)}, |
|
|
|
new Vector3(-1, 0, -PHI), |
|
|
|
{2,new Vector3(-1, 0, -PHI)}, |
|
|
|
new Vector3(1, 0, -PHI), |
|
|
|
{3,new Vector3(1, 0, -PHI)}, |
|
|
|
new Vector3(PHI, 1, 0), |
|
|
|
{4,new Vector3(PHI, 1, 0)}, |
|
|
|
new Vector3(0, PHI, 1), |
|
|
|
{5,new Vector3(0, PHI, 1)}, |
|
|
|
new Vector3(-1, 0, PHI), |
|
|
|
{6,new Vector3(-1, 0, PHI)}, |
|
|
|
new Vector3(-PHI, -1, 0), |
|
|
|
{7,new Vector3(-PHI, -1, 0)}, |
|
|
|
new Vector3(0, -PHI, -1), |
|
|
|
{8,new Vector3(0, -PHI, -1)}, |
|
|
|
new Vector3(PHI, -1, 0), |
|
|
|
{9,new Vector3(PHI, -1, 0)}, |
|
|
|
new Vector3(1, 0, PHI), |
|
|
|
{10,new Vector3(1, 0, PHI)}, |
|
|
|
new Vector3(0, -PHI, 1), |
|
|
|
{11,new Vector3(0, -PHI, 1)}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
new List<List<int>>() |
|
|
|
new List<List<int>>() |
|
|
|
); |
|
|
|
); |
|
|
|
@ -973,17 +973,12 @@ namespace Metamesh |
|
|
|
|
|
|
|
|
|
|
|
geodesicData.OrderData(primTri); |
|
|
|
geodesicData.OrderData(primTri); |
|
|
|
var radius = 1f; |
|
|
|
var radius = 1f; |
|
|
|
geodesicData.vertex = geodesicData.vertex.Select((el) => |
|
|
|
var keys = geodesicData.vertex.Keys.ToArray(); |
|
|
|
{ |
|
|
|
foreach (var key in keys) |
|
|
|
var a = el.x; |
|
|
|
{ |
|
|
|
var b = el.y; |
|
|
|
var el = geodesicData.vertex[key]; |
|
|
|
var c = el.z; |
|
|
|
geodesicData.vertex[key] = el * radius / el.magnitude; |
|
|
|
var d = Mathf.Sqrt(a * a + b * b + c * c); |
|
|
|
} |
|
|
|
//el[0] *= radius / d; |
|
|
|
|
|
|
|
//el[1] *= radius / d; |
|
|
|
|
|
|
|
//el[2] *= radius / d; |
|
|
|
|
|
|
|
return el * radius / d; |
|
|
|
|
|
|
|
}).ToList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return geodesicData; |
|
|
|
return geodesicData; |
|
|
|
} |
|
|
|
} |