Example #1
0
        //特定の三角形から始めて、周辺の四角形をフリップすることで分割形状を最適化する。
        private static void optimizePolygonSeparate(LDPointList form, LDTriangle firstTriangle, LDTriangleList triangles)
        {
            LDIndexLineList uncheckedLines = new LDIndexLineList();

            uncheckedLines.Add(firstTriangle.getLine1());
            uncheckedLines.Add(firstTriangle.getLine2());
            uncheckedLines.Add(firstTriangle.getLine3());

            //A2-2) スタックSが空になるまで以下を繰り返す
            while (uncheckedLines.size() != 0)
            {
                //A2-2-1) スタックSの一番上のedgeをpopする.これを辺ABとする
                LDIndexLine lineAB = uncheckedLines.Last();
                uncheckedLines.RemoveAt(uncheckedLines.Count - 1);

                //線と接する2つの三角形を取得
                LDTriangleList relatedTriangles = triangles.find(lineAB);

                //外周はチェックしない
                if (relatedTriangles.size() == 1)
                {
                    continue;
                }

                //三角形がダブってるのは不正。隣接0もなにかおかしい
                Debug.Assert(relatedTriangles.size() == 2);

                //A2-2-2) 辺ABを含む2個の三角形をABCとABDとする
                // if(三角形ABCの外接円内にDが入 る) 辺ABをflipし,辺AD/DB/BC/CAをスタックSにpushする
                //else 何もしない
                LDTriangle triangleABC = relatedTriangles.at(0);
                LDTriangle triangleABD = relatedTriangles.at(1);

                int index = triangleABD.getIndexWithoutLine(lineAB);
                Debug.Assert(form.length() > index);
                LDPoint pd = form[index];

                // 外接円を求める
                LDCircle c    = LDCircle.getCircumscribedCirclesOfTriangle(form, triangleABC);
                double   dist = PointUtil.distance(c.center, pd);

                //誤差の範囲ならフリップしない
                if (dist < c.radius && Math.Abs(c.radius - dist) > 0.00001)
                {
                    //不正な辺
                    uncheckedLines.AddRange(flipTriangles(triangleABC, triangleABD, lineAB, triangles));
                }
            }
        }
Example #2
0
        //特定の三角形から始めて、周辺の四角形をフリップすることで分割形状を最適化する。
        private static void optimizePolygonSeparate(LDPointList form, LDTriangle firstTriangle, LDTriangleList triangles)
        {
            LDIndexLineList uncheckedLines = new LDIndexLineList();
            uncheckedLines.Add(firstTriangle.getLine1());
            uncheckedLines.Add(firstTriangle.getLine2());
            uncheckedLines.Add(firstTriangle.getLine3());

            //A2-2) スタックSが空になるまで以下を繰り返す
            while (uncheckedLines.size() != 0)
            {
                //A2-2-1) スタックSの一番上のedgeをpopする.これを辺ABとする
                LDIndexLine lineAB = uncheckedLines.Last();
                uncheckedLines.RemoveAt(uncheckedLines.Count - 1);

                //線と接する2つの三角形を取得
                LDTriangleList relatedTriangles = triangles.find(lineAB);

                //外周はチェックしない
                if (relatedTriangles.size() == 1)
                    continue;

                //三角形がダブってるのは不正。隣接0もなにかおかしい
                Debug.Assert(relatedTriangles.size() == 2);

                //A2-2-2) 辺ABを含む2個の三角形をABCとABDとする
                // if(三角形ABCの外接円内にDが入 る) 辺ABをflipし,辺AD/DB/BC/CAをスタックSにpushする
                //else 何もしない
                LDTriangle triangleABC = relatedTriangles.at(0);
                LDTriangle triangleABD = relatedTriangles.at(1);

                int index = triangleABD.getIndexWithoutLine(lineAB);
                Debug.Assert(form.length() > index);
                LDPoint pd = form[index];

                // 外接円を求める
                LDCircle c = LDCircle.getCircumscribedCirclesOfTriangle(form, triangleABC);
                double dist = PointUtil.distance(c.center, pd);

                //誤差の範囲ならフリップしない
                if (dist < c.radius && Math.Abs(c.radius - dist) > 0.00001)
                {
                    //不正な辺
                    uncheckedLines.AddRange(flipTriangles(triangleABC, triangleABD, lineAB, triangles));
                }
            }
        }