计算PHP中两个X,Y坐标之间的距离
作者:互联网
我正在为游戏编写一个工具,它涉及计算500个单位的环形平面上两个坐标之间的距离.也就是说,[0,0]到[499,499]是有效坐标,[0,0]和[499,499]也是彼此相邻的.
目前,在我的应用程序中,我正在比较一个城市与[X,Y]位置之间的距离,该距离分别与用户自己的[X,Y]位置相对应,这些位置是他们事先配置的.
为此,我找到了这种算法,哪种工作方式:
Math.sqrt ( dx * dx + dy * dy );
因为按距离对页面列表进行排序是一件很有用的事情,所以我在MySQL查询中实现了这个算法,并使用SELECT语句的以下部分将它提供给我的应用程序:
SQRT( POW( ( ".strval($sourceX)." - cityX ) , 2 ) + POW( ( ".strval($sourceY)." - cityY ) , 2 ) ) AS distance
这适用于许多计算,但没有考虑[0,0]和[499,499]相互之间的小角落这一事实.
有没有办法我可以调整这个算法来生成一个精确的距离,假设0和499是相邻的?
解决方法:
更新(圆环):
好的,从你自己的评论来看,你的意思似乎就是圆环 – 圆环的表面 – 而不是球体. (这是一个很大的区别,你应该编辑你的问题:称它为球体是错误的.)
对此,答案非常简单 – 您给出的笛卡尔公式或多或少是正确的.但是,您需要包围距离,以便大于或等于250 = 500/2的任何内容都可以转换为0到250之间.
所以答案是这样的(我根本不懂PHP,所以这可能需要修改语法)
dx1 = min(dx, 500-dx)
dy1 = min(dy, 500-dy);
distance = Math.sqrt(dx1*dx1 + dy1*dy1);
(这假定您已将dx和dy定义为差异的绝对值.)
刚刚找到this routine,它在一个包装精美的函数中实现了相同的计算.
原始答案(球体):
你还没有解释你的(x,y)坐标如何映射到球体上的点!
(字面上)有无数个选择,每个选择对应于不同的map projection,并且每个选项的公式都不同.请注意,无论您做出何种选择,两个坐标的含义都是非常不同的.
例如,如果您的(x,y)确实是经度和纬度,那么有很多固定的公式(即,半身像),但您必须首先将0-> 499转换为0-> 360度经度和-90->纬度为90度. (注意,lon和lat在球体上的表现非常不同!)
但我强调,如果你在(x,y)中绘制的图形与它在球体上看起来的方式相比,你做出的任何选择都会扭曲你得到的平面几何形状.
(最后,如果你的意思是顶部边缘与底部相同,而右边与左边相同,那么你可能有圆环而不是球体!)
标签:php,algorithm,mysql,math,coordinate-systems 来源: https://codeday.me/bug/20190714/1456592.html