我今天写了一些代码。我无法弄清楚如何减少这段代码的长度,虽然看似重复,但每个部分都不同。
try {
totalVerts.Add(verts[i]);
if (verts[i].x > maxXvert)
{
maxXvert = verts[i].x;
}
if (verts[i].x < minXvert)
{
minXvert = verts[i].x;
}
if (verts[i].y > maxYvert)
{
maxYvert = verts[i].y;
}
if (verts[i].y < minYvert)
{
minYvert = verts[i].y;
}
if (verts[i].z > maxZvert)
{
maxZvert = verts[i].z;
}
if (verts[i].z < minZvert)
{
minZvert = verts[i].z;
}
}
在这段代码中,我将Vector3位置顶点(x,y,z)添加到totalVerts数组中。我也测试每个x,y,z位置是否是所有顶点的最大值或最小值,如果是,我然后将变量maxXvert,maxYvert ...等设置为更高或更低的值。
如果有人能想出减少的方法,那就太好了。谢谢。
答案 0 :(得分:6)
您可以使用Math.Min和Math.Max。
minXvert = Math.Min(verts[i].x, minXvert);
maxXvert = Math.Max(verts[i].x, maxXvert);
这会使您的代码更简洁,更易读,但不会让它变得更快。
为了使速度更快,您可以将x,y,z值存储在局部变量中,因此只需要查找一次而不是2-4次。但是,无论如何,编译器可能正在为你做这件事。 int x = verts[i].x;
等。
答案 1 :(得分:1)
你可以删除所有括号:(没有重构,只有更少的行!)
try {
totalVerts.Add(verts[i]);
if (verts[i].x > maxXvert)
maxXvert = verts[i].x;
if (verts[i].x < minXvert)
minXvert = verts[i].x;
if (verts[i].y > maxYvert)
maxYvert = verts[i].y;
if (verts[i].y < minYvert)
minYvert = verts[i].y;
if (verts[i].z > maxZvert)
maxZvert = verts[i].z;
if (verts[i].z < minZvert)
minZvert = verts[i].z;
}
答案 2 :(得分:0)
表现明智,这很好。代码看起来很难看。
不幸的是,LINQ中的Array.max()
函数仅用于.net 3.5,而unity是.net 2.0,所以我想不出更好的方法。
如果LINQ在可用的地方(不是),你可以这样做。
float minX=totalVerts.min(v => v.x);
或类似的那些更整洁(我必须检查表现)
答案 3 :(得分:0)
很难猜测这种情况,但根据我的经验,使用不同的浮点代表向量是一种不必要的痛苦。如果您创建两个Vetor3
而不是六个float
,您仍然可以访问各个值(例如myVector3.x += 1f;
)。而且,通过使用更高的抽象,您既可以使代码更具可读性,又可以使用Vector3
函数,如Max和Min方法,它们可以简化代码:
Vector3 upperBound = Vector3.one * Mathf.NegativeInfinity,
lowerBound = Vector3.one * Mathf.Infinity;
foreach (Vector3 vert in verts) {
totalVerts.Add(vert);
upperBound = Vector3.Max(upperBound, vert);
lowerBound = Vector3.Min(lowerBound, vert);
}
作为旁注,如果您正在进行程序网格,这是计算边界,请注意RecalculateBounds()方法。大多数时候,当我需要程序网格的边界时,我在创建并重新计算网格后从mesh.bounds中读取它,因为无论如何我必须这样做,只是在事后为我省去了麻烦。