对无序的边界点排序(顺时针绘制边界)

在Unity3D中无论连点成线,还是绘制Mesh,都需把坐标点按一定的顺序进行计算,

如果所有的点都是离散的数据,那即便已知哪些点是边界点,还需要对顺序进行排列,才能成功绘制。

本文便是对List集合中顺序混乱的几个边界点,进行排序。

    /// <summary>
    /// 以X轴为索引,保持X坐标对应的所有Y坐标
    /// </summary>
    Dictionary<float, List<float>> dicSort = new Dictionary<float, List<float>>();
    /// <summary>
    /// 用于接收大于0和小于0的点集合
    /// </summary>
    public List<Vector3> firstPart = new List<Vector3>(), secondPart = new List<Vector3>();
    /// <summary>
    /// 最终的输出结果
    /// </summary>
    public List<Vector3> resultAB;

    在模拟点生成一个对象,仅用于查看
    //public GameObject objitem;

    void Start()
    {
        //模拟无序的边界点
        List<Vector3> listBorder = new List<Vector3>();

        listBorder.Add(new Vector3(-2, 0, 1));
        listBorder.Add(new Vector3(1, 0, 2));
        listBorder.Add(new Vector3(2, 0, 1));
        listBorder.Add(new Vector3(-1, 0, -2));
        listBorder.Add(new Vector3(-2, 0, -1));
        listBorder.Add(new Vector3(-2, 0, 2));
        listBorder.Add(new Vector3(2, 0, -2));
        //foreach (Vector3 item in listBorder)
        //{
        //    //在模拟点生成一个对象,仅用于查看
        //    Instantiate(objitem, item, Quaternion.Euler(Vector3.zero), transform);
        //}
        resultAB = DrawSorting(listBorder);
    }
    List<Vector3> DrawSorting(List<Vector3> listBorder)
    {
        //添加到排序集合中
        foreach (Vector3 item in listBorder)
        {
            if (!dicSort.ContainsKey(item.x))
            {
                dicSort.Add(item.x, new List<float>() { item.z });
            }
            else if (!dicSort[item.x].Contains(item.z))
            {
                dicSort[item.x].Add(item.z);
            }
        }
        //开始排序
        Dictionary<float, List<float>> dic1_SortedByKey = dicSort.OrderBy(p => p.Key).ToDictionary(p => p.Key, o => o.Value);
        foreach (KeyValuePair<float, List<float>> item in dic1_SortedByKey)
        {
            item.Value.Sort();
            string str = "Key:" + item.Key + " ; Value: ";
            foreach (float z in item.Value)
            {
                if (z >= 0)
                {
                    firstPart.Add(new Vector3(item.Key, 0, z));
                }
                else
                {
                    secondPart.Add(new Vector3(item.Key, 0, z));
                }
                str += "[" + z + "]";
            }
            Debug.Log(str);
        }
        secondPart.Reverse();
        return firstPart.Concat(secondPart).ToList();
    }

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值