将x/y坐标转换为球面坐标

4
给定一张平面(正方形或矩形全景)图片,例如6000像素x 3000像素(横向360度,纵向180度)。如果我想将x = -10,y = -10转换为球面坐标(pan / tilt或垂直/水平偏移量),其中图像中心表示水平/垂直偏移量为0,应该怎么办?
是否可能计算这个问题?或者您需要其他变量,例如半径,距离或z坐标?
编辑:目前为止我所拥有的:
def self.translate_xy_to_spherical(x, y)
  h = (x / (6000 / 360)) - 180
  v = ((y / (3000 / 180)) - 90) / - 1
  [h, v]
end

def self.translate_spherical_to_xy(h, v)
  x = ((h + 180) * (6000  / 360))
  y = ((v * -1) + 90) * (3000/ 180)

  [x, y]
end

如果我在第一个方法中输入0,0,得到的结果是-180,90,这是正确的。但如果我设置3000,0,我期望得到的是0,90,但实际上得到的是7,90。对于另一种公式(xy转换为球面坐标),情况也是如此。当我输入0,0时,我期望得到的是3000,1500,但实际上得到的是2880x1440像素。可能有一些小偏差,因为我是直线计算。
更新:答案
我已经更新了下面的答案,以考虑度数可能大于360度的情况。我使用模运算来解决这个问题。
IMAGE_WIDTH = 6000
IMAGE_HEIGHT = 3000
def self.translate_xy_to_spherical(x, y)
  h = (x / (IMAGE_WIDTH / 360.0)) - 180
  v = ((y / (IMAGE_HEIGHT / 180.0)) - 90) / -1
  [h, v]
end

def self.translate_spherical_to_xy(h, v)
  x = (((h % 360) + 180) * (IMAGE_WIDTH  / 360.0))
  y = (((v % 180) * -1) + 90) * (IMAGE_HEIGHT/ 180.0)

  [x, y]
end

你想将平面图像映射到球体上吗? - Kamen Stoykov
是的,一个等距矩形平面图像。https://zh.wikipedia.org/wiki/%E7%AD%89%E8%B7%9D%E7%9F%A9%E5%BD%A2%E6%8A%95%E5%BD%B1 - Jareish
为什么不能使用维基百科上的公式? - Kamen Stoykov
我已经编辑了我的问题,并附上了我目前所拥有的内容。我在维基百科上看到了数十个公式,但我不太确定我正在寻找什么。球形、笛卡尔、极坐标、柱面坐标。此外,大多数都涉及距离和z坐标。例如:http://www.geom.uiuc.edu/docs/reference/CRC-formulas/node42.html 我不知道如何应用这个。 - Jareish
你知道你想要将x/y坐标转换成什么吗?如果你想要球面坐标,那就是一个半径和两个角度。如果你想要纬度/经度,那就是两个角度值,没有径向尺寸。我不认为你想要柱面坐标(只是一种直觉)。你想用这个做什么? - lurker
我想在一张平面图像上放置图像热点。用户完成后,我使用krpano将平面图像转换为球形图像。但是我需要将x / y转换为lat / lon(我知道krpano有此方法,但我想在服务器端执行此操作)。我查看了http://rbrundritt.wordpress.com/2008/10/14/conversion-between-spherical-and-cartesian-coordinates-systems/从我所看到的,我有y,x和r(半个图像宽度)。 z应该是sqrt(r2-x2-y2)对吗?但是纬度和经度会是什么呢? - Jareish
1个回答

4

你的方程在数学上是正确的,但是在Ruby(以及大多数编程语言中)除整数时,会丢失余数。例如,实际上6000/360=16.666...,但在Ruby中,你会得到16。所有这些舍入误差将导致最终结果的错误。一个避免这种情况的技巧是使你算术运算中的一些数字成为Float,而不仅仅是Fixnum。尝试一下:

def self.translate_xy_to_spherical(x, y)
  h = (x / (6000 / 360.0)) - 180
  v = ((y / (3000 / 180.0)) - 90) / - 1
  [h, v]
end

def self.translate_spherical_to_xy(h, v)
  x = ((h + 180) * (6000  / 360.0))
  y = ((v * -1) + 90) * (3000/ 180.0)

  [x, y]
end

谢谢!就是这样了!我仍然对我在互联网上找到的维基文章感到困惑,他们使用度量和各种角度计算,甚至考虑地球的半径。这是正确的方法吗?还是我仍然要直线计算? - Jareish
你在评论中提供的第一篇维基百科文章介绍了如何将“真实地球”上的纬度-经度转换为二维平面上的等经纬度投影地图的X-Y坐标系。geom.uiuc.edu网页提供了真实空间中地球的纬度-经度-“距离地球中心”的转换,将其转换为笛卡尔空间中的三维X-Y-Z坐标系。其中,原点位于地球核心,X轴穿过赤道子午线,Z轴穿过地球两极。 - Amit Kumar Gupta
所以这两种翻译完全不同。第一组是二维的,在地球的表面和地图上的笛卡尔坐标之间进行转换,而第二组是三维的,在3D空间中表示点的两种不同方式之间进行转换,其中两个坐标系统都是地心坐标系。 - Amit Kumar Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接