Ejemplo n.º 1
0
        /// <summary>
        /// 获取最边缘一圈的顶点。
        /// </summary>
        /// <param name="dir"></param>
        /// <param name="s"></param>
        /// <param name="e"></param>
        /// <param name="listOutEdgePoint"></param>
        /// <returns></returns>
        private static List <Double2> SearchOutPoint(int edgeIndex, Double2 s, Double2 e, List <Double2> listOutEdgePoint)
        {
            if (listOutEdgePoint == null || listOutEdgePoint.Count == 0)
            {
                return(null);
            }

            Double2 outdir;
            Double2 indir;

            if (edgeIndex == 0)
            {
                if (s.y == e.y)
                {
                    return(null);
                }
                outdir = Double2.right;
                indir  = (e - s).normalized;
            }
            else if (edgeIndex == 1)
            {
                if (s.x == e.x)
                {
                    return(null);
                }
                outdir = Double2.up;
                indir  = (e - s).normalized;
            }
            else if (edgeIndex == 2)
            {
                if (s.y == e.y)
                {
                    return(null);
                }
                outdir = Double2.left;
                indir  = (e - s).normalized;
            }
            else if (edgeIndex == 3)
            {
                if (s.x == e.x)
                {
                    return(null);
                }
                outdir = Double2.down;
                indir  = (e - s).normalized;
            }
            else
            {
                return(null);
            }
            // 开始搜寻了。
            List <Double2> lResult         = new List <Double2>();
            Double2        startPoint      = s;
            Double2        bestPoint       = Double2.zero;
            bool           isHaveBestPoint = false;
            List <Double2> listinPoints    = new List <Double2>();
            List <Double2> lHave           = listOutEdgePoint;

            while (lHave != null && lHave.Count > 0)
            {
                // 先过滤了。
                foreach (Double2 pos in lHave)
                {
                    if (Double2.CheckPointInCorns(pos, startPoint, indir, outdir) == true)
                    {
                        listinPoints.Add(pos);
                        if (isHaveBestPoint == false)
                        {
                            bestPoint       = pos;
                            isHaveBestPoint = true;
                        }
                    }
                }
                // 再则优。
                if (isHaveBestPoint == true)
                {
                    for (int i = 1; i < listinPoints.Count; i++)
                    {
                        // 比较更好的点。
                        if (Double2.CheckPointInCorns(listinPoints[i], startPoint, (bestPoint - startPoint).normalized, outdir) == true)
                        {
                            bestPoint = listinPoints[i];
                        }
                    }
                    // 进行交换,执行下一轮迭代。
                    lResult.Add(bestPoint);
                    startPoint = bestPoint;
                    indir      = (e - startPoint).normalized;
                    listinPoints.Remove(bestPoint);
                    lHave           = listinPoints;
                    listinPoints    = new List <Double2>();
                    isHaveBestPoint = false;
                }
                else
                {
                    break;
                }
            }
            return(lResult);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 获取最边缘一圈的顶点。
        /// </summary>
        /// <param name="lineStart">起点</param>
        /// <param name="far">远处的交点</param>
        /// <param name="outdir">外包边</param>
        /// <param name="listOutEdgePoint"></param>
        /// <returns></returns>
        private static List <Double2> SearchOutPoint(Double2 lineStart, Double2 far, Double2 outdir, List <Double2> listOutEdgePoint)
        {
            if (listOutEdgePoint == null || listOutEdgePoint.Count == 0)
            {
                return(listOutEdgePoint);
            }
            // 开始搜寻了。
            List <Double2> lResult         = new List <Double2>();
            Double2        startPoint      = lineStart;
            Double2        bestPoint       = Double2.zero;
            Double2        indir           = far - lineStart;
            bool           isHaveBestPoint = false;
            List <Double2> listinPoints    = new List <Double2>();
            List <Double2> lHave           = listOutEdgePoint;

            while (lHave != null && lHave.Count > 0)
            {
                //SkillObb.instance.AdddirData(startPoint, outdir, indir);
                // 先过滤了。
                for (int i = 0; i < lHave.Count; i++)
                {
                    Double2 pos = lHave[i];
                    if (Double2.CheckPointInCorns(pos, startPoint, indir, outdir) == true)
                    {
                        bestPoint       = pos;
                        isHaveBestPoint = true;
                        for (int k = i; k < lHave.Count; k++)
                        {
                            listinPoints.Add(lHave[k]);
                        }
                        break;
                    }
                }
                // 再则优。
                if (isHaveBestPoint == true)
                {
                    for (int i = 1; i < listinPoints.Count; i++)
                    {
                        // 比较更好的点。
                        if (Double2.CheckPointInCorns(listinPoints[i], startPoint, bestPoint - startPoint, outdir) == true)
                        {
                            bestPoint = listinPoints[i];
                        }
                    }
                    // 进行交换,执行下一轮迭代。
                    lResult.Add(bestPoint);
                    listinPoints.Remove(bestPoint);
                    if (listinPoints.Count > 0)
                    {
                        outdir          = (bestPoint - startPoint).normalized;
                        startPoint      = bestPoint;
                        indir           = far - startPoint;
                        lHave           = listinPoints;
                        listinPoints    = new List <Double2>();
                        isHaveBestPoint = false;
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            }
            return(lResult);
        }