Trova un vettore di unità esattamente a metà strada tra due segmenti di linea collegati


8

Sembra una domanda semplice e veloce ma non sono stato in grado di trovare esattamente quello che sto cercando, quindi:

Come calcolare un vettore di lunghezza unitaria che punta lungo la linea che è esattamente il 50% dell'angolo di due segmenti di linea collegati?

Un'immagine parla di migliaia di parole (che sono anche meglio della mia spiegazione!) Esempio di un vettore unitario che taglia in due segmenti di linea collegati
Quindi, in sostanza, voglio calcolare il vettore di unità blu dati i due segmenti di linea rossa (che in realtà sono 3 punti e quindi sono garantiti per essere collegati)

I segmenti rossi sono di lunghezza arbitraria e il risultato non deve essere un'unità, sarebbe solo più facile per me.
Sarebbe anche utile avere un modo per forzare il vettore risultante a puntare in una certa direzione (rispetto ai segmenti di input), questo non è essenziale in quanto penso di poterlo elaborare - poiché i segmenti della linea di input alla fine si formano un n-gon.

Qualsiasi esempio sarebbe ideale in C ++ per favore, ma altre lingue sono benvenute.

Mille grazie per eventuali suggerimenti.

Risposte:


13

Crea e normalizza due vettori dal tuo segmento rosso, partendo dal loro vertice comune, quindi aggiungi i risultati (componente per componente). Quindi è possibile normalizzare l'output se si desidera ottenere un vettore di unità.

Il problema è che finirai sempre nel secondo caso, perché l'angolo tra 2 vettori sarà sempre inferiore a 180 °. Ma ovviamente puoi semplicemente creare il vettore opposto e vedere quale si adatta meglio al tuo scopo.

Inoltre c'è un caso speciale in cui entrambi i vettori sono allineati e la media sarà 0 (ma puoi facilmente rilevarlo).


Eccellente, penso che sia esattamente quello che sto cercando! Sapevo che era facile :) Lascerò aperto solo per vedere quali altre risposte ottengo ... Grazie
Adam Naylor,

Stavo per scrivere un metodo più complesso che coinvolge il prodotto punto anche se ho già usato questo metodo semplice prima, doh!
CiscoIPPhone

Cosa intendi con "Il problema è che finirai sempre col secondo caso"?
CiscoIPPhone

@CiscoIPPhone Credo che si riferisca al mio diagramma. Una soluzione punto prodotto è più che benvenuta CiscoIPPhone, almeno gli darò un +1 :)
Adam Naylor,

In effetti mi riferivo alla tua immagine. Usando un prodotto punto, puoi ottenere l'angolo tra i due vettori, ma rimarrà sotto i 180 °.
XGouchet,

1

Penso che puoi ottenere la direzione per essere coerente trattandola come se stessi generando un vertice 2D normale. Questo è:

  1. Prendi ciascuno dei vettori rossi, scambia i componenti xey e annulla uno di essi per creare le normali.

  2. Normalizzali.

  3. Somma quei due vettori e rinormalizza.

Probabilmente vorrai anche testare il caso in cui le due linee rosse si sovrappongono: la rinormalizzazione finale proverà a dividere per zero lì.


Grazie Adam, questo approccio ha un nome? Vorrei approfondire ulteriormente ...
Adam Naylor,

Non che io sappia. Il normale trucco per la generazione di vettori è spiegato su stackoverflow.com/questions/1243614/…
Adam

0

Lascia che A e B siano i tuoi vettori:

risultato

I vettori sommatori non devono necessariamente essere vettori unitari ma semplicemente uguali in lunghezza, quindi, se | A | > = | B |, puoi:

risultato equivalente

che è più numericamente stabile poiché hai solo una frazione e il denominatore più grande

come funziona la somma

Lo stesso risultato può essere ottenuto per sottrazione, ancora una volta i vettori devono avere la stessa lunghezza

Questo funziona solo per angoli non convessi; puoi semplicemente verificare se il tuo angolo è convesso e moltiplicare H per -1


Non penso che funzionerà se | A | ! = | B | ... considera A = [0,1] B = [100,0], il risultato non è [.707, .707]
Richard Fabian,

@Richard Fabian Hai ragione, ho dimenticato la disuguaglianza del Triangolo!
FxIII,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.