计算两个CGPoints之间距离的最快方法?

xco*_*der 13 math optimization objective-c euclidean-distance

两点之间的距离:

sqrt((x1-x2)^2 + (y1-y2)^2)
Run Code Online (Sandbox Code Playgroud)

有没有办法在Objective-C中更快地完成这个数学运算?

编辑:我想我需要澄清一下.我写了上面的公式只是为了澄清我用来计算距离的公式.^并不意味着代表xor - 我只想表示数学公式而不使用任何函数,如pow或任何东西,所以我的意思是使用^来"提升电源".我想知道是否有人知道是否使用按位运算符,或者在汇编中编写代码会给出优化版本.我在iPhone/iPad应用程序中使用该公式.

Mic*_*nen 35

不,如果你需要确切的距离,你就无法击败那个公式.

虽然要清楚^不是用于平方值的运算符,而是用于执行xor的位运算符.

你会需要类似的东西

double dx = (x2-x1);
double dy = (y2-y1);
double dist = sqrt(dx*dx + dy*dy);
Run Code Online (Sandbox Code Playgroud)

如果你只能住在广场上(当你只是想做一些按距离排序的东西时很有用,你可以使用效率更高的

double dx = (x2-x1);
double dy = (y2-y1);
double dist = dx*dx + dy*dy;
Run Code Online (Sandbox Code Playgroud)

这些至少和解决方案一样好.在最坏的情况下,pow()将使用堆栈并且效率较低,但是在这种情况下,您的编译器可能会将其转换为x*x.


Fir*_*iro 8

只是提供这个简单,漂亮的解决方案.它很可能没有任何先前给定的更快,只是更短.我个人正在使用hypot.

double dist = hypot((x1-x2), (y1-y2));
Run Code Online (Sandbox Code Playgroud)

根据文档,这将返回"(x ^ 2 + y ^ 2)的平方根".


CRD*_*CRD 7

在英特尔Mac上,Clang将编译:

double distance = ({double d1 = x1 - x2, d2 = y1 - y2; sqrt(d1 * d1 + d2 * d2); });
Run Code Online (Sandbox Code Playgroud)

总共有6个数学指令:sub,mul,sub,mul,add,sqrt; 很难打败那个.(sqrt是单指令,但需要多个周期).