Comment convertir entre deux systèmes de coordonnées 2D différents?


10

J'essaie de convertir une coordonnée d'un système de coordonnées à un autre, afin de pouvoir la dessiner sur une image.

Fondamentalement, le système de coordonnées de destination est le suivant:

X range: 0 to 1066
Y range: 0 to 1600

(juste une image standard sur laquelle je dessine avec une taille de 1066 x 1600)

La position que j'essaie de dessiner sur l'image a en fait exactement la même taille, mais le système de coordonnées est différent. L'étendue de toutes les coordonnées est de 1066x1600.

Mais un exemple de coordonnées serait:

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

La plage de ce système de coordonnées est:

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

J'ai l'impression que ce sont des calculs TRÈS simples, mais pour une raison quelconque, je ne comprends pas.

Comment puis-je convertir les coordonnées fournies dans le premier système de coordonnées?


3
Si les deux systèmes de coordonnées ont les mêmes vecteurs de base, vous pouvez simplement utiliser un facteur d'échelle. S'ils n'ont pas les mêmes vecteurs de base, un changement de base est nécessaire.
thalador

Réponses:


7

Vous pouvez normaliser la première valeur, cela vous donnera une valeur dans la plage [0,1]. Vous pouvez considérer cela comme un pourcentage X, le pourcentage auquel la valeur correspond entre les valeurs minimale et maximale. Ensuite, vous pouvez trouver où ce pourcentage appartient dans votre système de coordonnées de destination en voyant quelle valeur est le pourcentage X via le système de destination. J'utiliserai du code Java comme exemple de langage, je suis sûr que les concepts sont suffisamment clairs pour être traduits dans n'importe quel langage.

Alors normalisez:

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

En utilisant votre exemple, vous saisiriez:

xPercent = normalize(x,0,1066);

Trouvez ensuite où il se trouve dans le système de destination. Avec quelque chose comme

destX = xPercent*(Math.abs(max-min)) + min;

Ou pour utiliser vos valeurs:

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

Ainsi, par exemple, avec une valeur x de 1000, vous devez mapper cela à votre système de coordonnées de destination 467.29.

Alternativement , si les systèmes de coordonnées seront toujours les mêmes, vous pouvez pré-calculer le rapport entre eux.

Alors:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;

Pourquoi Java (C #)? Il n'a pas demandé de code Java :)
kravemir

6
C'est pour donner un exemple. Il n'a pas besoin d'être utilisé tel quel et le concept est suffisamment clair.
MichaelHouse

Mais si je fais cela: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; J'obtiens toujours une valeur négative, et le système de coordonnées résultant est juste de 0 à 1066, dois-je changer toutes les coordonnées?
Geesu

Les ai commutés et je reçois toujours dump.tanaris4.com/sota.png comme dans un autre post, peut-être que j'ai un autre problème (lié à C # et au dessin). Merci les gars!
Geesu

J'ai compris, pour une raison quelconque, je devais faire xPercent = 1.0f - xPercent
Geesu

4

C'est un calcul simple:

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src - système de coordonnées source

res - système de coordination des résultats

Edit - explication des mathématiques

( src - src_min ) / ( src_max - src_min )le traduit en système de coordonnées commençant à zéro avec une longueur égale de système de coordonnées source (0.0, src_max - src_min ). Ensuite, il met à l'échelle la valeur pour coordonner le système (0.0, 1.0).

* ( res_max - res_min ) cette valeur d'échelle pour coordonner le système commençant à zéro avec la longueur du système de coordination des résultats (0.0, dst_max - dst_min)

+ res_min traduit la valeur en système de coordonnées résultant (dst_min, dst_max)


J'ai pensé cela aussi, mais ça ne s'affiche pas correctement: dump.tanaris4.com/sota.png La coordonnée finale devrait frapper là où le cercle blanc est en bas
Geesu

1
Cela ne leur explique pas du tout les mathématiques, pourquoi pas? :)
MichaelHouse

@ Byte56 Pour moi, la formule est suffisante pour comprendre quelque chose, surtout si elle n'utilise que des opérations arithmétiques, mais j'ai ajouté des explications aux personnes qui en auraient besoin :)
kravemir

1
@Geesu Alors vous faites probablement autre chose de mal (rendu des matrices?).
kravemir

2
Merci d'avoir mis cela à jour. Je pense généralement qu'il vaut mieux donner une réponse qui essaie d'expliquer pourquoi. Sinon, vous donnez simplement la réponse à cette question, au lieu de savoir comment résoudre cette question et des problèmes similaires. C'est une chose de type "donner à un homme un poisson, apprendre à un homme à pêcher".
MichaelHouse

3

L'équation de base pour la tranformation de coordonnées 2D (en algèbre, sans rotation impliquée) est:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

étant donné deux points dans TargetCoordinate (T1, T2) qui correspond à deux points dans SourceCoordinate (S1, S2), TranslateFactoret ScalingFactorest donné en résolvant:

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

ce qui résulte:

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

Dans votre cas, pour la coordonnée x

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

Et ainsi,

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

les coordonnées y suivent la même procédure


S1 et S2 ne peuvent pas avoir la même coordonnée x / y, ce qui conduit à une division par zéro.
zwcloud

0

Faire quelques hypothèses:

  • Vous êtes (éventuellement) intéressé par une implémentation matricielle, pour plus de commodité et de puissance; et
  • Vous connaissez les coordonnées homogènes.

Ensuite, la question migre vers: Quelle est la matrice de transformation homogène pour mon changement de base?

Pour y répondre, nous avons d'abord besoin des réponses à trois questions subsidiaires:

  1. Où est passée mon origine?
  2. Qu'est-il arrivé à mon axe X? Soit (M11, M12) les coordonnées du point
  3. Qu'est-il arrivé à mon axe Y?

Définissez les réponses à ces trois questions comme suit:

  1. (M31, M32) sont les coordonnées de la nouvelle origine sous le système de coordonnées d'origine.
  2. (M11, M12) sont les coordonnées du nouveau vecteur x unitaire dans le système de coordonnées d'origine.
  3. (M21, M22) sont les coordonnées du nouveau vecteur y unitaire dans le système de coordonnées d'origine.

Alors la matrice de transformation homogène est:

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

Ma convention ici est que les points sont représentés par des vecteurs de ligne, qui est la convention normale de l'infographie; les mathématiciens et les physiciens utilisent souvent l'oppsoite.


Un système de coordonnées peut être décrit par une telle matrice: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Étant donné une matrice de système de coordonnées A et une matrice de système de coordonnées B, P * A * Inverse (B), où P est la représentation d'un point sous forme de coordonnées en A, donne la représentation du point sous forme de coordonnées en B.
Jim Balter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.