2013-06-28 5 views
1

Etant donné un plat (equarectangilar panoramique) de l'image par exemple 6000px x 3000px (étalement 360 degrés de large et 180 degré élevé). Comment puis-je traduire par exemple x = -10, y = -10 à coordonnées sphériques (panoramique/inclinaison verticale ou/déport horizontal) si le centre de l'image signifierait un décalage de 0 horizontal/vertical?Conversion de coordonnées x/y pour sphérique

Est-il possible de calculer, ou avez-vous besoin d'autres variables telles que le rayon, la distance ou de coordonnées z?

Edit: Ce que j'ai jusqu'à présent:

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 

Si je mets en 0,0 dans la première méthode, je reçois -180,90 ce qui est correct. Mais si je mets 3000,0 je m'attendrais à 0,90 mais j'obtiens 7,90. Il en va de même avec l'autre formule (xy à sphérique). Quand je saisis 0,0 je m'attendrais à 3000,1500 mais j'obtiens 2880x1440px. Il y a un petit décalage, probablement parce que je calcule en ligne droite.

Mise à jour: La réponse

J'ai mis à jour la réponse ci-dessous pour prendre en compte que les diplômes pourraient être plus de 360 ​​degrés. J'utilise le modulo pour résoudre ce problème:

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

Voulez-vous mapper une image plate à une sphère? –

+0

Oui, une image plate équarectangilaire. https://en.wikipedia.org/wiki/Equirectangular_projection – Jareish

+0

Pourquoi ne pouvez-vous utiliser les formules de wikipedia? –

Répondre

2

Vos équations sont mathématiquement correct, mais lors de la division des entiers en Ruby (et dans la plupart des langues), vous perdrez le reste. Par exemple 6000/360 = 16.666 ... dans la vraie vie, mais dans Ruby vous aurez 16 ans. Toutes ces erreurs d'arrondi conduiront à des erreurs dans votre résultat final. Une astuce pour éviter cela est de faire en sorte que certains des nombres dans votre arithmétique soient Floats au lieu de simplement Fixnums. Essayez:

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

Merci! C'était ça! Je suis encore confus au sujet des articles du wiki que j'ai trouvés sur Internet, où ils utilisent des métriques et toutes sortes de calculs d'angles et prennent même en compte le rayon de la terre. Est-ce la bonne façon? Ou est-ce que je calcule toujours en ligne droite? – Jareish

+0

Le premier article de Wikipedia, un lien dans vos commentaires se traduit entre la latitude-longitude sur la * vraie * Terre aux coordonnées x-y sur une projection équirectangulaire plane de la surface de la Terre sur une carte plane 2 dimensions * *. Le lien vers le geom.uiuc.La page edu donne une traduction entre latitude-longitude- "distance-du-noyau-de-la-Terre" pour la * Terre réelle dans l'espace réel * aux coordonnées xyz cartésiennes dans * l'espace réel *, l'origine étant située au centre de la Terre. l'axe des x passant par le méridien principal à l'équateur, et l'axe z passant par les pôles de la terre ... –

+0

... Donc ces deux traductions sont entièrement différentes. Le premier ensemble est * bidimensionnel *, et va entre la * surface * de la Terre et les coordonnées cartésiennes sur une * carte *, alors que le second est * tridimensionnel *, et va de deux façons différentes de représenter les points dans l'espace 3-d, où les deux systèmes de coordonnées sont géocentriques. –

Questions connexes