Giro de un punto arbitrario del espacio alrededor de un eje arbitrario del espacio

Primera publicación: 2004-02-05
Último cambio: 2006-02-04

En este manual vamos a aprender cómo girar un punto arbitrario del espacio en torno a un eje arbitrario del espacio.  Y lo haremos de dos maneras diferentes: mediante una fórmula con productos escalares y vectoriales de vectores, y mediante Cuaternios Cuaterniones - quaternions en inglés -).

Lo veremos en cada caso con un ejemplo práctico.  El coste computacional de ambos métodos es, en mi experiencia, similar.

 

Consideraciones preliminares acerca de vectores, ejes en el espacio...

Un vector arbitrario del espacio está caracterizado (como un punto arbitrario del espacio) por tres números reales. Para caracterizar un escalar basta con un número real.

Seguiremos la notación habitual de representar los vectores (tres números) en negrita, y los escalares (un número) sin ella.

Un vector del espacio, un punto del espacio y un eje del espacio que pasa por el origen están caracterizados de la misma forma, como hemos dicho, por 3 números:

v = (x, y, z)

|v| es el módulo de v.  |v| es un número y se define como:  |v| = sqrt(x*x + y*y + z*z)

Un vector unitario vu es un vector de longitud uno.  El módulo de un vector unitario (su longitud) es siempre uno.

Es fácil calcular un vector unitario a partir de un vector v cualquiera:

vu = v/|v|

vu = (x/|v|, y/|v|, z/|v|)

Es muy fácil mostrar que el módulo de un vector unitario así calculado es siempre uno.  Esta prueba queda como tarea para el lector.

 

Un eje arbitrario del espacio (uno que no pasa por el origen) está caracterizado por dos puntos del espacio (o por dos vectores).  Es decir, que hacen falta 6 números para definirlo.

 

Producto escalar y producto vectorial

Producto escalar (Scalar Product of Vectors)
El producto escalar de dos vectores que forman entre sí un ángulo theta es un escalar (un número).
|A| es el módulo de A. |A| es un número y se define como:  |A| = sqrt(Ax*Ax + Ay*Ay + Az*Az)

A·B = |A|*|B|*cos(theta)
A·B = Ax*Bx + Ay*By + Az*Bz

Producto vectorial (Vector cross product)
El producto vectorial de dos vectores es un vector (tres números) perpendicular al plano que forman los dos vectores originales.

|A cross B| = |A|*|B|*sin(theta)
A cross B = (AyBz - AzBy)*i - (AxBz - AzBx)*j + (AxBy - AyBx)*k

Donde i, j y k son tres vectores unitarios mutuamente perpendiculares que van en la dirección de los ejes x, y, z respectivamente.

 

Giro de un punto arbitrario del espacio alrededor de un eje arbitrario del espacio mediante productos escalar y vectorial

Dados un punto arbitrario del espacio "P", un eje arbitrario del espacio "AB" y un ángulo "theta".  Si queremos girar el punto "P" "theta" radianes alrededor del vector unitario "n" que pasa por el origen y es paralelo al eje "AB", la fórmula que se utiliza para conseguirlo es:

P' = (n·P)*n + cos(theta)*[P - (n·P)*n] +- sin(theta)*(n cross P)          [formula 1]

(el símbolo +- antes de sin(a) es debido a que el punto "P" puede girar en dos direcciones diferentes)

Si lo que queremos es girar el punto "P" "theta" radianes alrededor del propio eje "AB" y no respecto a un eje paralelo a "AB" que pase por el origen (siendo "n" el vector unitario que pasa por el origen y es paralelo a "AB"), la fórmula es:

P' = A + f(P - A), donde:
f(P) = (n·P)*n + cos(theta)*[P - (n·P)*n] +- sin(theta)*(n cross P)

es decir:

P
' = A + [n·(P - A)]*n + cos(theta)*[(P - A) - [n·(P - A)]*n] +- sin(theta)*[n cross (P - A)]          [formula 2]

esta fórmula es más general que la 1 porque sirve para girar alrededor de cualquier eje del espacio, incluso alrededor de uno que no pase por el origen.

 

Ejemplo práctico:
Sea P = (3, 4, 5) un punto arbitrario del espacio que queremos girar theta = pi/8 radianes respecto al eje AB dado por los puntos A = (9, 2, 6) y B = (7, 0, 1)
Averiguar P' mediante productos escalares y vectoriales  [formula 2]

Solución:
(P - A) = (3, 4, 5) - (9, 2, 6) = (-6, 2, -1)
AB = ((7 - 9), (0 - 2), (1 - 6)) = (-2, -2, -5)
|AB| = sqrt [(-2)^2 + (-2)^2 + (-5)^2] = 5.744562647
n = AB/|AB| = (-2, -2, -5) / 5.744562647 = (-0.348155311, -0.348155311, -0.870388279)
sin(theta) = 0,382683432
cos(theta) = 0,923879532

y, aplicando la fórmula 2:

P' = A + [n·(P - A)]*n + cos(theta)*[(P - A) - [n·(P - A)]*n] +- sin(theta)*[n cross (P - A)]


P
' = (9, 2, 6) + [(-0.348155311, -0.348155311, -0.870388279)·(-6, 2, -1)]*(-0.348155311, -0.348155311, -0.870388279) + cos(theta)*[(-6, 2, -1) - [(-0.348155311, -0.348155311, -0.870388279)·(-6, 2, -1)]*(-0.348155311, -0.348155311, -0.870388279)] +- sin(theta)*[(-0.348155311, -0.348155311, -0.870388279) cross (-6, 2, -1)]

P'1 = (4.19614872, 5.65305114, 3.86032006)

P'2 = (2.59734948, 1.92251959, 5.99205237)

dependiendo de si aplicamos el signo + o el - en la fórmula, es decir, depende de si el punto P ha girado pi/8 radianes en un sentido o en el otro.

 

 

Cuaternios

Un cuaternio es un conjunto de cuatro números.  Un ejemplo de cuaternio puede ser:

q = (w, x, y, z)

o bien:

q = w + x*i + y*j + z*k

también se puede expresar como un escalar más un vector, por ejemplo, dado el escalar:

w

y el vector:

v = (x*i + y*j + z*k)

el cuaternio resultante es:

q = w + v

que, a veces, también se escribe así:

q = (w, v)

o así:

q = (w, x, y, z)

 

Los cuaternios se multiplican de acuerdo con las siguientes reglas:

-1 = i*i = j*j = k*k = i*j*k
y
i*j = -j*i = k
j*k = -k*j = i
k*i = -i*k = j

El producto de dos cuaternios:

q1 = w1 + x1*i + y1*j + z1*k

y

q2 = w2 + x2*i + y2*j + z2*k

es, de acuerdo con esas reglas:

q1*q2 = (w1w2 - x1x2 - y1y2 -z1z2)
          + (w1x2 + x1w2 + y1z2 - z1y2)*i
        
 + (w1y2 - x1z2 + y1w2 + z1x2)*j
          + (w1z2 + x1y2 - y1x2 + z1w2)*k

 

|q| es el módulo de q.  Es un número y se define de forma similar a como se define el módulo de un vector:

|q| = sqrt(w*w + x*x + y*y + z*z)

Dado un cuaternio cualquiera, por ejemplo:  q = w + x*i + y*j + z*k, existe un cuaternio unitario qu tal que:

qu = w/|q| + (x/|q|)*i + (y/|q|)*j + (z/|q|)*k     (también de forma similar a como se define un vector unitario)

El módulo de un cuaternio unitario así definido es siempre uno, como se demuestra fácilmente:

|qu| = sqrt[w*w/(w*w + x*x + y*y + z*z) + x*x/(w*w + x*x + y*y + z*z) + y*y/(w*w + x*x + y*y + z*z) + z*z/(w*w + x*x + y*y + z*z)]

= sqrt[(w*w + x*x + y*y + z*z)/(w*w + x*x + y*y + z*z)]

= 1

 

Recordemos que el conjugado de un número complejo (a + b*i) era:  (a - b*i)

El conjugado de un cuaternio q = w + x*i + y*j + z*k  es  q':

q' = w - x*i - y*j - z*k

Recordemos que el producto de un número complejo por su conjugado era:  (a + b*i)*(a - b*i) = a*a + b*b

Veamos cuánto es el producto de un quaternio por su conjugado de acuerdo con las reglas de multiplicación que hemos visto arriba:

q*q' = (w + x*i + y*j + z*k)*(w - x*i - y*j - z*k) =

w*w  - w*x*i - w*y*j - w*z*k +
w*x*i + x*x - x*y*k + x*z*j +
w*y*j + x*y*k + y*y - y*z*i +
w*z*k - x*z*j + y*z*i  + z*z

= w*w + x*x + y*y + z*z

Vemos que el producto de un cuaternio por su conjugado es un número, y que este número es el módulo del cuaternio al cuadrado:

q*q' = |q|*|q| = w*w + x*x + y*y + z*z

Si operamos con cuaternios unitarios qu, veremos que nos deparan pequeñas sorpresas, es claro que:

qu*qu' = |qu|*|qu| = 1

pero sabemos que también qu/qu es igual a uno, así que, admirablemente:

qu' = 1/qu          (también se suele denotar 1/qu como qu-1)

es decir, que el conjugado de un cuaternio unitario es también su inverso.

O de otra forma, si qu es un cuaternio unitario:

qu = w + x*i + y*j + z*k

entonces:

1/qu = qu-1 es igual a qu' = w - x*i - y*j - z*k

El inverso de un cuaternio unitario es igual a su conjugado

 

Giro de un punto arbitrario del espacio alrededor de un eje arbitrario del espacio mediante cuaternios

Representar un punto (o un vector, o un eje que pasa por el origen) del espacio en forma de cuaternio es muy fácil, dado el vector:

v = (x, y, z)

el cuaternio que le corresponde es:

q = (0, x, y, z)

es decir, un cuaternio que contiene al vector, pero cuya magnitud w es igual a 0.

 

Un cuaternio construido como veremos a continuación, de alguna manera, representa la rotación de un punto cualquiera alrededor de un eje del espacio arbitrario.

¿Por qué?

consideremos un eje del espacio que pasa por el origen (o lo que es lo mismo, un vector):

v = (x, y, z)

y consideremos también un punto arbitrario del espacio P que queremos girar "theta" radianes alrededor de ese eje:

P = (x0, y0, z0)

Ahora generemos un cuaternio unitario a partir del eje y del ángulo de esta manera:

q = qw + qx*i + qy*j + qz*k

donde:

qw = cos(theta/2)

qx = +-sin(theta/2)*x/|v|

qy = +-sin(theta/2)*y/|v|

qz = +-sin(theta/2)*z/|v|

es decir:

q = (cos(theta/2), +-sin(theta/2)*v/|v|)

(es muy fácil mostrar que un cuaternio así generado es unitario y se deja al lector la tarea de hacerlo).

Pues bien, dado este cuaternio generado a partir del eje (o vector) v y del ángulo theta, obtenemos el siguiente sorprendente resultado:

P' = q*(0, P)*q-1          [formula 3]

es decir, que el punto P una vez rotado, esto es P', viene dado por este simple producto de cuaternios!

(Esto se podría hacer también con cuaternios q no unitarios pero, puesto que hay que elegir, y puesto que es muy fácil calcular la inversa de un cuaternio unitario, es mejor hacerlo con unitarios.)

Es factible pensar que Hamilton tuviera en cuenta (y buscase) éstas y otras sorprendentes propiedades de los cuaternios cuando los descubrió en 1843, a la edad de 38 años.

El producto citado representa la rotación de P alrededor de un eje que pasa por el origen.  Como antes, si lo que queremos es girar el punto "P" "theta" radianes alrededor de un eje "AB" y no respecto a un eje paralelo a "AB" que pase por el origen, la fórmula es:
 

P' = A + f(P - A), donde:
f(P) = q*(0, P)*q-1

es decir:

P'
= A + q*(0, P - A)*q-1          [formula 4]

esta fórmula es más general que la 3 porque sirve para girar cualquier punto alrededor de cualquier eje del espacio, incluso alrededor de uno que no pase por el origen.
 

repítamos el mismo ejemplo de antes (pero ahora lo resolveremos con cuaternios):

 

Ejemplo práctico:
Sea P = (3, 4, 5) un punto arbitrario del espacio que queremos girar theta = pi/8 radianes respecto al eje AB dado por los puntos A = (9, 2, 6) y B = (7, 0, 1)
Averiguar P' mediante cuaternios  [formula 4]

Solución:
v = (B - A) = (7, 0, 1) - (9, 2, 6) = (-2, -2, -5)
+-sin(theta/2) = +-0,195090322
cos(theta/2) = 0,98078528
|v| = sqrt (2*2 + 2*2 + 5*5) = 5.744562647
(P - A) = (3, 4, 5) - (9, 2, 6) = (-6, 2, -1)
q = (0.98078528, +-0.195090322*(-2)/5.744562647, +-0.195090322*(-2)/5.744562647, +-0.195090322*(-5)/5.744562647)
q = (0.98078528, -+0.067921731, -+0.067921731, -+0.169804329)
q-1 = (0.98078528, +-0.067921731, +-0.067921731, +-0.169804329)

y, aplicando la fórmula 4:

P' = A + q*(0, P - A)*q-1 


P
' = (0, 9*i, 2*j, 6*k) + (0.98078528, -+0.067921731*i, -+0.067921731*j, -+0.169804329*k)*(0, -6*i, 2*j, -1*k)*(0.98078528, +-0.067921731*i, +-0.067921731*j, +-0.169804329*k)

P'1 = (4.19614872, 5.65305114, 3.86032006)

P'2 = (2.59734948, 1.92251959, 5.99205237)

dependiendo de si tomamos como positivo o negativo el sin(theta/2), es decir, depende de si el punto P ha girado pi/8 radianes en un sentido o en el otro.

 

Puedes mirar este applet fractal hecho en Java en el que se aplican de forma práctica estos giros de forma masiva.