在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();
}