将x / y坐标转换为球形

时间:2013-06-28 22:09:19

标签: ruby math

给出平坦(等距全景)全景图像,例如6000px x 3000px(扩展360度宽和180度高)。如何将x = -10,y = -10转换为球面坐标(平移/倾斜或垂直/水平偏移),其中图像的中心意味着水平/垂直偏移为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但是我得到2880x1440px。有一个很小的偏移,很可能是因为我直线计算。

更新:答案

我已经从下面更新了答案,考虑到度数可能大于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

1 个答案:

答案 0 :(得分:2)

你的方程式在数学上是正确的,但是当在Ruby(以及大多数语言)中划分整数时,你将失去剩余部分。例如6000/360 = 16.666 ......在现实生活中,但在Ruby中你会得到16.所有这些舍入错误都会导致最终结果出错。避免这种情况避免这种情况的一个技巧是使你的算术中的一些数字是Floats而不仅仅是Fixnums。尝试:

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