【问题标题】:Bounding box computation边界框计算
【发布时间】:2018-05-16 14:24:07
【问题描述】:

我们的边界框计算算法是这样实现的。我们还能做些什么来提高速度吗?还是用不同的方法来解决同样的问题?

谢谢。

boxMin.X = boxMax.X = points[0].X;
boxMin.Y = boxMax.Y = points[0].Y;
boxMin.Z = boxMax.Z = points[0].Z;

for (int i = 1; i < points.Length; i++)
{
    UpdateMinMaxQuick(points[i], boxMin, boxMax);
}

这是UpdateMinMaxQuick()方法源码:

public static void UpdateMinMaxQuick(double x, double y, double z, Point3D min, Point3D max)
{
    if (x < min.X)

        min.X = x;

    else if (x > max.X)

        max.X = x;

    if (y < min.Y)

        min.Y = y;

    else if (y > max.Y)

        max.Y = y;

    if (z < min.Z)

        min.Z = z;

    else if (z > max.Z)

        max.Z = z;
}

【问题讨论】:

  • 边界框计算不太可能成为任何实际应用程序的瓶颈;测试、基准测试和配置文件,以在微优化之前找到真正的性能瓶颈所在。如果需要,内联函数 UpdateMinMaxQuick 并仅更新局部变量而不是类成员,尽管在托管环境中这不太可能产生太大影响。

标签: unity3d math graphics 3d cad


【解决方案1】:

您无法显着加快平均时间,但可以避免最坏的情况(对于提升坐标序列,您接近每个坐标使用大约 2n 次比较):

对每对相邻元素进行比较,并检查全局最小值和最大值与最小值和最大值对。此方法始终使用 3n/2 次比较(每个坐标)。

 if points[2*i].X > points[2*i+1].X:
       if min.X > points[2*i+1].X:
            min.X = points[2*i+1].X 
       if max.X < points[2*i].X:
            max.X = points[2*i].X 
 else:
       if min.X > points[2*i].X:
            min.X = points[2*i].X 
       if max.X < points[2*i+1].X:
            max.X = points[2*i+1].X 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多