Unity 将List<Vector2>排序
给List<Vector2>排序一般有两种场景,一种时给处在同一条直线上的点进行排序,另一种是给多边形的顶点进行排序。
1、给直线上的点排序
我这里实现的逻辑是,首先给定直线上的两个点start和end,List<Vector2>按start到end的方向,从小到大排序。
可以看下这个测试示例:
void Vector2SortByLineTest(Vector2 lineStart,Vector2 lineEnd) { Vector2 dir = (lineEnd - lineStart).normalized; DrawArrow(dir * -5, dir * 5, Color.red, "line"); List<Vector2> v2s = new List<Vector2>(); for (int i = 0; i < 5; i++) { float x = Random.Range(-3f, 3f); float y = (dir.y / dir.x) * x + Random.Range(-1f, 1f); v2s.Add(new Vector2(x, y)); } SortVector2.ByLine(lineStart,lineEnd,v2s); foreach (var item in v2s) { GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.name = v2s.IndexOf(item).ToString(); obj.transform.localScale *= 0.2f; obj.transform.position = item; } for (int i = 0; i < v2s.Count - 1; i++) { DrawArrow(v2s[i], v2s[i + 1], Color.green, i.ToString()); } }
看下效果:
首先通过DrawArrow方法画出直线,如图中红色线段所示,箭头方向就是List<Vector2>排序的方向;
然后随机生成5个Vector2,通过SortVector2.ByLine方法将随机生成的点进行排序;
可以看到绿色箭头指向的小球,已经按红色箭头方向排好了序。
我实现的SortVector2.ByLine排序方法有个优点时,就是点不必完全在直线上,任意的点也能按这种方式排序。
2、给多边形的顶点排序
实现逻辑是,以给定的点为中心,List<Vector2>围绕中心点以顺时针方向进行排序,只适用于凸多边形,对于凹多边形也会把它看成凸多边形进行排序。
看测试的示例:
void Vector2SortByClockwiseTest(Vector2 origin) { List<Vector2> v2s = new List<Vector2>(); //随机生成一些Vector2 for (int i = 0; i < 15; i++) { float r = 3; float x = Random.Range(-r, r); float y = (Random.Range(-r, r) > 0 ? 1 : -1) * Mathf.Sqrt(r * r - x * x) + Random.Range(-1.5f, 1.5f); v2s.Add(new Vector2(x + origin.x, y + origin.y)); } //按顺时针排序 SortVector2.ByClockwise(origin, v2s); GameObject o= GameObject.CreatePrimitive(PrimitiveType.Sphere); Material mat= new Material(Shader.Find("Unlit/Color")); mat.color = Color.red; o.GetComponent<MeshRenderer>().material = mat; o.transform.localScale *= 0.2f; o.transform.position = origin; foreach (var item in v2s) { GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.name = v2s.IndexOf(item).ToString(); obj.transform.localScale *= 0.2f; obj.transform.position = item; } for (int i = 0; i < v2s.Count - 1; i++) { DrawArrow(v2s[i], v2s[i + 1], Color.green, i.ToString()); } }
效果:
红色的点就是中心点,各个小球就是排序后的点,绿色箭头标出了排序后的方向即顺时针排序的;
如果需要逆时针排序,只需先按顺时针排序后,再调用List的Reverse方法,将List反转一下就行。
点 这里 获取完整的该工程的源码,包含:排序的方法,示例demo
博客园Jason_c微信打赏码
如果本篇文档对你有帮助,打赏Jason_c根华子吧,他的私房钱被老婆没收了,呜呜!
![](https://files-cdn.cnblogs.com/files/Jason-c/%E5%BE%AE%E4%BF%A1%E6%89%93%E8%B5%8F%E7%A0%81.bmp)