/// <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);
        }
Example #2
0
    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());
    }