/// <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)); }