2010-03-15 15 views
5

J'ai un ensemble de points tels que: Pointa (3302.34,9392.32), pointB (34322.32,11102.03), etc.Coordonner les coordonnées 2D et garder leurs distances euclidiennes relatives intactes?

que je dois à l'échelle ces de sorte que chaque x et y coordonnée est dans la gamme (0.0 - 1,0). J'ai essayé de le faire en trouvant d'abord la plus grande valeur x dans l'ensemble de données (valeur maximum_x_value) et la plus grande valeur y dans l'ensemble (valeur minimum_y_value). J'ai ensuite fait ce qui suit:

pointA.x = (pointA.x - minimum_x_value)/(maximum_x_value - minimum_x_value) 
pointA.y = (pointA.y - minimum_y_value)/(maximum_y_value - minimum_y_value) 

Cela modifie les distances relatives (?), Et rend donc les données inutiles pour mes fins. Y a-t-il un moyen de mettre à l'échelle ces coordonnées tout en gardant leurs distances relatives intactes?

+0

Pourriez-vous préciser la question? Il est impossible d'escalader les points et de garder leurs distances intactes, donc je suppose que vous voulez garder les angles entre les points intacts. –

Répondre

3

Si vous voulez dire que vous ne gardez pas le rapport d'aspect: mettez simplement à l'échelle le carré de délimitation minimum au lieu du rectangle de délimitation minimum. Vous devriez choisir le facteur d'échelle le long des deux axises à max (dx, dy).

3

Vous devez les redimensionner du même facteur pour conserver les mêmes distances.

J'oublie soustrayant le minimum (Note: cette partie est vrai que si les points sont toujours positifs, ce qui est mon cas d'utilisation habituelle), et juste diviser par le maximum des deux Maxes:

maxval = max(max(A.x), max(A.y)) #or however you find these 
A.x = A.x/maxval 
A.y = A.y/maxval 
+0

Cela ne fonctionnera pas si les valeurs d'entrée peuvent être négatives. – tzaman

+0

Les valeurs d'entrée ne sont jamais négatives. J'ai aussi utilisé l'approche que vous mentionnez, mais comme mes points ne vont pas de 0.0 à 20000.0 etc, mais plus typiquement de 19000.0 à 20000.0, si je ne soustrais pas la valeur minimum, tous les points finissent dans un coin de 0-1 .... Je divise tous les points par la même valeur (maximum_value - minimum_value est toujours la même). Si je vous comprends bien, cela signifie qu'ils gardent leurs distances relatives? – eiaxlid

+0

Mon approche soustrait le point central de chaque plage, donc vous n'aurez pas le problème du 'coin'. En soustrayant le minimum fonctionne aussi, mais les données ne sont pas centrées sur '(0.5, 0.5)'. Les distances relatives doivent être maintenues tant que vous gardez le même facteur d'échelle, oui. – tzaman

10

Vous devez mettre à l'échelle les valeurs x et les valeurs y de la même quantité! Je suggère de mettre à l'échelle par la plus grande des deux gammes (soit x ou y). En pseudocode, vous auriez quelque chose comme

scale = max(maximum_x_value - minimum_x_value, 
      maximum_y_value - minimum_y_value) 

Ensuite, toutes les distances entre les points seront mis à l'échelle par scale, qui est ce que je présume que vous demandez, donc si le point p_1 était deux fois plus loin du point p_2 à partir de p_3 avant la remise à l'échelle, il sera également deux fois plus loin après le rééchelonnement. Vous devriez être capable de vous le prouver assez facilement en utilisant le théorème de Pythagore.

7

En supposant que vous voulez que votre ensemble de données soit centrée sur (0.5, 0.5) avec une gamme de (0,1) dans les deux axes, il est plus facile de penser à la transformation totale nécessaire en trois étapes:

  1. Centre des données sur l'origine :
    P.x -= (maxX + minX)/2
    P.y -= (maxY + minY)/2
  2. échelle vers le bas de la même valeur dans les deux dimensions, de telle sorte que la plus grande des deux plages devient (-0.5, 0.5):
    scale = max(maxX - minX, maxY - minY)
    P.x /= scale
    P.y /= scale
  3. Traduisez les points en (0.5, 0.5) pour apporter tout où vous voulez:
    P.x += 0.5
    P.y += 0.5

Cette approche a l'avantage de travailler parfaitement pour toutes les données d'entrée données, et en remplissant aussi bien que possible le carré de l'unité tout en conservant le rapport d'aspect (et donc les distances relatives).

+0

Vous ne savez pas si la première étape est correcte. Échoue lorsque minX/minY est inférieur à 0 et un peu faux quand il est supérieur à zéro. Essayez 'Px - = minX + ((maxX - minX)/2)' et 'Py - = minY + ((maxY - minY)/2)' – swdev

+0

@swdev vous avez raison, c'était éteint, mais la bonne réponse est juste '(max + min)/2' puisque nous voulons trouver le point milieu et soustraire par celui-ci. Fixe, merci pour le contrôle mathématique! – tzaman

4

Étape 1: relocaliser l'origine
Laissez votre nouvelle "origine" être (minimum_x_value, minimum_y_value). Décalez tous vos points de données en soustrayant minimum_x_value de toutes les coordonnées x et en soustrayant minimum_y_value de toutes les coordonnées y.

Étape 2: Normaliser les données restantes
échelle le reste de vos données vers le bas pour se loger dans la fenêtre 0,0-1,0. Trouvez max_coord comme plus grand de votre valeur x maximale ou de votre valeur y maximale. Diviser toutes les coordonnées x et y par max_coord.