3

给定一个平面(等矩形全景)图像,例如 6000 像素 x 3000 像素(展开 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
4

1 回答 1

4

您的方程式在数学上是正确的,但是在 Ruby(以及大多数语言)中除以整数时,您将失去余数。例如 6000/360 = 16.666... 在现实生活中,但在 Ruby 中你会得到 16。所有这些舍入错误都会导致最终结果出现错误。避免这种情况的一个技巧是让你的算术中的一些数字是浮点数,而不仅仅是 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
于 2013-06-29T05:37:07.343 回答