//辺edを回転軸として面をpolのある平面上に開く
        public bool Open(Edge ed, osPolygon pol)
        {
            if (!isOpened)
            {
                Vector3D edvector = new Vector3D();
                double angle;
                Matrix rotatematrix = new Matrix(3);
                Vector3D polnormal;

                pol.SetNormal();
                polnormal = pol.normal;

                SetNormal();

                angle = Math.Acos(Vector3D.Inner(this.normal, polnormal) / (this.normal.Getnorm() * polnormal.Getnorm()));

                start_vertex = ed.vertex1;
                end_vertex = ed.vertex2;

                edvector = end_vertex.center3D - start_vertex.center3D;

                edvector.Normalization();

                rotatematrix.Set_Rotate_ArbAx(edvector, angle);

                foreach (Vertex vtx in vertex)
                    if (vtx.center3D != start_vertex.center3D && vtx.center3D != end_vertex.center3D)
                    {
                        vtx.center3D -= end_vertex.center3D;
                        vtx.center3D = vtx.center3D * rotatematrix;
                        vtx.center3D += end_vertex.center3D;
                    }

                isOpened = true;

                return true;
            }
            return false;
        }
        //正二十面体を生成
        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 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 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 mergeSort(osPolygon[] temp, osCamera c)
 {
     if (temp.Length > 1)
     {
         int m = temp.Length / 2;
         int n = temp.Length - m;
         osPolygon[] a1 = new osPolygon[m];
         osPolygon[] a2 = new osPolygon[n];
         for (int i = 0; i < m; i++) a1[i] = temp[i];
         for (int i = 0; i < n; i++) a2[i] = temp[m + i];
         mergeSort(a1, c);
         mergeSort(a2, c);
         merge(a1, a2, temp, c);
     }
 }
 //マージ
 private void merge(osPolygon[] a1, osPolygon[] a2, osPolygon[] temp, osCamera c)
 {
     int i = 0, j = 0;
     while (i < a1.Length || j < a2.Length)
     {
         if (j >= a2.Length || (i < a1.Length && a1[i].center.Getdistance(c.Setposition) > a2[j].center.Getdistance(c.Setposition)))
         {
             temp[i + j] = a1[i];
             i++;
         }
         else
         {
             temp[i + j] = a2[j];
             j++;
         }
     }
 }
        //切頂二十面体を生成
        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 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]);
        }