/// <summary> /// 凸多角形の「左側」または「右側」の上から下に向かう連結辺を作成する /// </summary> public static Edge CreateEdgeChain(ConvexPolygon polygon, bool left) { //凸多角形のy座標最小/最大値の頂点番号を取得 int minYIndex = 0, maxYIndex = 0; polygon.GetYMinMaxindex(ref minYIndex, ref maxYIndex); //凸多角形の辺配列をを前進するか後退するかを決定 bool ccw = polygon.rotation == ConvexPolygon.Rotation.CCW; bool forward = (ccw && left) || (!ccw && !left); //要素の準備 int size = polygon.GetEdgeCount(); int nextIndex = 0; Edge firstEdge = null; Edge lastEdge = null; //最上点の位置から開始し,最下点に到達するまで続ける for (int i = maxYIndex; i != minYIndex; i = nextIndex) { Edge edge = new Edge(); if (forward) { //前進 nextIndex = (i + 1) % size; edge.segment = polygon.GetEdge(i); edge.index = i; } else { //後退 nextIndex = (i + size - 1) % size; edge.segment = polygon.GetEdge(nextIndex); edge.index = nextIndex; } //辺の始点と終点 edge.startPoint = polygon.GetVertex(i); edge.endPoint = polygon.GetVertex(nextIndex); //辺の連結処理 if (firstEdge == null) { firstEdge = edge; } else { lastEdge.next = edge; } lastEdge = edge; } return(firstEdge); }
private void OnGUI() { if (polygon == null) { return; } StringBuilder sb = new StringBuilder(); int size = polygon.GetEdgeCount(); sb.AppendLine("Vertex Count = " + size); for (int i = 0; i < size; ++i) { sb.AppendLine("[" + i + "] = " + polygon.GetVertex(i)); } int min = 0, max = 0; polygon.GetYMinMaxindex(ref min, ref max); sb.AppendLine("MinYIndex = " + min + " : MaxYIndex = " + max); GUILayout.Label(sb.ToString()); }