예제 #1
0
        /// <summary>
        /// 一回目のイベント処理
        /// </summary>
        private static StepResult FirstPass(ConvexPolygon polygon1, ConvexPolygon polygon2,
                                            Status status, List <Edge> leftEdge, List <Edge> rightEdge)
        {
            //凸多角形の左右の連結辺を作成
            Edge left1  = CreateEdgeChain(polygon1, true);
            Edge right1 = CreateEdgeChain(polygon1, false);
            Edge left2  = CreateEdgeChain(polygon2, true);
            Edge right2 = CreateEdgeChain(polygon2, false);

            if (left1 == null || right1 == null)
            {
                polygon1.LogVertexDebugInfo();
            }

            //Edgeチェインの最上点の座標を取得
            Vector2 top1 = left1.startPoint;
            Vector2 top2 = left2.startPoint;

            //2つの凸多角形の最上点がより下にある方のy座標を走査線の初期位置とする
            float sweepY = Mathf.Min(top1.y, top2.y);
            //走査線を作成
            Line sweepLine = Line.FromPoints(0f, sweepY, 1f, sweepY);

            //Edgeチェインの中からはじめに走査線と交わるEdgeを見つけてステータスに設定
            status.left1  = FindFirstEdge(left1, sweepLine);
            status.right1 = FindFirstEdge(right1, sweepLine);
            status.left2  = FindFirstEdge(left2, sweepLine);
            status.right2 = FindFirstEdge(right2, sweepLine);

            //いずれかのEdgeが見つからなければ,交差部分は存在しないので終了
            if (status.left1 == null || status.right1 == null || status.left2 == null || status.right2 == null)
            {
                return(new StepResult(sweepY, false));
            }

            //初回のイベント処理
            if (top1.y < top2.y)
            {
                if (top1.x < top2.x)
                {
                    Process(status, EdgePosition.LEFT1, sweepLine, leftEdge, rightEdge);
                    Process(status, EdgePosition.RIGHT1, sweepLine, leftEdge, rightEdge);
                }
                else
                {
                    Process(status, EdgePosition.RIGHT1, sweepLine, leftEdge, rightEdge);
                    Process(status, EdgePosition.LEFT1, sweepLine, leftEdge, rightEdge);
                }
            }
            else
            {
                if (top1.x < top2.x)
                {
                    Process(status, EdgePosition.LEFT2, sweepLine, leftEdge, rightEdge);
                    Process(status, EdgePosition.RIGHT2, sweepLine, leftEdge, rightEdge);
                }
                else
                {
                    Process(status, EdgePosition.RIGHT2, sweepLine, leftEdge, rightEdge);
                    Process(status, EdgePosition.LEFT2, sweepLine, leftEdge, rightEdge);
                }
            }

            return(new StepResult(sweepY, true));
        }