微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算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)中绘制的图形与它在球体上看起来的方式相比,你做出的任何选择都会扭曲你得到的平面几何形状.

(最后,如果你的意思是顶部边缘与底部相同,而右边与左边相同,那么你可能有圆环而不是球体!)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐