【问题标题】:Find closest point from array of points从点数组中找到最近的点
【发布时间】:2014-05-19 00:15:23
【问题描述】:

我有一个 CGPoints 数组(嗯,实际上是 NSStrings 作为 CGPoints)。

我有一个单独的点,称为 CGPoint nextPoint。

如何找出我的数组中最接近 nextPoint 的 CGPoint?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    您是否考虑过简单地遍历您的数组和finding the distance between all the points

    您可以将距离存储在新的 NSMutableArray 中,然后 grab the smallest value from it

    【讨论】:

    • 天哪,这非常明显!非常感谢。
    【解决方案2】:

    只需像毕达哥拉斯一样迭代和计算并比较结果。

    sqrt( ( exp( x1 - x2, 2) + exp( y1 - y2, 2 ) ) );

    您可能想检查 CGFloat 是浮点数还是双精度数,并在适当时使用这些函数的浮点版本。 有一个宏定义了这一点。

    if (CGFLOAT_IS_DOUBLE == YES) {

    如果是,则使用上述,如果否,则使用以f结尾的函数版本

    如果您要比较的点集足够大,您需要更快地进行比较,您可以尝试各种方法,在并行的点子集中找到最短距离,然后比较这些操作的结果。

    【讨论】:

    • ... 或者只是不要浪费时间执行 sqrt()。我会避免使用 exp() 而是使用直接乘法。您不需要实际的距离,只需相对比较即可。
    • 哦,是的。我明白你的意思了。只需利用 (x1 - x2)^2 + (y1 - y2)^2 的值吗?反对使用 exp() 的论点是什么?执行的指令是否有一些小的差异?这些可能是很好的提示,但我认为值得在代码中添加注释。实际上写出毕达哥拉斯公式有被识别的机会。
    • 硬件乘法比指数快几个数量级。即使他们有“power=2”的特殊情况,你仍然需要在船上进行更多的计算。如果您担心拼写错误,请使用 #define SQUARED(x) ((x)*(x)) 然后您将能够编写 SQUARED(x1-x2)+SQUARED(y1-y2) 编译器仍然会优化所有的重复都消失了
    • 需要多快?你的提议真的比 math.h 提供的更好吗?谁说编译器可能会做什么?如果您可以衡量引起足够关注的性能影响,那么值得优化。否则最好做更多有趣的事情。
    • 嗯,是的,我的建议比 math.h 提供的要好。如果您阅读任何有关图形引擎的书籍,您会发现相同的建议。您不需要进行不需要的计算的每个 CPU 周期都会增加电池寿命。如果您只进行一次搜索,那么谁在乎 - 但如果您反复搜索数百或数千个对象,它可能会有所不同。再说一次,正如你所说,如果它不有趣,不要担心。
    猜你喜欢
    • 2022-11-26
    • 2022-10-24
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多