我正在尝试缩短此代码的长度

时间:2015-06-16 01:10:46

标签: c# unity3d

我今天写了一些代码。我无法弄清楚如何减少这段代码的长度,虽然看似重复,但每个部分都不同。

            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 ...等设置为更高或更低的值。

如果有人能想出减少的方法,那就太好了。谢谢。

4 个答案:

答案 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中读取它,因为无论如何我必须这样做,只是在事后为我省去了麻烦。