2013-06-28 61 views
1

给定例如6000px x 3000px(展宽360度宽180度高)的平坦(等矩形全景)图像。我如何将x = -10,y = -10转换为球形坐标(平移/倾斜或垂直/水平偏移),其中图像中心的水平/垂直偏移量为0?将x/y坐标转换为球形

是否可以计算出这个值,或者是否需要其他变量,如半径,距离或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 
+0

您是否想将平面图像映射到球体? –

+0

是的,一个equarectangilar平面图像。 https://en.wikipedia.org/wiki/Equirectangular_projection – Jareish

+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 
+0

谢谢!就是这样!我仍然对我在互联网上发现的wiki文章感到困惑,他们在那里使用指标和各种角度计算,甚至考虑地球半径。这是正确的方式吗?还是仍然用直线计算? – Jareish

+0

您在评论中链接到的第一篇维基百科文章将在*真实地球*上的经纬度转换为地球表面的平面等轴投影到二维平面*地图*上的x-y坐标。链接到geom.uiuc。edu页面给出了真实空间中*真实地球的纬度 - 经度 - “从地心距离”到真实空间*中的笛卡尔xyz坐标之间的转换,原点位于地球核心处x轴在赤道穿过素数子午线,而z轴穿过地球的两极...... –

+0

......所以这两个翻译是完全不同的。第一组是*二维*,并且在*地图*上的地球*表面*和笛卡尔坐标之间,而第二组是*三维*,并且在两种不同的方式之间表示点在三维空间中,两个坐标系恰好是以地心为中心的。 –