2011-09-19 15 views
13

In teoria, desidero fornire una sequenza di punti e una linea tracciata ad angolo retto in ogni punto (a partire dal secondo punto).Dato 2 punti come si disegna una linea ad angolo retto rispetto alla linea formata dai due punti?

La direzione di ogni linea si alterna, quindi se mi è capitato di disegnare una curva costeggiante di 6 punti, una linea di un dato lenth sarebbe disegnata per ogni punto a partire dal secondo punto, cioè 5 linee aggiuntive sui lati alternati della curva, un po 'come un bruco con le gambe alternate.

(Comprendo che le linee non saranno interamente ad angolo retto rispetto alla curva ma piuttosto ad angolo retto rispetto alla linea formata da due punti qualsiasi sulla curva).

+0

con quale libreria disegnerai? – Bas

+0

Sto lavorando in Silverlight e uso InkPresenter, quindi penso che sia solo un caso di funzione punti. – descf

+0

http://stackoverflow.com/q/1243614/183120 ha una soluzione simile a quella di Andreas "(http://stackoverflow.com/a/7470098/183120) – legends2k

risposta

30

È una domanda di vector mathematics. È possibile calcolare il vettore di direzione tra due punti A e B sottraendo B da A. In 2D e solo in 2D il vettore a destra angolato a questo vettore può essere ottenuto invertendo il componente x e y e prendendo un componente negativo. Se si annulla il nuovo componente x, si effettuerà un giro a sinistra, annullando si effettuerà una svolta a destra. È quindi possibile ridurre il vettore di direzione alle dimensioni dell'unità (= di lunghezza 1) dividendo ciascun componente per la lunghezza del vettore (sqrt (x x + y y)). Finalmente puoi allungare nuovamente il vettore unitario della lunghezza desiderata e avere una delle dimensioni che desideri. Se aggiungi questo vettore a A o B otterrai un punto a cui vuoi disegnare la linea.

Ecco un piccolo aiuto di matematica:

sono questi i punti A e B espresso come vettore.

Il vettore regia è calcolato da una semplice sottrazione.

Il vettore normale è data girando il vettore regia, cioè invertire i componenti e fare una componente negativa. nl = normale, orientato a sinistra, nr = normale, girato verso destra

Il vettore unitario del vettore normale è data dividendo ciascun componente per la lunghezza del vettore.

calcola la lunghezza di un vettore

Se si vuole disegnare una linea da B a sinistra (per chi proviene da A) si calcola il punto P per disegnare la linea come

Quindi si desidera alternare quella volta che si disegna a sinistra e una volta a destra durante l'iterazione sui punti.

Se i punti sono all'esterno della tela, la lunghezza è probabilmente troppo grande. Ovviamente puoi calcolare il punto in cui il vettore in P attraverserebbe il confine calcolando il punto di intersezione del vettore BP e il bordo.

+1

Non riesco a superare la prima frase. Se sottraggo B da A I, è probabile che finisca con un punto fuori dalla tela. – descf

+0

Ho modificato la mia risposta, spero sia più comprensibile. Ad ogni modo il calcolo non si ferma dopo la prima frase, devi leggere tutta la risposta. Come ho detto, riduci le dimensioni del tuo vettore alla distanza unitaria e ridimensiona di nuovo la lunghezza desiderata. Se questo si trova oltre la tela, la tua lunghezza è troppo grande o la tua tela troppo piccola. – Andreas

+0

Sono rimasto molto impressionato dal fatto di essere in grado di seguire i calcoli tranne che per la riga che inizia rno = – descf

Problemi correlati