コード例 #1
0
        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);
            }
        }