2010-01-23 22 views
19

Vorrei calcolare la distanza tra due coordinate x/y sulla superficie di a torus. Quindi, questa è una griglia normale che ha la proprietà che i suoi angoli e lati sono "connessi". Ad esempio, su una griglia di 500 x 500, il punto in (499, 499) è adiacente a (0, 0) e la distanza tra ad es. (0,0) e (0,495) dovrebbero essere 5.Calcola la distanza tra due coordinate x/y?

Esiste un buon modo matematico per calcolare questo?

+5

Sì, c'è. :-) –

+1

Stai scegliendo sempre la distanza più breve o stai specificando una direzione? In altre parole, perché la distanza sarebbe 5 anziché 495, o potrebbe essere o, a seconda di come si voleva disegnare la linea? –

+0

Sì, si tratta della distanza più breve ... – Ropstah

risposta

48

Quindi io cerco la distanza euclidea sulla superficie bidimensionale di un toro.

sqrt(min(|x1 - x2|, w - |x1 - x2|)^2 + min(|y1 - y2|, h - |y1-y2|)^2) 

dove w e h sono la larghezza (x) e l'altezza (y) della griglia, rispettivamente.

+1

+1, penso che la tua risposta sia più matematica della mia :) – Yoni

+0

Elegante! Matematico! Upvoted! –

+0

Soluzione molto bella. –

6
  • Se/mentre la distanza tra le coordinate x è maggiore della metà della dimensione X della griglia, aggiungere la dimensione X della griglia alla coordinata x più piccola.
  • Fare lo stesso per Y.
  • Quindi calcolare la distanza.
+0

Buona spiegazione dei fatti :) – Ropstah

1

per i punti (x1, y1) e (x2, y2), è necessario calcolare 4 distanze:

  • da (x1, y1) a (x2, y2)
  • da (x1, y1) a (x2, 500-y2)
  • da (x1, y1) a (500-x2, y2)
  • da (x1, y1) a (500-x2, 500-y2)

e poi prendi il minimo di quelli.

+0

Questo non funziona: provalo con (0,200) e (0,300). Questo dà una distanza di 0 con la seconda formula! Inoltre, come indicato (o almeno implicito) in altre risposte, è possibile calcolare prima le distanze x e distanza più corte y; allora hai solo bisogno di applicare il teorema di Pitagora una volta. – BobS

+0

grazie, sono stato corretto – Yoni

3

Se la griglia si avvolge attorno ai bordi, ci saranno quattro distanze tra ciascuna coordinata (per 2 dimensioni). Suppongo che tu voglia conoscere la distanza più breve.

Utilizziamo una griglia più piccola, i numeri sono un po 'più gestibili. Supponi che la griglia sia 10x10. Usiamo anche solo una dimensione per semplicità (nel qual caso ci saranno solo due distanze), proprio come nel tuo esempio. Diciamo che abbiamo i punti 0,2 e 0,6. Le due distanze tra i punti sono d_1 = (6-2) = 4 e d_2 = (10-6) + 2 = 6, quindi in questo caso la distanza più breve sarebbe d_1.

In generale, è possibile eseguire le seguenti operazioni:

  • Per ciascuna coordinata:
    • sottrarre il più piccolo dal numero maggiore
    • se il risultato è maggiore della metà della larghezza della griglia la distanza più breve in questa coordinata è la larghezza della griglia meno il risultato
    • se il risultato è meno della metà della larghezza della griglia, la distanza più breve in questa coordinata è il risultato

Quindi utilizzando teorema di Pitagora, la distanza più breve tra i due punti è la radice quadrata della somma dei quadrati delle distanze più brevi in ​​ogni direzione. Puoi calcolare le altre tre distanze calcolando il teorema di Pitagora usando le altre combinazioni di distanze in ogni direzione.

Come un altro poster ha detto, la forma formata quando ci si avvolge attorno ai bordi (per una griglia bidimensionale) è un toroide e penso che il metodo che ho usato sopra sia lo stesso dell'equazione data ma abbia il vantaggio che può essere esteso a n-dimensioni, se necessario. Sfortunatamente non c'è una visualizzazione facile sopra le 2 dimensioni.

+0

In aumento per una spiegazione dettagliata. –

Problemi correlati