Questo è un problema di matematica. Non sono esattamente sicuro di come farlo. Il vettore non è allineato ad un asse, quindi solo ruotando di 90 gradi attorno a x, y o z non mi daranno necessariamente gli altri assi.Dato il vettore di un asse, come faccio a trovare i vettori di altri due assi?
risposta
Posso pensare a un paio di scenari diversi di cui potreste chiedere informazioni.
Dato: Un pre-esistente sistema di coordinate
In un sistema 2D, tuoi assi/basis sono sempre
[1,0]
e[0,1]
- x e y assi.In un sistema 3D, tuoi assi/base sono sempre
[1,0,0]
,[0,1,0]
e[0,0,1]
- x, y e z.
Dato: un asse in un 2D arbitraria base sistema di coordinate
Se ha un asse in un 2D arbitrario-base del sistema di coordinate, l'altro asse è il vettore ortogonale.
Per ruotare un vettore ortogonale antiorario:
[x_new, y_new] = [ -y_old, x_old]
Per ruotare un vettore ortogonale senso orario:
[x_new, y_new] = [ y_old, -x_old]
Riassumendo:
Given: x-axis = [ a, b]
Then: y-axis = [-b, a]
Given: y-axis = [ c, d]
Then: x-axis = [ d, -c]
Dato: due assi in modo arbitrario-base 3D sistema di coordinate
Per fare questo, trovare il prodotto vettoriale.
[a,b,c] x [d,e,f] = [ b*f - c*e, c*d - a*f, a*e - b*d ]
Queste seguenti tre orientamenti:
- (x asse) x (y asse) = (z asse)
- (y asse) x (z asse) = (x asse)
- (z asse) x (x asse) = (y asse)
Dato: un asse in 3D arbitraria base sistema di coordinate
c'è informazioni insufficienti per trovare la soluzione unica questo problema. Questo perché, se si guarda il secondo caso (un asse in un sistema di coordinate 2D con base arbitraria), è necessario prima trovare un vettore ortogonale. Tuttavia, ci sono una quantità infinita di possibili vettori ortogonali su un singolo asse nello spazio 3D!
È tuttavia possibile trovare una delle possibili soluzioni.
Un modo per trovare un arbitrario uno di questi vettori ortogonali, trovando ogni vettore [d,e,f]
dove:
[a,b,c] = original axis
[d,e,f] = arbitrary orthogonal axis (cannot be [0,0,0])
a*d + b*e + c*f = 0
Ad esempio, se l'asse originale è [2,3,4]
, devi risolvere:
2 * d + 3 * e + 4 * f = 0
Vale a dire, qualsiasi valore di [d,e,f]
che soddisfi questo è un vettore ortogonale soddisfacente (purché non sia [0,0,0]
). Si potrebbe raccogliere, ad esempio, [3,-2,0]
:
2 * 3 + 3 *-2 + 4 * 0 = 0
6 + -6 + 0 = 0
Come si può vedere, una "formula" che lavora per è [d,e,f] = [b,-a,0]
... ma ci sono molti altri quelli che possono funzionare pure; ci sono, infatti, un infinito!
Una volta trovato i tuoi due assi [a,b,c]
e [d,e,f]
, è possibile ridurre questo ritorno al caso precedente (caso 3), utilizzando [a,b,c]
e [d,e,f]
come i vostri assi X e Y (o qualunque assi è necessario che siano, per la vostra problema specifico).
Normalizzazione
Si noti che, come si fa continuamente prodotto scalare e prodotti incrociati, i vettori inizieranno a crescere sempre più grandi. A seconda di ciò che desideri, questo potrebbe non essere desiderato. Ad esempio, potresti desiderare che i tuoi vettori di base (i tuoi assi di coordinate) abbiano la stessa dimensione/lunghezza.
per trasformare qualsiasi vettore (eccetto [0,0,0]
) in un versore (un vettore con una lunghezza di 1, nella stessa direzione del vettore originale):
r = [a,b,c]
v = Sqrt(a^2 + b^2 + c^2) <-- this is the length of the original vector
r' = [ a/v , b/v , c/v ]
Dove r'
rappresenta l'unità vettore di r
- un vettore con lunghezza 1 che punta nella stessa direzione di r
. Un esempio:
r = [1,2,3]
v = Sqrt(1^2 + 2^2 + 3^2) = Sqrt(13) = 3.60555 <-- this is the length of the original vector
r' = [0.27735, 0.55470, 0.83205]
Ora, se avessi voluto, per esempio, un vettore nella stessa direzione di r
con una lunghezza di 5, mi piacerebbe semplicemente moltiplicare fuori r' * 5
, che è [a' * 5, b' * 5, c' * 5]
.
Stai parlando di un tipico sistema a 3 coordinate come quello utilizzato in un motore 3D?
Con un vettore non puoi trovare gli altri due, l'unica informazione che avrai l'aereo su cui giacciono .. ma possono essere a qualsiasi angolo anche se sono perpendicolari con l'unico vettore hai.
Avere un solo asse non è sufficiente, poiché c'è ancora un numero infinito di assi che possono essere nel piano perpendicolare.
Se riesci a ottenere un altro asse, puoi utilizzare il prodotto incrociato per trovare il terzo.
Come può essere vero che "Avere un solo asse non è sufficiente" quando dici immediatamente che ci sono un numero infinito di vettori adatti e nel tuo prossimo paragrafo tu dì come procedere dato che è stato trovato un vettore adatto? – sigfpe
Non collegarmi alla voce "if" su dictionary.reference.com ... –
Se si dispone di un vettore (x, y, z) è possibile ottenere un vettore perpendicolare ad esso come (y, -x, 0) (dot-prodotto x yy x + 0 * z = 0)
Quindi si ottiene il cross-product di entrambi per ottenere il vettore perpendicolare rimanente: (x, y, z) × (y, -x, 0) = (0y + zx, yz-0x, -x²- y²) = (zx, yz, -x²-y²)
- 1. Dato un insieme di punti, come faccio a trovare i due punti più distanti l'uno dall'altro?
- 2. Dato 3 punti, come faccio a calcolare il vettore normale?
- 3. Trovare combinazioni di parole in due vettori
- 4. generando un vettore di differenza tra due vettori
- 5. come eseguire il pushback su un vettore di vettori?
- 6. Incollare due vettori con combinazioni di elementi tutti i vettori
- 7. dato due alberi di directory come trovare i file uguali?
- 8. C++ vettore di vettori
- 9. vettore di vettori push_back
- 10. Trovare gli altri due attraversamenti di un albero binario quando viene dato solo un attraversamento
- 11. I grafici di Google possono supportare il doppio asse y (asse v)?
- 12. Trovare un vettore all'interno di un vettore
- 13. Inizializzazione di un vettore di vettori?
- 14. Come posso ottenere caratteri comuni a due vettori in C++?
- 15. Come ordinare il vettore di punti in base a un asse Y?
- 16. Clojure: Iterating su un vettore di vettori per trovare il primo vettore che soddisfa una determinata condizione
- 17. Il modo più veloce per convertire da vettore di coppie a due vettori indipendenti in C++
- 18. inizializzazione uniforme su un vettore di vettori di interi
- 19. Merge vettore di vettori in un unico vettore
- 20. array di vettori o vettore di array?
- 21. Dato un elemento di una lista, come faccio a recuperare il suo indice all'interno della lista?
- 22. Come faccio a scorrere su un vettore di stringhe C++?
- 23. Come calcolare la direzione media di due vettori
- 24. Come faccio a sommare un vettore usando la piega?
- 25. R + combina un elenco di vettori in un singolo vettore
- 26. Divisione due vettori
- 27. Come faccio a trovare l'area di sovrapposizione tra i due poligoni arbitrari
- 28. Prevedere il vettore di occupazione binaria dalla storia dei vettori
- 29. Unisci due vettori STL con un modello di alternanza
- 30. Come faccio a trovare "i" con Turkish i in java?
Se sta usando la simulazione o il software di gioco, potrebbe avere la rotazione degli oggetti, il che renderebbe abbastanza facile trovare gli altri due assi. – LanceH
La domanda è onestamente piuttosto vaga =/ –
Quindi in sintesi poi Justin: Innanzitutto si usa la regola del prodotto punto che due vettori ortogonali hanno un punto prodotto zero, per ottenere il secondo asse. Quindi utilizzare il prodotto incrociato di questi due assi per ottenere il 3o asse. Capisco tutto questo. L'unica domanda che ho è come si ottiene l'asse ortogonale arbitrario di dire un vettore di {4.418020, -6.474061, -6.210284} – Stoff81