//特定の三角形から始めて、周辺の四角形をフリップすることで分割形状を最適化する。 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)); } } }
public static LDPolygon getHugeTriangle(LDRect rect) { Debug.Assert(rect.left() < rect.right()); Debug.Assert(rect.top() < rect.bottom()); // 1) 与えられた矩形を包含する円を求める // 円の中心 c = 矩形の中心 // 円の半径 r = |p - c| + ρ // ただし、pは与えられた矩形の任意の頂点 // ρは任意の正数 LDVector2 center=new LDVector2(rect.center()); LDVector2 topLeft=new LDVector2(rect.topLeft()); float radius = center.distanceToPoint(topLeft); radius += 1.0f;//適当に大きくする // 2) その円に外接する正三角形を求める LDCircle circle=new LDCircle(center.toPoint(), radius); return circle.getCircumscribedTriangle(); }
public static LDPolygon getHugeTriangle(LDRect rect) { Debug.Assert(rect.left() < rect.right()); Debug.Assert(rect.top() < rect.bottom()); // 1) 与えられた矩形を包含する円を求める // 円の中心 c = 矩形の中心 // 円の半径 r = |p - c| + ρ // ただし、pは与えられた矩形の任意の頂点 // ρは任意の正数 LDVector2 center = new LDVector2(rect.center()); LDVector2 topLeft = new LDVector2(rect.topLeft()); float radius = center.distanceToPoint(topLeft); radius += 1.0f;//適当に大きくする // 2) その円に外接する正三角形を求める LDCircle circle = new LDCircle(center.toPoint(), radius); return(circle.getCircumscribedTriangle()); }