//正八面体を生成 private void SetOctahedron(float length) { Face3D.Clear(); Dual.Clear(); Vector3D[] Vtemp = new Vector3D[6]; osPolygon Ptemp; for (int i = 0; i < 6; i++) Vtemp[i] = new Vector3D(); Vtemp[0].Set(0.0f, 0.0f, length / (float)Math.Sqrt(2.0)); Vtemp[1].Set(length / 2, length / 2, 0.0f); Vtemp[2].Set(-length / 2, length / 2, 0.0f); Vtemp[3].Set(-length / 2, -length / 2, 0.0f); Vtemp[4].Set(length / 2, -length / 2, 0.0f); Vtemp[5].Set(0.0f, 0.0f, -length / (float)Math.Sqrt(2.0)); Ptemp = new osPolygon(0); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[2]); Face3D.Add(Ptemp); Ptemp = new osPolygon(1); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[3]); Face3D.Add(Ptemp); Ptemp = new osPolygon(2); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[4]); Face3D.Add(Ptemp); Ptemp = new osPolygon(3); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[1]); Face3D.Add(Ptemp); Ptemp = new osPolygon(4); Ptemp.AddVertex(Vtemp[5]); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[1]); Face3D.Add(Ptemp); Ptemp = new osPolygon(5); Ptemp.AddVertex(Vtemp[5]); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[2]); Face3D.Add(Ptemp); Ptemp = new osPolygon(6); Ptemp.AddVertex(Vtemp[5]); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[3]); Face3D.Add(Ptemp); Ptemp = new osPolygon(7); Ptemp.AddVertex(Vtemp[5]); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[4]); Face3D.Add(Ptemp); List<Vector3D> temp = new List<Vector3D>(); for (int i = 0; i < Face3D.Count; i++) { Face3D[i].SetCenter(); temp.Add(Face3D[i].center); } for (int i = 0; i < temp.Count; i++) Dual.Add(new Vertex(temp[i].X, temp[i].Y, temp[i].Z)); Dual[0].SetNeighbor(Dual[4]); Dual[0].SetNeighbor(Dual[1]); Dual[0].SetNeighbor(Dual[3]); Dual[1].SetNeighbor(Dual[5]); Dual[1].SetNeighbor(Dual[0]); Dual[1].SetNeighbor(Dual[2]); Dual[2].SetNeighbor(Dual[6]); Dual[2].SetNeighbor(Dual[1]); Dual[2].SetNeighbor(Dual[3]); Dual[3].SetNeighbor(Dual[7]); Dual[3].SetNeighbor(Dual[0]); Dual[3].SetNeighbor(Dual[2]); Dual[4].SetNeighbor(Dual[0]); Dual[4].SetNeighbor(Dual[5]); Dual[4].SetNeighbor(Dual[7]); Dual[5].SetNeighbor(Dual[1]); Dual[5].SetNeighbor(Dual[4]); Dual[5].SetNeighbor(Dual[6]); Dual[6].SetNeighbor(Dual[2]); Dual[6].SetNeighbor(Dual[5]); Dual[6].SetNeighbor(Dual[7]); Dual[7].SetNeighbor(Dual[3]); Dual[7].SetNeighbor(Dual[4]); Dual[7].SetNeighbor(Dual[6]); }
//正二十面体を生成 private void SetIcosahedron(float length) { Face3D.Clear(); Dual.Clear(); Vector3D[] Vtemp = new Vector3D[12]; osPolygon Ptemp; Vector2D temp1 = new Vector2D(); double Ztemp1, Ztemp2; for (int i = 0; i < 12; i++) Vtemp[i] = new Vector3D(); Ztemp1 = (length / (2.0 * Math.Sin(Math.PI / 5.0))); Ztemp1 = Math.Sqrt(length * length - Ztemp1 * Ztemp1); Ztemp2 = Math.Sqrt((length * Math.Cos(Math.PI / 6.0)) * (length * Math.Cos(Math.PI / 6.0)) - (length / (2 * Math.Sin(Math.PI / 5.0)) - length / (2 * Math.Tan(Math.PI / 5.0))) * (length / (2 * Math.Sin(Math.PI / 5.0)) - length / (2 * Math.Tan(Math.PI / 5.0)))); Ztemp2 /= 2.0; Vtemp[0].Set((float)(length / (2 * Math.Sin(Math.PI / 5))), 0.0f, (float)Ztemp2); for (int i = 1; i < 5; i++) { temp1.X = (float)(Vtemp[0].X * Math.Cos(2 * i * Math.PI / 5.0) - Vtemp[0].Y * Math.Sin(2 * i * Math.PI / 5.0)); temp1.Y = (float)(Vtemp[0].X * Math.Sin(2 * i * Math.PI / 5.0) + Vtemp[0].Y * Math.Cos(2 * i * Math.PI / 5.0)); Vtemp[i].Set(temp1.X, temp1.Y, (float)Ztemp2); } Vtemp[5].Set(0.0f, 0.0f, (float)(Ztemp1 + Ztemp2)); Vtemp[6].Set((float)(length / (2 * Math.Sin(Math.PI / 5))), 0.0f, -(float)Ztemp2); temp1.X = (float)(Vtemp[6].X * Math.Cos(Math.PI / 5.0) - Vtemp[6].Y * Math.Sin(Math.PI / 5.0)); temp1.Y = (float)(Vtemp[6].X * Math.Sin(Math.PI / 5.0) + Vtemp[6].Y * Math.Cos(Math.PI / 5.0)); Vtemp[6].Set(temp1.X, temp1.Y, -(float)Ztemp2); for (int i = 7; i < 11; i++) { temp1.X = (float)(Vtemp[6].X * Math.Cos(2 * (i - 6) * Math.PI / 5) - Vtemp[6].Y * Math.Sin(2 * (i - 6) * Math.PI / 5)); temp1.Y = (float)(Vtemp[6].X * Math.Sin(2 * (i - 6) * Math.PI / 5) + Vtemp[6].Y * Math.Cos(2 * (i - 6) * Math.PI / 5)); Vtemp[i].Set(temp1.X, temp1.Y, -(float)Ztemp2); } Vtemp[11].Set(0.0f, 0.0f, -(float)(Ztemp1 + Ztemp2)); Ptemp = new osPolygon(0); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[5]); Face3D.Add(Ptemp); Ptemp = new osPolygon(1); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[5]); Face3D.Add(Ptemp); Ptemp = new osPolygon(2); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[5]); Face3D.Add(Ptemp); Ptemp = new osPolygon(3); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[5]); Face3D.Add(Ptemp); Ptemp = new osPolygon(4); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[5]); Face3D.Add(Ptemp); Ptemp = new osPolygon(5); Ptemp.AddVertex(Vtemp[7]); Ptemp.AddVertex(Vtemp[6]); Ptemp.AddVertex(Vtemp[11]); Face3D.Add(Ptemp); Ptemp = new osPolygon(6); Ptemp.AddVertex(Vtemp[8]); Ptemp.AddVertex(Vtemp[7]); Ptemp.AddVertex(Vtemp[11]); Face3D.Add(Ptemp); Ptemp = new osPolygon(7); Ptemp.AddVertex(Vtemp[9]); Ptemp.AddVertex(Vtemp[8]); Ptemp.AddVertex(Vtemp[11]); Face3D.Add(Ptemp); Ptemp = new osPolygon(8); Ptemp.AddVertex(Vtemp[10]); Ptemp.AddVertex(Vtemp[9]); Ptemp.AddVertex(Vtemp[11]); Face3D.Add(Ptemp); Ptemp = new osPolygon(9); Ptemp.AddVertex(Vtemp[6]); Ptemp.AddVertex(Vtemp[10]); Ptemp.AddVertex(Vtemp[11]); Face3D.Add(Ptemp); Ptemp = new osPolygon(10); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[6]); Face3D.Add(Ptemp); Ptemp = new osPolygon(11); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[6]); Ptemp.AddVertex(Vtemp[7]); Face3D.Add(Ptemp); Ptemp = new osPolygon(12); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[7]); Face3D.Add(Ptemp); Ptemp = new osPolygon(13); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[7]); Ptemp.AddVertex(Vtemp[8]); Face3D.Add(Ptemp); Ptemp = new osPolygon(14); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[8]); Face3D.Add(Ptemp); Ptemp = new osPolygon(15); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[8]); Ptemp.AddVertex(Vtemp[9]); Face3D.Add(Ptemp); Ptemp = new osPolygon(16); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[9]); Face3D.Add(Ptemp); Ptemp = new osPolygon(17); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[9]); Ptemp.AddVertex(Vtemp[10]); Face3D.Add(Ptemp); Ptemp = new osPolygon(18); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[4]); Ptemp.AddVertex(Vtemp[10]); Face3D.Add(Ptemp); Ptemp = new osPolygon(19); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[10]); Ptemp.AddVertex(Vtemp[6]); Face3D.Add(Ptemp); List<Vector3D> temp = new List<Vector3D>(); for (int i = 0; i < Face3D.Count; i++) { Face3D[i].SetCenter(); temp.Add(Face3D[i].center); } for (int i = 0; i < temp.Count; i++) Dual.Add(new Vertex(temp[i].X, temp[i].Y, temp[i].Z)); Dual[0].SetNeighbor(Dual[1]); Dual[0].SetNeighbor(Dual[4]); Dual[0].SetNeighbor(Dual[10]); Dual[1].SetNeighbor(Dual[0]); Dual[1].SetNeighbor(Dual[2]); Dual[1].SetNeighbor(Dual[12]); Dual[2].SetNeighbor(Dual[1]); Dual[2].SetNeighbor(Dual[3]); Dual[2].SetNeighbor(Dual[14]); Dual[3].SetNeighbor(Dual[2]); Dual[3].SetNeighbor(Dual[4]); Dual[3].SetNeighbor(Dual[16]); Dual[4].SetNeighbor(Dual[3]); Dual[4].SetNeighbor(Dual[0]); Dual[4].SetNeighbor(Dual[18]); Dual[5].SetNeighbor(Dual[9]); Dual[5].SetNeighbor(Dual[6]); Dual[5].SetNeighbor(Dual[11]); Dual[6].SetNeighbor(Dual[5]); Dual[6].SetNeighbor(Dual[7]); Dual[6].SetNeighbor(Dual[13]); Dual[7].SetNeighbor(Dual[6]); Dual[7].SetNeighbor(Dual[8]); Dual[7].SetNeighbor(Dual[15]); Dual[8].SetNeighbor(Dual[7]); Dual[8].SetNeighbor(Dual[9]); Dual[8].SetNeighbor(Dual[17]); Dual[9].SetNeighbor(Dual[8]); Dual[9].SetNeighbor(Dual[5]); Dual[9].SetNeighbor(Dual[19]); Dual[10].SetNeighbor(Dual[0]); Dual[10].SetNeighbor(Dual[11]); Dual[10].SetNeighbor(Dual[19]); Dual[11].SetNeighbor(Dual[5]); Dual[11].SetNeighbor(Dual[10]); Dual[11].SetNeighbor(Dual[12]); Dual[12].SetNeighbor(Dual[1]); Dual[12].SetNeighbor(Dual[11]); Dual[12].SetNeighbor(Dual[13]); Dual[13].SetNeighbor(Dual[6]); Dual[13].SetNeighbor(Dual[12]); Dual[13].SetNeighbor(Dual[14]); Dual[14].SetNeighbor(Dual[2]); Dual[14].SetNeighbor(Dual[13]); Dual[14].SetNeighbor(Dual[15]); Dual[15].SetNeighbor(Dual[7]); Dual[15].SetNeighbor(Dual[14]); Dual[15].SetNeighbor(Dual[16]); Dual[16].SetNeighbor(Dual[3]); Dual[16].SetNeighbor(Dual[15]); Dual[16].SetNeighbor(Dual[17]); Dual[17].SetNeighbor(Dual[8]); Dual[17].SetNeighbor(Dual[16]); Dual[17].SetNeighbor(Dual[18]); Dual[18].SetNeighbor(Dual[4]); Dual[18].SetNeighbor(Dual[17]); Dual[18].SetNeighbor(Dual[19]); Dual[19].SetNeighbor(Dual[9]); Dual[19].SetNeighbor(Dual[18]); Dual[19].SetNeighbor(Dual[10]); }
//切頂二十面体を生成 private void SetTruncatedIcosahedron(float length) { SetIcosahedron(length); Dual.Clear(); List<Vector3D> temp = new List<Vector3D>(); Vector3D temp1 = new Vector3D(); Vector3D temp2 = new Vector3D(); Vector3D[] Vtemp = new Vector3D[12]; osPolygon Ptemp; Vtemp[0] = new Vector3D(Face3D[0].GetVertex(2)); Vtemp[1] = new Vector3D(Face3D[0].GetVertex(0)); Vtemp[2] = new Vector3D(Face3D[1].GetVertex(0)); Vtemp[3] = new Vector3D(Face3D[2].GetVertex(0)); Vtemp[4] = new Vector3D(Face3D[3].GetVertex(0)); Vtemp[5] = new Vector3D(Face3D[4].GetVertex(0)); Vtemp[6] = new Vector3D(Face3D[5].GetVertex(2)); Vtemp[7] = new Vector3D(Face3D[5].GetVertex(1)); Vtemp[8] = new Vector3D(Face3D[6].GetVertex(1)); Vtemp[9] = new Vector3D(Face3D[7].GetVertex(1)); Vtemp[10] = new Vector3D(Face3D[8].GetVertex(1)); Vtemp[11] = new Vector3D(Face3D[9].GetVertex(1)); Ptemp = new osPolygon(20); for (int i = 0; i < 5; i++) { temp1 = (2 * Face3D[i].GetVertex(2) + Face3D[i].GetVertex(1)) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Face3D[i].GetVertex(2) + Face3D[i].GetVertex(0)) / 3; Face3D[i].Remove(2); Face3D[i].Insert(2, temp1); Face3D[i].Insert(3, temp2); } Face3D.Add(Ptemp); Ptemp = new osPolygon(21); for (int i = 9; i > 4; i--) { temp1 = (2 * Face3D[i].GetVertex(2) + Face3D[i].GetVertex(1)) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Face3D[i].GetVertex(2) + Face3D[i].GetVertex(0)) / 3; Face3D[i].Remove(2); Face3D[i].Insert(2, temp1); Face3D[i].Insert(3, temp2); } Face3D.Add(Ptemp); Ptemp = new osPolygon(22); temp1 = (2 * Vtemp[2] + Vtemp[1]) / 3; temp2 = (2 * Vtemp[2] + Vtemp[0]) / 3; Ptemp.AddVertex(temp2); Face3D[0].Remove(1); Face3D[0].Insert(1, temp1); Face3D[0].Insert(2, temp2); temp1 = (2 * Vtemp[2] + Vtemp[0]) / 3; temp2 = (2 * Vtemp[2] + Vtemp[3]) / 3; Face3D[1].Remove(0); Face3D[1].Insert(0, temp1); Face3D[1].Insert(1, temp2); temp1 = (2 * Vtemp[2] + Vtemp[1]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[2] + Vtemp[7]) / 3; Ptemp.AddVertex(temp2); Face3D[10].Remove(1); Face3D[10].Insert(1, temp1); Face3D[10].Insert(2, temp2); temp1 = (2 * Vtemp[2] + Vtemp[8]) / 3; temp2 = (2 * Vtemp[2] + Vtemp[7]) / 3; Face3D[11].Remove(0); Face3D[11].Insert(0, temp1); Face3D[11].Insert(1, temp2); temp1 = (2 * Vtemp[2] + Vtemp[8]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[2] + Vtemp[3]) / 3; Ptemp.AddVertex(temp2); Face3D[12].Remove(0); Face3D[12].Insert(0, temp1); Face3D[12].Insert(1, temp2); Face3D.Add(Ptemp); for (int i = 0; i < 4; i++) { Ptemp = new osPolygon(23 + i); int j = (2 + i) % 5 + 1; temp1 = (2 * Vtemp[j] + Vtemp[(1 + i) % 5 + 1]) / 3; temp2 = (2 * Vtemp[j] + Vtemp[0]) / 3; Ptemp.AddVertex(temp2); Face3D[i + 1].Remove(2); Face3D[i + 1].Insert(2, temp1); Face3D[i + 1].Insert(3, temp2); temp1 = (2 * Vtemp[j] + Vtemp[0]) / 3; temp2 = (2 * Vtemp[j] + Vtemp[(3 + i) % 5 + 1]) / 3; Face3D[(2 + i) % 5].Remove(0); Face3D[(2 + i) % 5].Insert(0, temp1); Face3D[(2 + i) % 5].Insert(1, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(1 + i) % 5 + 1]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[j] + Vtemp[(1 + i) % 5 + 7]) / 3; Ptemp.AddVertex(temp2); Face3D[(2 + i * 2) % 10 + 10].Remove(2); Face3D[(2 + i * 2) % 10 + 10].Insert(2, temp1); Face3D[(2 + i * 2) % 10 + 10].Insert(3, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(2 + i) % 5 + 7]) / 3; temp2 = (2 * Vtemp[j] + Vtemp[(1 + i) % 5 + 7]) / 3; Face3D[(3 + i * 2) % 10 + 10].Remove(0); Face3D[(3 + i * 2) % 10 + 10].Insert(0, temp1); Face3D[(3 + i * 2) % 10 + 10].Insert(1, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(2 + i) % 5 + 7]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[j] + Vtemp[(3 + i) % 5 + 1]) / 3; Ptemp.AddVertex(temp2); Face3D[(4 + i * 2) % 10 + 10].Remove(0); Face3D[(4 + i * 2) % 10 + 10].Insert(0, temp1); Face3D[(4 + i * 2) % 10 + 10].Insert(1, temp2); Face3D.Add(Ptemp); } Ptemp = new osPolygon(27); temp1 = (2 * Vtemp[8] + Vtemp[6]) / 3; temp2 = (2 * Vtemp[8] + Vtemp[7]) / 3; Ptemp.AddVertex(temp1); Face3D[5].Remove(0); Face3D[5].Insert(0, temp1); Face3D[5].Insert(1, temp2); temp1 = (2 * Vtemp[8] + Vtemp[9]) / 3; temp2 = (2 * Vtemp[8] + Vtemp[6]) / 3; Face3D[6].Remove(1); Face3D[6].Insert(1, temp1); Face3D[6].Insert(2, temp2); temp1 = (2 * Vtemp[8] + Vtemp[7]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[8] + Vtemp[2]) / 3; Ptemp.AddVertex(temp2); Face3D[11].Remove(3); Face3D[11].Insert(3, temp1); Face3D[11].Insert(4, temp2); temp1 = (2 * Vtemp[8] + Vtemp[3]) / 3; temp2 = (2 * Vtemp[8] + Vtemp[2]) / 3; Face3D[12].Remove(4); Face3D[12].Insert(4, temp1); Face3D[12].Insert(5, temp2); temp1 = (2 * Vtemp[8] + Vtemp[3]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[8] + Vtemp[9]) / 3; Ptemp.AddVertex(temp2); Face3D[13].Remove(2); Face3D[13].Insert(2, temp1); Face3D[13].Insert(3, temp2); Face3D.Add(Ptemp); Face3D[Face3D.Count - 1].Reverse(); for (int i = 0; i < 3; i++) { Ptemp = new osPolygon(28 + i); int j = (2 + i) % 5 + 7; temp1 = (2 * Vtemp[j] + Vtemp[6]) / 3; temp2 = (2 * Vtemp[j] + Vtemp[(1 + i) % 5 + 7]) / 3; Ptemp.AddVertex(temp1); Face3D[i + 6].Remove(0); Face3D[i + 6].Insert(0, temp1); Face3D[i + 6].Insert(1, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(3 + i) % 5 + 7]) / 3; temp2 = (2 * Vtemp[j] + Vtemp[6]) / 3; Face3D[(2 + i) % 5 + 5].Remove(1); Face3D[(2 + i) % 5 + 5].Insert(1, temp1); Face3D[(2 + i) % 5 + 5].Insert(2, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(1 + i) % 5 + 7]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[j] + Vtemp[(2 + i) % 5 + 1]) / 3; Ptemp.AddVertex(temp2); Face3D[(3 + i * 2) % 10 + 10].Remove(4); Face3D[(3 + i * 2) % 10 + 10].Insert(4, temp1); Face3D[(3 + i * 2) % 10 + 10].Insert(5, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(3 + i) % 5 + 1]) / 3; temp2 = (2 * Vtemp[j] + Vtemp[(2 + i) % 5 + 1]) / 3; Face3D[(4 + i * 2) % 10 + 10].Remove(4); Face3D[(4 + i * 2) % 10 + 10].Insert(4, temp1); Face3D[(4 + i * 2) % 10 + 10].Insert(5, temp2); temp1 = (2 * Vtemp[j] + Vtemp[(3 + i) % 5 + 1]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[j] + Vtemp[(3 + i) % 5 + 7]) / 3; Ptemp.AddVertex(temp2); Face3D[(5 + i * 2) % 10 + 10].Remove(2); Face3D[(5 + i * 2) % 10 + 10].Insert(2, temp1); Face3D[(5 + i * 2) % 10 + 10].Insert(3, temp2); Face3D.Add(Ptemp); Face3D[Face3D.Count - 1].Reverse(); } Ptemp = new osPolygon(31); temp1 = (2 * Vtemp[7] + Vtemp[6]) / 3; temp2 = (2 * Vtemp[7] + Vtemp[11]) / 3; Ptemp.AddVertex(temp1); Face3D[9].Remove(0); Face3D[9].Insert(0, temp1); Face3D[9].Insert(1, temp2); temp1 = (2 * Vtemp[7] + Vtemp[8]) / 3; temp2 = (2 * Vtemp[7] + Vtemp[6]) / 3; Face3D[5].Remove(2); Face3D[5].Insert(2, temp1); Face3D[5].Insert(3, temp2); temp1 = (2 * Vtemp[7] + Vtemp[11]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[7] + Vtemp[1]) / 3; Ptemp.AddVertex(temp2); Face3D[19].Remove(4); Face3D[19].Insert(4, temp1); Face3D[19].Insert(5, temp2); temp1 = (2 * Vtemp[7] + Vtemp[2]) / 3; temp2 = (2 * Vtemp[7] + Vtemp[1]) / 3; Face3D[10].Remove(4); Face3D[10].Insert(4, temp1); Face3D[10].Insert(5, temp2); temp1 = (2 * Vtemp[7] + Vtemp[2]) / 3; Ptemp.AddVertex(temp1); temp2 = (2 * Vtemp[7] + Vtemp[8]) / 3; Ptemp.AddVertex(temp2); Face3D[11].Remove(2); Face3D[11].Insert(2, temp1); Face3D[11].Insert(3, temp2); Face3D.Add(Ptemp); Face3D[Face3D.Count - 1].Reverse(); Face3D[10].Reverse(); Face3D[12].Reverse(); Face3D[14].Reverse(); Face3D[16].Reverse(); Face3D[18].Reverse(); temp.Clear(); for (int i = 0; i < Face3D.Count; i++) { Face3D[i].SetCenter(); temp.Add(Face3D[i].center); } for (int i = 0; i < temp.Count; i++) { Dual.Add(new Vertex(temp[i].X, temp[i].Y, temp[i].Z)); } Dual[0].SetNeighbor(Dual[20]); Dual[0].SetNeighbor(Dual[1]); Dual[0].SetNeighbor(Dual[4]); Dual[0].SetNeighbor(Dual[10]); Dual[0].SetNeighbor(Dual[22]); Dual[0].SetNeighbor(Dual[26]); Dual[1].SetNeighbor(Dual[20]); Dual[1].SetNeighbor(Dual[0]); Dual[1].SetNeighbor(Dual[2]); Dual[1].SetNeighbor(Dual[12]); Dual[1].SetNeighbor(Dual[22]); Dual[1].SetNeighbor(Dual[23]); Dual[2].SetNeighbor(Dual[20]); Dual[2].SetNeighbor(Dual[1]); Dual[2].SetNeighbor(Dual[3]); Dual[2].SetNeighbor(Dual[23]); Dual[2].SetNeighbor(Dual[14]); Dual[2].SetNeighbor(Dual[24]); Dual[3].SetNeighbor(Dual[20]); Dual[3].SetNeighbor(Dual[2]); Dual[3].SetNeighbor(Dual[4]); Dual[3].SetNeighbor(Dual[24]); Dual[3].SetNeighbor(Dual[25]); Dual[3].SetNeighbor(Dual[16]); Dual[4].SetNeighbor(Dual[20]); Dual[4].SetNeighbor(Dual[0]); Dual[4].SetNeighbor(Dual[3]); Dual[4].SetNeighbor(Dual[25]); Dual[4].SetNeighbor(Dual[26]); Dual[4].SetNeighbor(Dual[18]); Dual[5].SetNeighbor(Dual[21]); Dual[5].SetNeighbor(Dual[6]); Dual[5].SetNeighbor(Dual[9]); Dual[5].SetNeighbor(Dual[27]); Dual[5].SetNeighbor(Dual[11]); Dual[5].SetNeighbor(Dual[31]); Dual[6].SetNeighbor(Dual[21]); Dual[6].SetNeighbor(Dual[5]); Dual[6].SetNeighbor(Dual[7]); Dual[6].SetNeighbor(Dual[28]); Dual[6].SetNeighbor(Dual[13]); Dual[6].SetNeighbor(Dual[27]); Dual[7].SetNeighbor(Dual[21]); Dual[7].SetNeighbor(Dual[6]); Dual[7].SetNeighbor(Dual[8]); Dual[7].SetNeighbor(Dual[28]); Dual[7].SetNeighbor(Dual[29]); Dual[7].SetNeighbor(Dual[15]); Dual[8].SetNeighbor(Dual[21]); Dual[8].SetNeighbor(Dual[7]); Dual[8].SetNeighbor(Dual[9]); Dual[8].SetNeighbor(Dual[30]); Dual[8].SetNeighbor(Dual[17]); Dual[8].SetNeighbor(Dual[29]); Dual[9].SetNeighbor(Dual[21]); Dual[9].SetNeighbor(Dual[8]); Dual[9].SetNeighbor(Dual[5]); Dual[9].SetNeighbor(Dual[31]); Dual[9].SetNeighbor(Dual[30]); Dual[9].SetNeighbor(Dual[19]); Dual[10].SetNeighbor(Dual[0]); Dual[10].SetNeighbor(Dual[26]); Dual[10].SetNeighbor(Dual[19]); Dual[10].SetNeighbor(Dual[31]); Dual[10].SetNeighbor(Dual[11]); Dual[10].SetNeighbor(Dual[22]); Dual[11].SetNeighbor(Dual[22]); Dual[11].SetNeighbor(Dual[10]); Dual[11].SetNeighbor(Dual[31]); Dual[11].SetNeighbor(Dual[5]); Dual[11].SetNeighbor(Dual[27]); Dual[11].SetNeighbor(Dual[12]); Dual[12].SetNeighbor(Dual[1]); Dual[12].SetNeighbor(Dual[22]); Dual[12].SetNeighbor(Dual[11]); Dual[12].SetNeighbor(Dual[27]); Dual[12].SetNeighbor(Dual[13]); Dual[12].SetNeighbor(Dual[23]); Dual[13].SetNeighbor(Dual[23]); Dual[13].SetNeighbor(Dual[12]); Dual[13].SetNeighbor(Dual[27]); Dual[13].SetNeighbor(Dual[6]); Dual[13].SetNeighbor(Dual[28]); Dual[13].SetNeighbor(Dual[14]); Dual[14].SetNeighbor(Dual[23]); Dual[14].SetNeighbor(Dual[2]); Dual[14].SetNeighbor(Dual[13]); Dual[14].SetNeighbor(Dual[28]); Dual[14].SetNeighbor(Dual[15]); Dual[14].SetNeighbor(Dual[24]); Dual[15].SetNeighbor(Dual[24]); Dual[15].SetNeighbor(Dual[14]); Dual[15].SetNeighbor(Dual[28]); Dual[15].SetNeighbor(Dual[7]); Dual[15].SetNeighbor(Dual[29]); Dual[15].SetNeighbor(Dual[16]); Dual[16].SetNeighbor(Dual[25]); Dual[16].SetNeighbor(Dual[3]); Dual[16].SetNeighbor(Dual[24]); Dual[16].SetNeighbor(Dual[15]); Dual[16].SetNeighbor(Dual[29]); Dual[16].SetNeighbor(Dual[17]); Dual[17].SetNeighbor(Dual[25]); Dual[17].SetNeighbor(Dual[16]); Dual[17].SetNeighbor(Dual[29]); Dual[17].SetNeighbor(Dual[8]); Dual[17].SetNeighbor(Dual[30]); Dual[17].SetNeighbor(Dual[18]); Dual[18].SetNeighbor(Dual[4]); Dual[18].SetNeighbor(Dual[25]); Dual[18].SetNeighbor(Dual[17]); Dual[18].SetNeighbor(Dual[30]); Dual[18].SetNeighbor(Dual[19]); Dual[18].SetNeighbor(Dual[26]); Dual[19].SetNeighbor(Dual[26]); Dual[19].SetNeighbor(Dual[18]); Dual[19].SetNeighbor(Dual[30]); Dual[19].SetNeighbor(Dual[9]); Dual[19].SetNeighbor(Dual[31]); Dual[19].SetNeighbor(Dual[10]); Dual[20].SetNeighbor(Dual[0]); Dual[20].SetNeighbor(Dual[1]); Dual[20].SetNeighbor(Dual[2]); Dual[20].SetNeighbor(Dual[3]); Dual[20].SetNeighbor(Dual[4]); Dual[21].SetNeighbor(Dual[5]); Dual[21].SetNeighbor(Dual[6]); Dual[21].SetNeighbor(Dual[7]); Dual[21].SetNeighbor(Dual[8]); Dual[21].SetNeighbor(Dual[9]); Dual[22].SetNeighbor(Dual[0]); Dual[22].SetNeighbor(Dual[1]); Dual[22].SetNeighbor(Dual[10]); Dual[22].SetNeighbor(Dual[11]); Dual[22].SetNeighbor(Dual[12]); Dual[23].SetNeighbor(Dual[1]); Dual[23].SetNeighbor(Dual[2]); Dual[23].SetNeighbor(Dual[12]); Dual[23].SetNeighbor(Dual[13]); Dual[23].SetNeighbor(Dual[14]); Dual[24].SetNeighbor(Dual[2]); Dual[24].SetNeighbor(Dual[3]); Dual[24].SetNeighbor(Dual[14]); Dual[24].SetNeighbor(Dual[15]); Dual[24].SetNeighbor(Dual[16]); Dual[25].SetNeighbor(Dual[3]); Dual[25].SetNeighbor(Dual[4]); Dual[25].SetNeighbor(Dual[16]); Dual[25].SetNeighbor(Dual[17]); Dual[25].SetNeighbor(Dual[18]); Dual[26].SetNeighbor(Dual[0]); Dual[26].SetNeighbor(Dual[4]); Dual[26].SetNeighbor(Dual[10]); Dual[26].SetNeighbor(Dual[18]); Dual[26].SetNeighbor(Dual[19]); Dual[27].SetNeighbor(Dual[5]); Dual[27].SetNeighbor(Dual[6]); Dual[27].SetNeighbor(Dual[11]); Dual[27].SetNeighbor(Dual[12]); Dual[27].SetNeighbor(Dual[13]); Dual[28].SetNeighbor(Dual[6]); Dual[28].SetNeighbor(Dual[7]); Dual[28].SetNeighbor(Dual[13]); Dual[28].SetNeighbor(Dual[14]); Dual[28].SetNeighbor(Dual[15]); Dual[29].SetNeighbor(Dual[7]); Dual[29].SetNeighbor(Dual[8]); Dual[29].SetNeighbor(Dual[15]); Dual[29].SetNeighbor(Dual[16]); Dual[29].SetNeighbor(Dual[17]); Dual[30].SetNeighbor(Dual[8]); Dual[30].SetNeighbor(Dual[9]); Dual[30].SetNeighbor(Dual[17]); Dual[30].SetNeighbor(Dual[18]); Dual[30].SetNeighbor(Dual[19]); Dual[31].SetNeighbor(Dual[9]); Dual[31].SetNeighbor(Dual[5]); Dual[31].SetNeighbor(Dual[19]); Dual[31].SetNeighbor(Dual[10]); Dual[31].SetNeighbor(Dual[11]); }
//正十二面体を生成 private void SetDodecahedron(float length) { SetIcosahedron(length); List<Vector3D> temp = new List<Vector3D>(); for (int i = 0; i < Face3D.Count; i++) { Face3D[i].SetCenter(); temp.Add(Face3D[i].center); } Face3D.Clear(); Dual.Clear(); Vector3D[] Vtemp = new Vector3D[20]; osPolygon Ptemp; for (int i = 0; i < 20; i++) Vtemp[i] = new Vector3D(); Ptemp = new osPolygon(0); Ptemp.AddVertex(temp[0]); Ptemp.AddVertex(temp[10]); Ptemp.AddVertex(temp[11]); Ptemp.AddVertex(temp[12]); Ptemp.AddVertex(temp[1]); Face3D.Add(Ptemp); Ptemp = new osPolygon(1); Ptemp.AddVertex(temp[1]); Ptemp.AddVertex(temp[12]); Ptemp.AddVertex(temp[13]); Ptemp.AddVertex(temp[14]); Ptemp.AddVertex(temp[2]); Face3D.Add(Ptemp); Ptemp = new osPolygon(2); Ptemp.AddVertex(temp[2]); Ptemp.AddVertex(temp[14]); Ptemp.AddVertex(temp[15]); Ptemp.AddVertex(temp[16]); Ptemp.AddVertex(temp[3]); Face3D.Add(Ptemp); Ptemp = new osPolygon(3); Ptemp.AddVertex(temp[3]); Ptemp.AddVertex(temp[16]); Ptemp.AddVertex(temp[17]); Ptemp.AddVertex(temp[18]); Ptemp.AddVertex(temp[4]); Face3D.Add(Ptemp); Ptemp = new osPolygon(4); Ptemp.AddVertex(temp[4]); Ptemp.AddVertex(temp[18]); Ptemp.AddVertex(temp[19]); Ptemp.AddVertex(temp[10]); Ptemp.AddVertex(temp[0]); Face3D.Add(Ptemp); Ptemp = new osPolygon(5); Ptemp.AddVertex(temp[6]); Ptemp.AddVertex(temp[13]); Ptemp.AddVertex(temp[12]); Ptemp.AddVertex(temp[11]); Ptemp.AddVertex(temp[5]); Face3D.Add(Ptemp); Ptemp = new osPolygon(6); Ptemp.AddVertex(temp[7]); Ptemp.AddVertex(temp[15]); Ptemp.AddVertex(temp[14]); Ptemp.AddVertex(temp[13]); Ptemp.AddVertex(temp[6]); Face3D.Add(Ptemp); Ptemp = new osPolygon(7); Ptemp.AddVertex(temp[8]); Ptemp.AddVertex(temp[17]); Ptemp.AddVertex(temp[16]); Ptemp.AddVertex(temp[15]); Ptemp.AddVertex(temp[7]); Face3D.Add(Ptemp); Ptemp = new osPolygon(8); Ptemp.AddVertex(temp[9]); Ptemp.AddVertex(temp[19]); Ptemp.AddVertex(temp[18]); Ptemp.AddVertex(temp[17]); Ptemp.AddVertex(temp[8]); Face3D.Add(Ptemp); Ptemp = new osPolygon(9); Ptemp.AddVertex(temp[5]); Ptemp.AddVertex(temp[11]); Ptemp.AddVertex(temp[10]); Ptemp.AddVertex(temp[19]); Ptemp.AddVertex(temp[9]); Face3D.Add(Ptemp); Ptemp = new osPolygon(10); Ptemp.AddVertex(temp[0]); Ptemp.AddVertex(temp[1]); Ptemp.AddVertex(temp[2]); Ptemp.AddVertex(temp[3]); Ptemp.AddVertex(temp[4]); Face3D.Add(Ptemp); Ptemp = new osPolygon(11); Ptemp.AddVertex(temp[9]); Ptemp.AddVertex(temp[8]); Ptemp.AddVertex(temp[7]); Ptemp.AddVertex(temp[6]); Ptemp.AddVertex(temp[5]); Face3D.Add(Ptemp); temp.Clear(); for (int i = 0; i < Face3D.Count; i++) { Face3D[i].SetCenter(); temp.Add(Face3D[i].center); } for (int i = 0; i < temp.Count; i++) Dual.Add(new Vertex(temp[i].X, temp[i].Y, temp[i].Z)); Dual[0].SetNeighbor(Dual[10]); Dual[0].SetNeighbor(Dual[4]); Dual[0].SetNeighbor(Dual[1]); Dual[0].SetNeighbor(Dual[5]); Dual[0].SetNeighbor(Dual[9]); Dual[1].SetNeighbor(Dual[10]); Dual[1].SetNeighbor(Dual[0]); Dual[1].SetNeighbor(Dual[2]); Dual[1].SetNeighbor(Dual[6]); Dual[1].SetNeighbor(Dual[5]); Dual[2].SetNeighbor(Dual[10]); Dual[2].SetNeighbor(Dual[1]); Dual[2].SetNeighbor(Dual[3]); Dual[2].SetNeighbor(Dual[7]); Dual[2].SetNeighbor(Dual[6]); Dual[3].SetNeighbor(Dual[10]); Dual[3].SetNeighbor(Dual[2]); Dual[3].SetNeighbor(Dual[4]); Dual[3].SetNeighbor(Dual[8]); Dual[3].SetNeighbor(Dual[7]); Dual[4].SetNeighbor(Dual[10]); Dual[4].SetNeighbor(Dual[3]); Dual[4].SetNeighbor(Dual[0]); Dual[4].SetNeighbor(Dual[9]); Dual[4].SetNeighbor(Dual[8]); Dual[5].SetNeighbor(Dual[11]); Dual[5].SetNeighbor(Dual[9]); Dual[5].SetNeighbor(Dual[6]); Dual[5].SetNeighbor(Dual[0]); Dual[5].SetNeighbor(Dual[1]); Dual[6].SetNeighbor(Dual[11]); Dual[6].SetNeighbor(Dual[5]); Dual[6].SetNeighbor(Dual[7]); Dual[6].SetNeighbor(Dual[1]); Dual[6].SetNeighbor(Dual[2]); Dual[7].SetNeighbor(Dual[11]); Dual[7].SetNeighbor(Dual[6]); Dual[7].SetNeighbor(Dual[8]); Dual[7].SetNeighbor(Dual[2]); Dual[7].SetNeighbor(Dual[3]); Dual[8].SetNeighbor(Dual[11]); Dual[8].SetNeighbor(Dual[7]); Dual[8].SetNeighbor(Dual[9]); Dual[8].SetNeighbor(Dual[3]); Dual[8].SetNeighbor(Dual[4]); Dual[9].SetNeighbor(Dual[11]); Dual[9].SetNeighbor(Dual[8]); Dual[9].SetNeighbor(Dual[5]); Dual[9].SetNeighbor(Dual[4]); Dual[9].SetNeighbor(Dual[0]); Dual[10].SetNeighbor(Dual[0]); Dual[10].SetNeighbor(Dual[1]); Dual[10].SetNeighbor(Dual[2]); Dual[10].SetNeighbor(Dual[3]); Dual[10].SetNeighbor(Dual[4]); Dual[11].SetNeighbor(Dual[5]); Dual[11].SetNeighbor(Dual[6]); Dual[11].SetNeighbor(Dual[7]); Dual[11].SetNeighbor(Dual[8]); Dual[11].SetNeighbor(Dual[9]); }
//正四面体を生成 private void SetTetrahedron(float length) { Face3D.Clear(); Dual.Clear(); Vector3D[] Vtemp = new Vector3D[4]; osPolygon Ptemp; for (int i = 0; i < 4; i++) Vtemp[i] = new Vector3D(); float a = (float)(Math.Sqrt(2.0 / 3.0) * length); float b = (float)(length * Math.Sqrt(3.0) / 2.0); Vtemp[0].Set(-length / 2, length / 2, length / 2); Vtemp[1].Set(-length / 2, -length / 2, -length / 2); Vtemp[2].Set(length / 2, -length / 2, length / 2); Vtemp[3].Set(length / 2, length / 2, -length / 2); Ptemp = new osPolygon(0); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[2]); Face3D.Add(Ptemp); Ptemp = new osPolygon(1); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[2]); Ptemp.AddVertex(Vtemp[3]); Face3D.Add(Ptemp); Ptemp = new osPolygon(2); Ptemp.AddVertex(Vtemp[0]); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[1]); Face3D.Add(Ptemp); Ptemp = new osPolygon(3); Ptemp.AddVertex(Vtemp[1]); Ptemp.AddVertex(Vtemp[3]); Ptemp.AddVertex(Vtemp[2]); Face3D.Add(Ptemp); List<Vector3D> temp = new List<Vector3D>(); for (int i = 0; i < Face3D.Count; i++) { Face3D[i].SetCenter(); temp.Add(Face3D[i].center); } for (int i = 0; i < temp.Count; i++) Dual.Add(new Vertex(temp[i].X, temp[i].Y, temp[i].Z)); Dual[0].SetNeighbor(Dual[1]); Dual[0].SetNeighbor(Dual[2]); Dual[0].SetNeighbor(Dual[3]); Dual[1].SetNeighbor(Dual[0]); Dual[1].SetNeighbor(Dual[2]); Dual[1].SetNeighbor(Dual[3]); Dual[2].SetNeighbor(Dual[0]); Dual[2].SetNeighbor(Dual[1]); Dual[2].SetNeighbor(Dual[3]); Dual[3].SetNeighbor(Dual[0]); Dual[3].SetNeighbor(Dual[1]); Dual[3].SetNeighbor(Dual[2]); }