2009-12-17 18 views
10

Conosco i punti finali di un segmento di linea e la distanza/dimensione dei cappucci terminali perpendicolari che vorrei creare, ma ho bisogno di calcolare i punti finali della linea perpendicolare. Ho sbattuto la testa contro il muro usando sia i 45-45-90 triangoli che i puntini ma non riesco a farlo venire insieme.Come calcolare i punti finali dei segmenti di linea perpendicolare?

Conosco i punti in blu e la distanza dai punti in rosso, ho bisogno di trovare i punti in rosso.

Prima di contrassegnare come duplicato, ho provato la risposta pubblicata in this question ma risultava in maiuscole che erano sempre verticali.

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

+0

Dipenderà dal punto sulla linea nota in cui si desidera che la linea perpendicolare lo soddisfi anche. Il tuo diagramma di esempio sembra mostrare che si trova nel punto centrale delle linee note. – ZombieSheep

+0

sì, devono intersecarsi nel punto medio della linea rossa – basszero

+0

Correlati: [calcola un offset perpendicolare da una linea diagonale] (http://stackoverflow.com/q/17195055/183120). – legends2k

risposta

16

Se B1 è il punto blu tra i 2 punti rossi, e B2 è l'altro punto blu allora il modo per farlo è:

  • Find B1 - B2
  • Normalizzare questo vettore
  • poi scalare questo vettore dalla metà della distanza tra i punti rossi
  • ruotare di 90 gradi
  • Aggiungere questo vettore a B1 (questo è R1)
  • su btract questo vettore da B1 (Questo è R2)

Tutto quanto sopra è abbastanza semplice - il bit più difficile sarebbe capire come scriverlo nel testo!

Questo potrebbe essere utile se - matrice per ruotare di 90 gradi:

[ 0 -1 ] 
[ 1 0 ] 
+0

La semplice spiegazione del vettore inglese è esattamente ciò di cui avevo bisogno metti insieme i pezzi nella mia testa. Grazie! Peccato che tu non abbia ottenuto molti voti – basszero

3

Voi sapete la pendenza della linea blu, chiamiamolo m. E una linea perpendicolare alla linea blu avrà la pendenza -1/m.

per trovare la coordinata x è necessario qualche trig, sine \theta = d/delta_x, dove \ theta è l'angolo della linea blu per l'asse xe d è la distanza da uno dei punti rossi dal punto blu. Quindi aggiungi/sottrai delta_x alla coordinata x del punto blu in cui vuoi che la linea sia perpendicolare a. Ora puoi usare la formula del pendio del punto per calcolare la coordinata y.

+0

Ma è necessario risolvere un sistema di equazioni che coinvolgono la distanza per trasformare la forma della pendenza del punto in un segmento di linea. Speravo in una soluzione di sistema risolta – basszero

+0

sì, ho saltato un passaggio, devi prima trovare la coordinata x della formula punto-pendenza, dove entra il trigone. – nlucaroni

8

Il modo più semplice intorno a questo non è pensare in termini di pendenza m, ma piuttosto la variazione di x ed y, che Chiamo dx, dy (dalla notazione del calcolo). Il motivo è per una cosa, che trattare con una pendenza per una linea verticale è infinito, e in ogni caso, non è necessario utilizzare le funzioni trigonometriche, questo codice sarà più veloce e più semplice.

dx = x2 - x1; 
dy = y2 - y1; 

Suppongo qui che il punto 2 sia l'intersezione della linea desiderata.

Ok, quindi la linea perpendicolare ha una pendenza con il reciproco negativo del primo. Ci sono due modi per farlo:

dx2 = -dy 
dy2 = dx 

o

dx2 = dy 
dy2 = -dx 

questo corrisponde ai due direzioni, uno girando a destra e l'altro a sinistra.

Tuttavia, dx e dy vengono ridimensionati in base alla lunghezza del segmento di linea originale. La tua perpendicolare ha una lunghezza diversa.

Ecco la lunghezza tra due punti:

double length(double x1, double y1, double x2, double y2) { 
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); 
} 

fare quello che vuoi, andare da una parte o dall'altra, è:

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy); 
double dx2 = -dy * scale; 
double dy2 = dx * scale 

e poi lo stesso ancora una volta per l'altro lato . Ho appena realizzato che il mio esempio è in qualche modo C++, poiché ho usato sqrt, ma le differenze sono banali. Nota che puoi scrivere il codice in modo più efficiente, combinando le radici quadrate.

Problemi correlati