Los programadores de gráficos usan
cuaterniones para grabar giros tridimensionales. Sin embargo, los
cuaterniones son difíciles de entender porque se estudian superficialmente . Simplemente tomamos tablas de multiplicación extrañas y otras definiciones crípticas sobre la fe, y las usamos como "cajas negras" que rotan vectores según sea necesario. Porque
mathbfi2= mathbfj2= mathbfk2=−1 y
mathbfi mathbfj= mathbfk ? ¿Por qué tomamos un vector y lo convertimos en un vector "imaginario" para transformarlo, por ejemplo
mathbfq(x mathbfi+y mathbfj+z mathbfk) mathbfq∗ ? Pero a quién le importa si todo funciona, ¿verdad?
Hay una manera de describir rotaciones llamada
rotor , que se refiere al campo de los números complejos (en 2D) y los cuaterniones (en 3D), e incluso se generaliza a cualquier cantidad de dimensiones.
Podemos crear rotores
casi por completo desde cero , en lugar de definir los cuaterniones de la nada y tratar de explicar cómo funcionan de manera
retroactiva . Lleva más tiempo, pero me parece que vale la pena, ¡porque son mucho más fáciles de entender!
Además, para la visualización y comprensión de rotores tridimensionales, no es necesario utilizar la cuarta dimensión espacial.
Sería genial si comenzaran a suplantar el uso y el estudio de los cuaterniones, reemplazándolos por rotores. Reemplazarlos es muy simple, pero el
código seguirá siendo casi el mismo . Todo lo que se puede hacer con cuaterniones, por ejemplo, interpolar y quitar bloqueos de eje (bloqueo de cardán), se puede hacer con rotores.
Pero comenzamos a entender mucho más.(En el artículo original, todos los gráficos son interactivos y al artículo le sigue un video. Al hacer clic en los botones de reproducción, puede comenzar la sección correspondiente del video. También puede hacer clic en el botón de transición debajo del video para ir a la sección correspondiente del artículo. Puede expandir la ventana para que haya más espacio para el video , o establezca un tamaño constante para ello).
1. Torneado de planos
1.1. Los giros se realizan en planos bidimensionales.
En el espacio tridimensional, generalmente percibimos giros que ocurren alrededor de los ejes, como una rueda que gira sobre un eje, pero en cambio sería más correcto representar el plano en el que se encuentra la rueda. Este plano es perpendicular al eje.
Esta anciana hace girar una rueda en el avión. mathbfxz perpendicular al eje mathbfy .Esto sucede porque si dividimos el vector en dos partes, una de las cuales se encuentra en el plano (
mathbfv parallel ), y el otro está afuera (
mathbfv perp ), la rotación rota la parte interna y la externa permanece sin cambios.
Rotación en el plano yx [ en el artículo original esta animación y la cámara se pueden mover ]En el espacio bidimensional solo hay un plano en el que es posible la rotación (
no hay una parte externa ). Por lo tanto, asumir que las rotaciones ocurren alrededor del tercer eje (perpendicular al plano 2D) es estrictamente hablando incorrecto, porque para completar las rotaciones no debemos agregar otra dimensión.
Si le contamos al “propietario de terreno plano” bidimensional (que vive dentro del plano 2D y nunca salió del espacio bidimensional) sobre el eje de rotación perpendicular, entonces él preguntaría: “¿En qué dirección apunta este eje? ¡No puedo imaginarla! "
NotaY en las dimensiones superiores (4D y superiores) es imposible determinar un vector normal para el plano 2D (por ejemplo, en 4D el plano 2D tiene dos direcciones de normales, en 5D hay tres direcciones de normales, y en nD su n−2 )
1.2. La dirección exacta de las curvas.
Además, cuando pensamos en la rotación alrededor de un eje, la dirección de rotación no está definida y, por lo tanto, debe determinarse mediante una regla (la llamada "regla de la mano derecha").
Sin embargo, si suponemos que los giros ocurren dentro de los planos, entonces la dirección se vuelve clara: rotación en el plano
mathbfxy significa una rotación que mueve un vector (unidad)
mathbfx al vector (unidad)
mathbfy dentro del avión se forman juntos. Rotación en el plano
mathbfyx Es una rotación en la dirección opuesta: mueve el vector
mathbfy al vector
mathbfx .
NotaRecuerdo que cuando supe por primera vez acerca de tres matrices de rotaciones 3D a lo largo de planos ortogonales, primero pensé: qué demonios es una matriz mathbfRy tiene el signo opuesto? Esto se debe a la regla de la mano derecha, según la cual debemos determinar la rotación alrededor del eje. mathbfy para que se ejecute desde mathbfz a mathbfx no de mathbfx a mathbfz para mantener una dirección de rotación constante "diestra". Cuando comenzamos a hablar directamente sobre el avión en sí, esta regla se vuelve innecesaria.
R_X (\ theta) = \ begin {bmatrix} 1 & 0 & 0 \\ 0 & cos (\ theta) & -sin (\ theta) \\ 0 & sin (\ theta) & cos (\ theta) \ end {bmatrix} \: \: \: R_Y (\ theta) = \ begin {bmatrix} cos (\ theta) & 0 & \ bbox [5px, border-bottom: 2px solid red] {\ \} sin (\ theta) \\ 0 & 1 & 0 \\ \ bbox [5px, border-bottom: 2px solid red] {-} sin (\ theta) & 0 & cos (\ theta) \ end {bmatrix} \: \: \: R_Z (\ theta) = \ begin {bmatrix} cos (\ theta) & -sin (\ theta) & 0 \\ sin (\ theta) & cos (\ theta) & 0 \\ 0 & 0 & 1 \ end {bmatrix }
2. Bivectores
2.1. Trabajo externo
Para calcular el eje de rotación al girar un vector
mathbfa a otro vector
mathbfb Tomamos el producto vectorial de dos vectores para obtener un vector perpendicular a ambos. Pero, ¿por qué necesitamos "abandonar" el plano si la rotación es esencialmente una operación bidimensional?
En cambio, tomamos lo que se llama
un producto externo (también conocido como producto vectorial bidimensional), dos vectores, creando un nuevo elemento llamado "bivector" (o 2-vector)
mathbfB representando el plano que dos vectores forman juntos. Si un producto vectorial crea
un vector normal para el plano, entonces el producto externo crea
el plano mismo . El cálculo de lo normal al plano es irrelevante.
mathbfB= mathbfa wedge mathbfb
mathbfB se puede representar como un paralelogramo construido a partir de vectores
mathbfa y
mathbfb en el plano que juntos forman.
Al principio, la idea de un bivector puede parecer extraña, pero pronto veremos que son casi tan
fundamentales como los propios vectores . Si el vector se puede comparar con una línea recta, entonces el bivector es similar a un plano ... Las propiedades de un producto externo capturan las propiedades importantes de los planos.
2.2. La base para bivectores
Los bivectores, como los vectores, tienen componentes. Pero se determinan sobre la base de
planos , y no de
líneas rectas , como los vectores.
Tres planos basales ortogonales son
mathbfx wedge mathbfy ,
mathbfx wedge mathbfz y
mathbfy wedge mathbfz como vemos en la figura.
Pero primero, veamos un caso bidimensional más simple ...
2.3. Bivectores bidimensionales
En 2D, solo hay un plano, a saber
mathbfxy . Es decir, un bivector bidimensional tiene un solo componente. Para un bivector compuesto de vectores
mathbfa y
mathbfb es el numero
Bxy igual al área (con un signo) del paralelogramo formado por dos vectores.
mathbfB= mathbfa wedge mathbfb=Bxy( mathbfx wedge mathbfy)
En el artículo original con un bivector 2D, puede experimentar en el gráfico interactivo cambiando los vectores (únicos) de los que está compuesto:
Puede ver que cuando el ángulo entre los vectores cambia, el área del paralelogramo cambia (de acuerdo con el seno del ángulo).
Si los vectores son iguales o paralelos, entonces no forman un plano regular y el resultado será cero. Esta propiedad simple define qué es un bivector:
mathbfa wedge mathbfa=0
Mirando la suma de dos vectores, puede ver que la propiedad sigue:
\ begin {eqnarray} (\ mathbf {a} + \ mathbf {b}) \ wedge (\ mathbf {a} + \ mathbf {b}) & = & 0 \\ \ mathbf {a} \ wedge \ mathbf { a} + \ mathbf {b} \ wedge \ mathbf {a} + \ mathbf {a} \ wedge \ mathbf {b} + \ mathbf {b} \ wedge \ mathbf {b} & = & 0 \\ \ mathbf { b} \ wedge \ mathbf {a} + \ mathbf {a} \ wedge \ mathbf {b} & = & 0 \ end {eqnarray}
Por lo tanto:
mathbfa wedge mathbfb=− mathbfb wedge mathbfa
Al igual que la
dirección de rotación , el orden de los argumentos en el trabajo externo es importante. Reordenar los argumentos cambia el signo del resultado (esto se llama "antisimetría").
En el gráfico, el signo se indica con un color que cambia de azul a verde. El signo cambia cuando el turno de
mathbfa en
mathbfb se mueve de derecha a izquierda (es decir, si coincide con la dirección (de
mathbfx a
mathbfy ) o dirección (desde
mathbfy a
mathbfx )).
Puede ver que las propiedades del producto externo están organizadas de modo que transmitan las propiedades de planos y giros.
2.4. Bivectores bidimensionales de vectores no unitarios
Obviamente, los vectores no tienen que ser de longitud unitaria, y esta restricción se ha eliminado en este gráfico:
El área del paralelogramo con un signo es proporcional a las longitudes de ambos vectores:
Bxy=sin( alpha) |a | |b | donde
alpha Es el ángulo entre
mathbfa y
mathbfb . Es decir, por ejemplo, al duplicar la longitud de un vector, el área se duplica.
Podemos obtener el verdadero valor sustituyendo los vectores como componentes:
\ begin {eqnarray} \ mathbf {a} \ wedge \ mathbf {b} & = & (a_x \ mathbf {x} + a_y \ mathbf {y}) \ wedge (b_x \ mathbf {x} + b_y \ mathbf { y}) \\ & = & a_x b_x (\ mathbf {x} \ wedge \ mathbf {x}) + a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) + a_y b_x (\ mathbf {y} \ wedge \ mathbf {x}) + a_y b_y (\ mathbf {y} \ wedge \ mathbf {y}) \\ & = & a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) + a_y b_x ( \ mathbf {y} \ wedge \ mathbf {x}) \\ & = & a_x b_y (\ mathbf {x} \ wedge \ mathbf {y}) - a_y b_x (\ mathbf {x} \ wedge \ mathbf {y} ) \\ & = & (a_x b_y - a_y b_x) (\ mathbf {x} \ wedge \ mathbf {y}) \ end {eqnarray}
Bxy=axby−bxay
2.5. Bivectores 3D
Igual que las coordenadas vectoriales
mathbfv pueden considerarse
proyecciones del vector en tres ejes básicos ortogonales (
mathbfx ,
mathbfy ,
mathbfz ), las coordenadas del bivector
mathbfB Se pueden considerar
proyecciones más pequeñas que un plano en tres planos basales ortogonales.
Las proyecciones del vector son las
longitudes de este vector a lo largo de cada vector base, y las proyecciones del bivector son las
áreas del plano en cada plano base.
Para el vector:
mathbfv= bbox[5px,bordeinferior:2pxrojosólido]vx mathbfx+ bbox[5px,bordeinferior:2pxverdesólido]vy mathbfy+ bbox[5px,bordeinferior:2pxazulsólido]vz mathbfz
Para bivector:
mathbfB= bbox[5px,bordeinferior:2pxcoralsólido]Bxy( mathbfx wedge mathbfy)+ bbox[5px,bordeinferior:2pxorosólido]Bxz( mathbfx wedge mathbfz)+ bbox[5px,bordeinferior:2pxDarkVioletsólido]Byz( mathbfy wedge mathbfz)
Donde
Bxy ,
Bxz ,
Byz Son solo números como
vx ,
vy ,
vz (están subrayados por los colores correspondientes a los colores en el gráfico).
Los componentes de un bivector 3D son solo tres proyecciones 2D de un bivector en un plano 2D básico.
Usando el mismo método que antes, encontramos que los valores verdaderos de los componentes se parecen mucho al componente XY del caso bidimensional, pero se aplican a los tres planos:
Bxy=axby−bxay
Bxz=axbz−bxaz
Byz=aybz−byaz
Puede experimentar con un bivector 3D en un gráfico interactivo en el artículo original:
NotaNorma de bivector | mathbfB |= | mathbfa wedge mathbfb | se determina de manera similar a la norma del vector (la raíz cuadrada de la suma de los cuadrados de los componentes). Esto es igual al área del paralelogramo formado mathbfa y mathbfb es decir | mathbfa wedge mathbfb |= midsin( alpha) mid | mathbfa | | mathbfb | donde alpha - ángulo entre mathbfa y mathbfb .
Si dividimos el bivector por su norma, entonces reducimos las dos longitudes de los vectores y el valor (absoluto) del seno del ángulo, es decir, tendremos el bivector
hat mathbfB , que se construirá como si los dos vectores fueran inicialmente perpendiculares y tuvieran una longitud unitaria. Esta es una representación muy limpia de un plano que contiene ambos vectores. Entonces
mathbfB=| mathbfa | ||mathbfb | midsin( alpha) mid hat mathbfB
¿Algo te recuerda a un trabajo externo? En 3D, la definición de un trabajo externo es muy similar a la definición de un trabajo vectorial. De hecho, un vector en 3D obtenido de un producto vectorial (por ejemplo, un vector normal) tendrá tres componentes iguales a los componentes del bivector (los números serán los mismos, pero la base es diferente).
$$ display $$ \ begin {eqnarray} \ mathbf {a} \ wedge \ mathbf {b} & = & & (a_x b_y - b_x a_y) (\ mathbf {x} \ wedge \ mathbf {y}) \\ & & + & (a_x b_z - b_x a_z) (\ mathbf {x} \ wedge \ mathbf {z}) \\ & & + & (a_y b_z - b_y a_z) (\ mathbf {y} \ wedge \ mathbf {z} ) \\ \\ \ mathbf {a} \ times \ mathbf {b} & = & & (a_x b_y - b_x a_y) \ \ mathbf {z} \\ & & - & (a_x b_z - b_x a_z) \ \ mathbf {y} \\ & & + & (a_y b_z - b_y a_z) \ \ mathbf {x} \ end {eqnarray} $$ display $$
La definición de un bivector tiene un significado geométrico y no aparece de la nada. Recuerdo que cuando estudié productos vectoriales, pensé: “¿Qué demonios devuelve un vector cuya longitud es igual al área del paralelogramo formado por estos dos vectores? Parece tan al azar. ¿Y por qué podemos convertir
el área del paralelogramo en la
longitud del vector?
2.6. Semántica de vectores y bivectores.
En 3D, el bivector tiene tres coordenadas, una por plano: (
mathbfxy ,
mathbfxz y
mathbfyz ) Los vectores también tienen tres coordenadas, una por eje (
mathbfx ,
mathbfy y
mathbfz ) Cada plano es perpendicular a un eje. Esta coincidencia surge solo en tres dimensiones
(*) y es por eso
que constantemente confundimos bivectores con vectores .
(*)En 2D, solo hay un bivector básico ( mathbfxy ), y en 3D hay 3 bivectores básicos ( mathbfxy , mathbfxz , mathbfyz ), en 4D hay 6 bivectores básicos ( mathbfxy , mathbfxz , mathbfxw , mathbfyz , mathbfyw , mathbfzw ) y así sucesivamente ...
En programación, ambos tienen el mismo diseño de memoria, pero diferentes operaciones. Usar un vector 3D en lugar de un bivector 3D es similar a una "conversión de tipo" de un bivector.
Aquí hay un ejemplo: podría ver que los vectores normales se transforman de manera diferente a los vectores ordinarios utilizando la matriz de "transferencia inversa"
( mathbfMT)−1 , en lugar de la matriz misma. Esto se debe a que, de hecho, en realidad no son vectores, sino bivectores, que se convierten en vectores por "conversión de tipo". En física, hay un truco llamado "vector axial", que se introdujo para distinguir los vectores obtenidos por el producto vectorial de los vectores ordinarios. Un bivector es un verdadero "tipo" de un objeto y debe ser percibido y procesado en consecuencia.
Trivectores
Podemos continuar tomando un producto externo para obtener no solo áreas 2D orientadas, sino también volúmenes 3D orientados. Trivector T se puede obtener haciendo el producto externo dos veces:
mathbfT= mathbfa wedge mathbfb wedge mathbfc
En el espacio tridimensional, todo termina allí. Al igual que en 2D, donde solo hay un plano que llena todo el espacio 2D, en 3D solo hay un volumen que llena todo el espacio 3D.
[Pero en nD, podemos continuar creando vectores de productos externos aún más grandes hasta que alcancemos la enésima dimensión. Por ejemplo, en 4D, tenemos cuatro trivctores básicos (3 vectores) ( mathbfxyz , mathbfxyw , mathbfxwz , mathbfyzw ) y un 4-vector básico mathbfxyzw ]
En 3D, el trivector tiene solo un componente básico ( Txyz ) igual al volumen del paralelepípedo formado por tres vectores. El producto externo triple es una versión mejorada del producto triple escalar ( ( mathbfa times mathbfb) cdot mathbfc ), debido a que involucra solo un tipo de operación, devuelve el tipo correcto (volumen en lugar de un escalar) y funciona en cualquier cantidad de dimensiones.
mathbfT=Txyz mathbfx wedge mathbfy wedge mathbfz
3. El producto geométrico
3.1. Multiplicación de vectores entre sí
Producto geométrico
mathbfab (denotado sin un símbolo) es otra operación que se puede realizar con vectores. El producto geométrico se define para que los vectores sean cantidades inversas (p. Ej.
mathbfa mathbfa−1=1 , donde 1 es solo el número 1!) y tiene propiedades convenientes, por ejemplo, asociatividad (
mathbfa( mathbfb mathbfc)=( mathbfa mathbfb) mathbfc ) El propósito de esto es poder multiplicar vectores para que (como es el caso de las matrices) la multiplicación corresponda a operaciones geométricas.
NotaTener valores inversos es útil porque sea cual sea el objeto mathbfa mathbfa−1 , no afectará a los vectores, es decir, se comportará igual que al multiplicar el número por 1.
Para definir un producto, primero notamos que es posible dividir un producto (o cualquier función que tome dos argumentos) en la suma de la parte que no cambia si intercambiamos los argumentos y la parte que cambia de la siguiente manera:
\ begin {eqnarray} \ mathbf {a} \ mathbf {b} & = & \ frac {1} {2} (\ mathbf {a} \ mathbf {b} + \ mathbf {a} \ mathbf {b} + \ mathbf {b} \ mathbf {a} - \ mathbf {b} \ mathbf {a}) \\ & = & \ frac {1} {2} (\ mathbf {a} \ mathbf {b} + \ mathbf { b} \ mathbf {a}) + \ frac {1} {2} (\ mathbf {a} \ mathbf {b} - \ mathbf {b} \ mathbf {a}) \ end {eqnarray}
El primer término ya no depende del orden de los argumentos.
mathbfa y
mathbfb (se llama la parte "simétrica"), y el segundo término cambia de signo al cambiar los lugares de los argumentos (se llama la parte "antisimétrica").
El producto escalar de dos vectores (también llamado producto interno) es simétrico y es una medida de distancia (
mathbfa cdot mathbfa= | mathbfa |2 ), por lo tanto, desde un punto de vista geométrico, parece útil que lo hagamos igual a la parte simétrica:
frac12( mathbfa mathbfb+ mathbfb mathbfa)= mathbfa cdot mathbfb
De manera similar, el producto externo de dos vectores es antisimétrico, por lo que sería útil equipararlo a la parte antisimétrica:
frac12( mathbfa mathbfb− mathbfb mathbfa)= mathbfa wedge mathbfb
Además, el producto escalar contiene el
coseno del ángulo entre dos vectores (
mathbfa cdot mathbfb= | mathbfa | | mathbfb |cos( alpha) ), mientras que el producto externo contiene el
seno del ángulo. Juntos, describen completamente el ángulo entre los vectores, así como el plano que forman.
NotaEs la integridad de la descripción lo que hace que el trabajo sea reversible, porque podemos pasar de un vector a otro con la ayuda de la información contenida en su trabajo. Si te doy mathbfa y mathbfa mathbfb entonces puedes conseguir mathbfb . Esto es imposible de hacer, conociendo solo el coseno o solo el seno / plano.
Es decir, el producto geométrico es igual a:
mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa wedge mathbfb
Esto es extraño porque multiplicar dos vectores da la suma de dos cosas diferentes: un escalar y un bivector. Sin embargo, esto es similar a cómo un número complejo es la suma de un número escalar y un número "imaginario", por lo que ya podría acostumbrarse a él. Aquí, la parte bivector corresponde a la parte "imaginaria" del número complejo.
Solo que este no es un valor "imaginario", ¡es solo un bivector que realmente podemos mostrar gráficamente!De hecho, multiplicando dos vectores, calculamos sus propiedades útiles ("la longitud de sus proyecciones entre sí" / "coseno del ángulo" (
mathbfa cdot mathbfb ) y "el plano que forman juntos" / "el seno del ángulo" (
mathbfa wedge mathbfb )), que conectamos juntos con un signo más. Un producto geométrico también proporciona operaciones de "grupos de propiedades" que pueden aplicarse a ellos, y estas operaciones tienen interpretaciones geométricas (por ejemplo: rotación y reflexión de vectores). Esto lo veremos pronto.
Puede expresar el producto geométrico en términos de seno y coseno:
mathbfa mathbfb= | mathbfa | | mathbfb |(cos( alpha)+sin( alpha) mathbfB) donde
mathbfB Es un bivector de ambos vectores en el plano, compuesto por dos unidades de vectores perpendiculares.
3.2. Tabla de multiplicación
La tabla de multiplicación nos permite hacer que el producto sea más específico: veamos qué sucede si obtenemos los productos de los vectores base (
mathbfx ,
mathbfy ,
mathbfz )
Para cualquier vector base, por ejemplo un eje
mathbfx , el resultado será igual
1 :
mathbfx mathbfx= mathbfx cdot mathbfx+ mathbfx wedge mathbfx=1
Para cualquier par de vectores base, por ejemplo, ejes
mathbfx y
mathbfy , el resultado será un bivector, que juntos forman:
mathbfx mathbfy= mathbfx cdot mathbfy+ mathbfx wedge mathbfy= mathbfx wedge mathbfy$
(es decir, podemos nombrar
mathbfx wedge mathbfy solo
mathbfx mathbfy , ya que este es uno y el mismo!)
Esto nos da la siguiente tabla:
mathbfa mathbfb | mathbfb |
mathbfx | mathbfy | mathbfz |
mathbfa | mathbfx | 1 | mathbfx mathbfy | mathbfx mathbfz |
mathbfy | − mathbfx mathbfy | 1 | mathbfy mathbfz |
mathbfz | − mathbfx mathbfz | − mathbfy mathbfz | 1 |
De hecho, esta tabla es trivial, comparada, por ejemplo, con la tabla de cuaterniones.
NotaPor ejemplo, aquí está la multiplicación de dos vectores (5,3,0) y (2,0,1) :
\ begin {eqnarray} (5 \ mathbf {x} + 3 \ mathbf {y}) (2 \ mathbf {x} + 1 \ mathbf {z}) & = & 5 \ 2 \ \ mathbf {x} \ mathbf {x} + 5 \ 1 \ \ mathbf {x} \ mathbf {z} + 3 \ 2 \ \ mathbf {y} \ mathbf {x} + 3 \ 1 \ \ mathbf {y} \ mathbf {z} \\ & = & 10 + 5 \ \ mathbf {x} \ mathbf {z} - 6 \ \ mathbf {x} \ mathbf {y} + 3 \ \ mathbf {y} \ mathbf {z} \ end {eqnarray}
3.3. Fórmula de reflexión (aspecto tradicional)
Reflexión sobre un vector [en el artículo original, cada vector se puede mover]Si tenemos un vector unitario
mathbfa y vector
mathbfv podemos reflexionar
mathbfv a través de un plano perpendicular
mathbfa .
Esto se hace de la manera habitual: compartimos
mathbfv en la parte perpendicular al plano:
mathbfv perp=( mathbfv cdot mathbfa) mathbfa , y la parte paralela al plano:
mathbfv parallel= mathbfv− mathbfv perp= mathbfv−( mathbfv cdot mathbfa) mathbfa$ .
Luego, para reflejar el vector, volteamos la parte perpendicular y dejamos la parte paralela sin cambios:
\ begin {eqnarray} R _ {\ mathbf {a}} (\ mathbf {v}) & = & \ mathbf {v} _ \ parallel - \ mathbf {v} _ \ perp \\ & = & (\ mathbf { v} - (\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a}) - ((\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a}) \\ & = & \ mathbf {v} - 2 (\ mathbf {v} \ cdot \ mathbf {a}) \ mathbf {a} \ end {eqnarray}
3.4. Fórmula de reflexión (vista para producto geométrico)
En esta etapa, podemos reemplazar el producto escalar
mathbfv cdot mathbfa en su versión en forma de producto geométrico
frac12( mathbfv mathbfa+ mathbfa mathbfv) y obtén lo siguiente:
\ begin {eqnarray} R _ {\ mathbf {a}} (\ mathbf {v}) & = & \ mathbf {v} - 2 (\ frac {1} {2} (\ mathbf {v} \ mathbf {a } + \ mathbf {a} \ mathbf {v})) \ mathbf {a} \\ & = & \ mathbf {v} - \ mathbf {v} \ mathbf {a} ^ 2 - \ mathbf {a} \ mathbf {v} \ mathbf {a} \\ & = & - \ mathbf {a} \ mathbf {v} \ mathbf {a} \ end {eqnarray}
(
mathbfa2= mathbfa cdot mathbfa=1 desde
mathbfa es un vector unitario)
Esto nos da exactamente lo mismo, pero en una entrada diferente. ¡Usar un registro en forma de un producto simple en lugar de una fórmula para codificar una operación tan fundamental como la reflexión será muy útil!
¿Cómo funciona el producto geométrico múltiple?Si no comprende cómo funciona la toma múltiple de un producto geométrico, simplemente mire los vectores base. Solo hay tres casos posibles:
\ begin {eqnarray} \ mathbf {x} (\ mathbf {x} \ mathbf {x}) & = & \ mathbf {x} 1 = \ mathbf {x} \\ \ mathbf {x} (\ mathbf {x } \ mathbf {y}) & = & \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y} + \ mathbf {x} \ wedge \ mathbf {y}) = \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y}) + \ mathbf {x} \ mathbf {x} \ mathbf {y} = \ mathbf {x} (\ mathbf {x} \ cdot \ mathbf {y}) + \ mathbf {y} \\ \ mathbf {x} (\ mathbf {y} \ mathbf {z}) & = & \ mathbf {x} (\ mathbf {y} \ cdot \ mathbf {z}) + \ mathbf {x } \ mathbf {y} \ mathbf {z} \ end {eqnarray}
Los resultados serán: vector, vector, vector + trivector. Sin embargo, el último caso puede ocurrir solo cuando los tres vectores son independientes, lo que nunca es cierto para − mathbfava
DetallesLas personas curiosas pueden ver lo que sucede en cada etapa. − mathbfa mathbfv mathbfa en términos de producto geométrico.
- Primera etapa:
mathbfv mathbfa= mathbfv cdot mathbfa+ mathbfv wedge mathbfa
Si, como antes, nos dividimos mathbfv a la parte perpendicular al plano ( mathbfv perp ), y la parte paralela a ella ( mathbfv parallel ), entonces obtenemos:
\ begin {eqnarray} (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ parallel) \ mathbf {a} & = & (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ paralelo) \ cdot \ mathbf {a} + (\ mathbf {v} _ \ perp + \ mathbf {v} _ \ parallel) \ wedge \ mathbf {a} \\ & = & \ mathbf {v} _ \ perp \ cdot \ mathbf {a} + \ mathbf {v} _ \ parallel \ cdot \ mathbf {a} + \ mathbf {v} _ \ perp \ wedge \ mathbf {a} + \ mathbf {v} _ \ parallel \ wedge \ mathbf {a} \ end {eqnarray}
mathbfv parallel cdot mathbfa=0 , porque estos vectores son perpendiculares, y mathbfv perp wedge mathbfa=0 porque estos vectores son paralelos
mathbfv mathbfa= mathbfv perp cdot mathbfa+ mathbfv parallel wedge mathbfa
El primer término es solo la longitud de la proyección. mathbfv en mathbfa es decir el primer término es solo la longitud mathbfv perp .
Vamos a llamar hat mathbfv parallel versión normalizada mathbfv parallel eso es mathbfv parallel= hat mathbfv parallel | mathbfv parallel | . Entonces el segundo término es solo un bivector mathbfB= hat mathbfv parallel wedge mathbfa veces la longitud mathbfv parallel .
Esta bivector mathbfB compuesto por dos vectores unitarios perpendiculares, es decir, esta es una representación muy limpia del plano de vectores mathbfa y mathbfv . No contiene información sobre su ángulo relativo o sus longitudes, solo la orientación del plano.
Es decir, ambos términos son solo descomposiciones mathbfv en dos proyecciones ortogonales ( mathbfv parallel y mathbfv perp ), así como el plano que forman ( mathbfB ):
| mathbfv perp |+ | mathbfv parallel | mathbfB
Antes de pasar al siguiente paso, podemos reemplazar el producto externo por uno geométrico, porque mathbfa y mathbfv parallel son perpendiculares y, por lo tanto, su producto externo y geométrico será equivalente (ya que la parte con el producto escalar de su producto geométrico es igual a cero).
mathbfv perp cdot mathbfa+ mathbfv parallel wedge mathbfa= mathbfv perp cdot mathbfa+ mathbfv parallel mathbfa
- La segunda etapa será la siguiente:
mathbfa mathbfv mathbfa= mathbfa( mathbfv perp cdot mathbfa)+ mathbfa mathbfv parallel mathbfa
El primer miembro es solo un componente mathbfv a lo largo mathbfa es decir componente mathbfv perpendicular al plano. En otras palabras, el primer término es solo mathbfv perp .
mathbfa mathbfv mathbfa= mathbfv perp+ mathbfa mathbfv parallel mathbfa
Desde mathbfa y mathbfv parallel (de nuevo) perpendicular, su producto geométrico es simplemente su producto externo, es decir, puede intercambiarlos y cambiar el signo.
\ begin {eqnarray} \ mathbf {a} \ mathbf {v} \ mathbf {a} & = & \ mathbf {v} _ \ perp - \ mathbf {v} _ \ parallel \ mathbf {a} \ mathbf {a } \\ & = & \ mathbf {v} _ \ perp - \ mathbf {v} _ \ parallel \ end {eqnarray}
- Y finalmente, la última etapa voltea el signo:
− mathbfa mathbfv mathbfa=− mathbfv perp+ mathbfv parallel
Es decir, vemos que el componente mathbfv perpendicular al plano, al revés, ¡pero la parte paralela permanece igual!
NotaLongitud mathbfa no es muy importante, así que a continuación lo ignoramos, pero si mathbfa no es un vector unitario, entonces debemos dividir por su longitud y la fórmula se convierte en − mathbfa mathbfv mathbfa−1 , que es más como un "producto en capas", al que debería haberse acostumbrado.
3.5. Dos reflexiones son un giro: la situación en 2D
Resulta que si aplicamos a
mathbfv dos reflexiones consecutivas (primero con un vector
mathbfa y luego con el vector
mathbfb ), entonces obtenemos una
rotación al doble del ángulo entre los vectores mathbfa y mathbfb .Podemos mostrar cada etapa posterior de reflexión en el siguiente gráfico:
También puede cambiar los vectores en el artículo original.
mathbfa ,
mathbfb y
mathbfv , pero la configuración inicial de los vectores en el gráfico (haga clic en el botón "Restablecer posiciones de vectores") demuestra claramente por qué la rotación como resultado ocurre en un ángulo
doble . Otra buena configuración es establecer como
mathbfa y
mathbfb hachas
mathbfx y
mathbfy .
3.6. Dos reflexiones es un giro: la situación en 3D
En el caso del vector 3D
mathbfv se puede dividir en dos partes, una de las cuales se encuentra en el plano dado
mathbfa y
mathbfb , y el otro se encuentra fuera del plano (perpendicular a él). Como se muestra en el gráfico a continuación, cuando el vector se refleja en cada uno de los planos, su parte exterior permanece igual. En cuanto al interior, estamos de vuelta en 2D, ¡y simplemente gira dos veces el ángulo!
3.7. Rotores
Desde el punto de vista del producto geométrico, dos reflexiones simplemente corresponden a lo siguiente:
R mathbfb(R mathbfa( mathbfv))=− mathbfb(− mathbfa mathbfv mathbfa) mathbfb= mathbfb mathbfa mathbfv mathbfa mathbfb
Llamamos
mathbfa mathbfb= mathbfa cdot mathbfb+ mathbfa wedge mathbfb rotor porque multiplicando por
mathbfa mathbfb a ambos lados del vector, realizamos una rotación (
mathbfb mathbfa Es lo mismo que
mathbfa mathbfb , solo en el bivector parcial invertido).
Aplicación del rotor
mathbfa mathbfb a ambos lados del vector gira este vector en el plano de los vectores
mathbfa y
mathbfb dos veces el ángulo entre
mathbfa y
mathbfb .
¡Y eso es todo!Comparación de rotores 3D y cuaterniones.
Puedes ver que los rotores 3D se parecen mucho a los cuaterniones:
a+Bxy mathbfx wedge mathbfy+Bxz mathbfx wedge mathbfz+Byz mathbfy cuña mathbfz
a+b mathbfi+c mathbfj+d mathbfk
De hecho, el código / matemáticas es más o menos lo mismo. La principal diferencia es que
mathbfi ,
mathbfj y
mathbfk reemplazado por
mathbfy wedge mathbfz ,
mathbfx wedge mathbfz y
mathbfx wedge mathbfy pero funcionan básicamente igual. La comparación de códigos se puede encontrar
aquí . No implementé todo, por ejemplo log / exp para la interpolación, pero son bastante fáciles de crear.
Sin embargo, como hemos visto, los rotores 3D son un concepto tridimensional que no requiere el uso de "doble vuelta de cuatro dimensiones" o "proyección estereográfica" para la visualización. Intentar visualizar los cuaterniones 4D para explicar las rotaciones 3D es un poco como tratar de entender el movimiento planetario desde un punto de vista geocéntrico. Es decir Este enfoque es demasiado complicado porque lo vemos desde el punto de vista equivocado.
Como vimos, modelar rotaciones como ocurre dentro de planos, en lugar de alrededor de vectores, nos ayuda mucho. Por ejemplo, los cuadrados de los bivectores base dan
−1 , al igual que los cuaterniones básicos (
mathbfi2= mathbfj2= mathbfk2=−1 ):
( mathbfx mathbfy)2=( mathbfx mathbfy)( mathbfx mathbfy)=−( mathbfy mathbfx)( mathbfx mathbfy)=− mathbfy( mathbfx mathbfx) mathbfy=− mathbfy mathbfy=−1
Multiplicar dos bivectores entre sí da un tercer bivector, pero de hecho es trivial, y no necesitamos recordar que
mathbfi mathbfj= mathbfk :
( mathbfx mathbfy)( mathbfy mathbfz)= mathbfx( mathbfy mathbfy) mathbfz= mathbfx mathbfz
(Tenga en cuenta que utilizamos
mathbfx wedge mathbfy= mathbfx mathbfy )
¡Estas propiedades son el resultado de un producto geométrico y no surgen de la nada!
Lectura adicional
(Por cierto, en álgebra geométrica no solo hay rotores, ¡sino también otras cosas geniales!)
- Álgebra lineal y geométrica de Macdonald [ enlace a Amazon ]
Una fuente excelente, muy clara y comprensible, porque estaba implícito que reemplazaría el libro de texto de álgebra lineal para los estudiantes. - Álgebra Geométrica para Informática por Dorst et al. [ enlace a Amazon ]
Una gran fuente, porque la programación a veces te permite comprender mejor el tema.Nota: en este libro, los autores dejan en claro que el álgebra geométrica es más lenta que los cuaterniones (y similares ...). De hecho, debe tener aproximadamente el mismo código (es decir, no debe escribir código para álgebra geométrica, creando una estructura generalizada que pueda contener todos los tipos posibles de k-vectores, simplemente escriba, si es necesario, una estructura para cada tipo de k-vectores Es decir, para reemplazar los cuaterniones, puede escribir una estructura Bivector y una estructura Rotor, que es Escalar + Bivector).