2011-10-12 21 views
18

Sto cercando di trovare un modo per estendere un segmento di linea di una distanza specifica. Per esempio se ho un segmento di linea che inizia con 10,10 che si estende a 20,13 e voglio estendere la lunghezza di 3 come faccio a calcolare il nuovo endpoint. Posso ottenere la lunghezza di sqrt (a^2 + b^2) in questo esempio 10.44, quindi se volessi sapere il nuovo endpoint da 10,10 con una lunghezza di 13,44 quale sarebbe il più veloce dal punto di vista computazionale? Conosco anche la pendenza, ma non so se questo mi aiuti in questo caso.Estensione di un segmento di linea a una distanza specifica

+1

Questa non è una domanda di programmazione, ma una semplice matematica, che devi quindi espandere al tuo codice. – Constantinius

+3

@Constantinius È ancora una domanda sull'algoritmo, solo una basata sulla matematica (su cui l'informatica è estremamente pesante). – corsiKa

+0

@glowcoder: non sono d'accordo. Senza capire la matematica sottostante, non c'è dubbio che fallisca nel suo compito. D'altra parte, se ha familiarità con la matematica, è un compito banale tradurlo in codice di programma. – Constantinius

risposta

35

È possibile farlo trovando il vettore unitario del segmento di linea e ridimensionarlo alla lunghezza desiderata, quindi tradurre il punto finale del segmento di linea con questo vettore. Supponiamo che i punti finali del segmento di linea siano A e B e che si desideri estendere dopo il punto finale B (e lenAB è la lunghezza del segmento di linea).

#include <math.h> // Needed for pow and sqrt. 
struct Point 
{ 
    double x; 
    double y; 
} 

... 

struct Point A, B, C; 
double lenAB; 

... 

lenAB = sqrt(pow(A.x - B.x, 2.0) + pow(A.y - B.y, 2.0)); 
C.x = B.x + (B.x - A.x)/lenAB * length; 
C.y = B.y + (B.y - A.y)/lenAB * length; 
+10

dove lenAB = sqrt ((A.x - B.x) ** 2 + (A.y - B.y) ** 2) –

+0

questa soluzione sembra funzionare il più veloce. Grazie per il tuo aiuto – goodgulf

+2

nel caso ti stia chiedendo da dove viene (Bx - Ax)/lenAB * la lunghezza è la stessa di cos (slope_alpha) * lunghezza ... mi ha aiutato – fersarr

7

Se hai già la pendenza è possibile calcolare il nuovo punto:

x = old_x + length * cos(alpha); 
y = old_y + length * sin(alpha); 

non ho fatto questo in un po 'in modo da prendere con un grano di sale.

+4

dove alfa = atan2 (y-old_y, x-old_x) –

+0

Grazie per il vostro aiuto, questa soluzione sembra un po 'più lenta della soluzione inferiore. Apprezzo l'aiuto, anche questo ha funzionato. – goodgulf

3

Ho appena inciampato su questo dopo una ricerca di questo me stesso, e per darvi una soluzione out-of-the-box, si può avere uno sguardo al codice all'interno di una classe Vector standard (in qualsiasi lingua) e ciliegina scegliere quali parti hai bisogno, ma ho finito per usarne uno e il codice assomiglia a questo:

vector.set(x,y); 
vector.normalize(); 
vector.multiply(10000);// scale it by the amount that you want 

Buona fortuna!

+0

Penso che questa sia la risposta più elegante –

Problemi correlati