public static ConvexPolygon Execute(ConvexPolygon polygon1, ConvexPolygon polygon2, ChainLineFactory lineFactory) { //どちらかがnullならnullを返す if (polygon1 == null || polygon2 == null) { return(null); } //ステータスなど下準備 Status status = new Status(); List <Edge> leftEdge = new List <Edge>(); //左側の計算結果 List <Edge> rightEdge = new List <Edge>(); //右側の計算結果 //一回目のイベントを処理 StepResult result = FirstPass(polygon1, polygon2, status, leftEdge, rightEdge); //二回目以降のイベントを処理 while (result.mustContinue) { //二番目以降のイベントを処 result = SecondPass(status, leftEdge, rightEdge); } //左側と右側の計算結果を統合するリスト List <Edge> totalEdge = new List <Edge>(); totalEdge.AddRange(leftEdge); rightEdge.Reverse(); //反転して連結 totalEdge.AddRange(rightEdge); //線の描画 List <Vector3> vs = new List <Vector3>(); vs.Add(leftEdge[0].startPoint); foreach (var e in leftEdge) { vs.Add(e.endPoint); } lineFactory.CreateLine(vs, Color.red); vs = new List <Vector3>(); vs.Add(rightEdge[0].startPoint); foreach (var e in rightEdge) { vs.Add(e.endPoint); } lineFactory.CreateLine(vs, Color.blue); //交差凸多角形の交点リスト List <Vector2> resultPoints = new List <Vector2>(); Vector2 lastPoint = Vector2.one * float.NaN; int totalSize = totalEdge.Count; for (int i = 0; i < totalSize; ++i) { Edge e1 = totalEdge[i]; Edge e2 = totalEdge[(i + 1) % totalSize]; Vector2 p = Vector2.zero; if (e1.GetIntersectionPoint(e2, ref p)) { resultPoints.Add(p); } } //頂点が3つ以上なら凸多角形を作成 if (resultPoints.Count >= 3) { return(new ConvexPolygon(resultPoints)); } else { return(null); } }