球体上的 3D 坐标为纬度和经度
我得到以下信息:
存在一个原点为 (0,0,0)、半径为 R 的球体。 进行射线球体相交后,我知道 3D 空间中球体上的一个点 (XYZ)(直线穿过球体外壳的 3D 空间中的确切位置)。
对于我的程序,我想计算球体上 XYZ 点的纬度和经度,但我无法想出(或谷歌)轻松完成此操作的方法。
简而言之,我想要编写的函数是这样的:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
return Latitude and Longitude
}
有人知道如何做到这一点吗?作为参考,此 Wiki SVG 文件可能会有所帮助:
更新:
感谢所有有用的答案,所以最后我使用了这段代码:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
float lat = (float)Math.Acos(position.Y / sphereRadius); //theta
float lon = (float)Math.Atan(position.X / position.Z); //phi
return new LatLon(lat, lon);
}
现在我必须考虑哪个答案最能帮助我接受:P。
I've got the following information:
There exists a sphere with origin (0,0,0) and radius R.
After doing a ray-sphere intersection I know a point (XYZ) in 3D space that is on the sphere (the exact position in 3D space where the line pierces the sphere hull).
For my program I'd like to calculate the Latitude and Longitude of the XYZ point on the sphere, but I can't think (or Google) up a way to do this easily.
So in short, the function that I'm trying to write is this:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
return Latitude and Longitude
}
Does anybody know how to do this? As a reference this Wiki SVG file might be helpful:
Update:
Thanks for all the helpful answers, so in the end I went with this code:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
float lat = (float)Math.Acos(position.Y / sphereRadius); //theta
float lon = (float)Math.Atan(position.X / position.Z); //phi
return new LatLon(lat, lon);
}
Now I've got to think of which answer helped me the most to accept :P.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我想从 x,y,z(3d 坐标系)找到球极坐标应该不难。
r
如果位于表面,则始终保持不变。(90 - θ)您的纬度(负值表示位于底部),从顶部测量。
φ 是您的经度。 (但不太确定经度系统)
另请从 维基百科。
I guess it should not be difficult to find the spherical polar coordinates from x,y,z (3d-coordinate system).
r
is always constant if it's on surface.(90 - θ) your latitude (negative means it's on the bottom) as it's measured from top.
φ is your longitude. (but not quite sure about longitude system)
Also check this diagram from wikipedia.
将公式与
atan2()
一起使用会更方便。您不必加/减 pi/2 或关心不同象限中的符号问题或除以零。
lat
在北半球将 >0lat
在南半球将<0lng
在东半球将 >0lng
在西半球将 <0Using formulas with
atan2()
is more convenient.You don't have to add/subtract pi/2 or care about sign issues in different quadrants or division by zero.
lat
will be >0 in the northern hemispherelat
will be <0 in the southern hemispherelng
will be >0 in the eastern hemispherelng
will be <0 in the western hemisphere这有助于使用 Javascript/THREE.js:
This helped using Javascript/THREE.js:
你可能需要稍微修改一下标志
you might have to tinker with the signs a little
编辑 - 重读您的问题后,我的答案不一定适用,但我会将其保留以供参考。
这取决于您想要的准确度以及结果的用途。不存在单一的纬度和经度系统,例如 WGS84(美国 GPS)或 ETRS89(欧洲 GPS)略有不同,并且随着大西洋变宽而发散。
http://www.ordnancesurvey.co.uk/oswebsite /gps/information/coordinatesystemsinfo/guidecontents/guide5.html
http://www.ordnancesurvey.co.uk/oswebsite/gps /information/coordinatesystemsinfo/guidecontents/guide6.html
最后,这应该可以直接解决您的问题。
http://www.ordnancesurvey.co.uk/oswebsite /gps/information/coordinatesystemsinfo/guidecontents/guideb.html
或
http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcooperatives3D .pdf
Edit - having reread you question my answer isn't necessarily applicable, but I'll leave it up for reference.
It depends how accurate you wan to be an dwhat purpose you are going to use the result for. There is no single latitude and logitude system, eg WGS84 (USA GPS) or ETRS89 (European GPS) differ slightly and are diverging as the Atlantic Ocean widens.
http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide5.html
http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide6.html
Finally this should address your question directly.
http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guideb.html
or
http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcoordinates3D.pdf
在研究了使用纬度/经度将对象放置在球体上的简单解决方案之后,我想出了一个简单的类,让您可以使用 Three.js 来完成此操作。
https://github.com/scottbyrns/Three.js-Geospatial-Mapping
After working on getting a straightforward solution to placing objects on a sphere using lat/lng, I came up with a simple class to let you do it using three.js.
https://github.com/scottbyrns/Three.js-Geospatial-Mapping
这是粗略的工作,但是:
This is back-of-envelope work but: