我有以下功能
bool VertexOrderIsClockwise(Vector3[] vertices) {
float sumOverEdges = 0;
int vertCount = vertices.Count();
for(int i = 0; i < vertCount; i++)
sumOverEdges += (vertices[(i+1) % vertCount].x - vertices[i].x) * (vertices[(i+1) % vertCount].z + vertices[i].z);
return (sumOverEdges >= 0);
}
我确信使用linq我可以大大减少这个功能的足迹。
这是我的尝试:
bool VertexOrderIsClockwise(Vector3[] vertices) {
float sumOverEdges = vertices.Aggregate((current,next) => (next.x - current.x) * (next.z + current.z));
return (sumOverEdges >= 0);
}
所以这有一些问题,第一个是聚合函数想要返回一个Vector3而不是一个浮点数(我计算的总和)。第二个是我无法弄清楚如何指示我的聚合在最后一次迭代中回绕到序列的开头。 (在我的原始功能中,我使用了%)。这可能吗?
如果有更好的linq函数可以使用,我也不会使用聚合。
答案 0 :(得分:1)
return vertices.Zip(
vertices.Skip(1)
.Concat(vertices.Take(1)),
(i,j) => (j.x - i.x) * (j.z + i.z))
.Sum() >= 0;