2010-03-15 11 views
5

Ho un insieme di punti quali: Pointa (3302.34,9392.32), pointB (34322.32,11102.03), eccScala le coordinate 2D e mantiene intatte le loro relative distanze euclidee?

devo scalare questi così ogni xey coordinate è nell'intervallo (0,0 - 1.0). Ho provato a farlo trovando prima il valore x più grande nel set di dati (valore_max massimo) e il valore y più grande nel set (valore_valore minimo). Poi ho fatto la seguente: (?)

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) 

Questo cambia le distanze relative, e rende pertanto i dati inutili per i miei scopi. C'è un modo per ridimensionare queste coordinate mantenendo intatte le relative distanze?

+0

Potrebbe chiarire la domanda? È impossibile scalare i punti e mantenere intatte le distanze, quindi presumo che tu voglia mantenere gli angoli tra i punti intatti. –

risposta

3

Se si intende che non si mantengono le proporzioni: basta ridimensionare al quadrato di delimitazione minimo anziché al rettangolo di limitazione minimo. Dovresti scegliere il fattore di scala lungo entrambi gli assi su max (dx, dy).

3

È necessario ridimensionarli con lo stesso fattore per mantenere le stesse distanze.

mi piacerebbe dimenticare sottraendo il minimo (Nota: questa parte è vero solo se i punti sono sempre positivi, che è il mio solito caso d'uso), e basta dividere per il maggiore dei due 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

Questo non funzionerà se i valori di input possono essere negativi. – tzaman

+0

I valori di input non sono mai negativi. Ho usato l'approccio che hai menzionato, ma poiché i miei punti non vanno da 0.0 - 20000.0 ecc, ma più tipicamente 19000.0 - 20000.0, se non sottrai il valore minimo, tutti i punti finiscono in un angolo di 0-1 .... Sto dividendo tutti i punti con lo stesso valore (valore massimo - il valore minimo è sempre lo stesso). Se ti capisco correttamente, ciò significa che mantengono le loro distanze relative? – eiaxlid

+0

Il mio approccio sottrae il punto centrale da ogni intervallo, quindi non avrai il problema 'angolo'. Sottraendo anche il minimo funziona, ma i dati non sono centrati su '(0.5, 0.5)'. Le distanze relative dovrebbero essere mantenute fintanto che si mantiene lo stesso fattore di scala, sì. – tzaman

10

È necessario ridimensionare i valori x e i valori della stessa quantità! Suggerirei il ridimensionamento in base al più grande dei due intervalli (x o). In pseudocodice, avresti qualcosa di simile

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

Poi tutte le distanze tra i punti saranno adattate dal scale, che è quello che presumo che stai chiedendo, quindi, se il punto p_1 era due volte più lontano dal punto p_2 come da p_3 prima di riscalare, sarà anche il doppio rispetto alla riscalazione. Dovresti essere in grado di dimostrarlo facilmente usando il teorema di Pitagora.

7

Supponendo che volete che il vostro intero set di dati per essere centrato su (0.5, 0.5) con una serie di (0,1) su entrambi gli assi, è più facile pensare alla trasformazione totale necessario in tre fasi:

  1. Centro i dati sulla provenienza :
    P.x -= (maxX + minX)/2
    P.y -= (maxY + minY)/2
  2. Scale giù dalla stessa quantità in entrambe le dimensioni, in modo tale che il maggiore dei due intervalli diventa (-0.5, 0.5):
    scale = max(maxX - minX, maxY - minY)
    P.x /= scale
    P.y /= scale
  3. tradurre i punti da (0.5, 0.5) di portare tutto dove vuoi:
    P.x += 0.5
    P.y += 0.5

Questo approccio ha il vantaggio di lavorare perfettamente per tutti i dati di input forniti, e anche riempiendo il più possibile l'unità quadrata mantenendo le proporzioni (e quindi le distanze relative).

+0

Non sono sicuro che il primo passaggio sia corretto. Errore quando minX/minY è minore di 0 e si presenta in modo errato se maggiore di zero. Prova 'Px - = minX + ((maxX - minX)/2)' e 'Py - = minY + ((maxY - minY)/2)' – swdev

+0

@swdev hai ragione, era spento, ma la risposta giusta è semplicemente '(max + min)/2' dal momento che vogliamo trovare il punto medio e sottrarre da esso. Risolto, grazie per il controllo di matematica! – tzaman

4

Fase 1: Re-Individuare l'origine
Si compia la tua nuova "origine" essere (minimum_x_value, minimum_y_value). Spostare tutti i punti dati sottraendo minimum_x_value da tutte le coordinate xe sottraendo minimum_y_value da tutte le coordinate y.

Fase 2: normalizzare i dati rimanenti
Scala il resto dei tuoi dati per adattarsi all'interno della finestra 0.0-1.0. Trova max_coord come il più grande tra il valore x massimo o il valore y massimo. Dividere tutte le coordinate X e Y per max_coord.

Problemi correlati