1 puntos por GN⁺ 2024-06-16 | 1 comentarios | Compartir por WhatsApp
  • En rotaciones 3D, cada forma de representación tiene fortalezas distintas: las matrices de rotación son cómodas para transformar puntos, pero para interpolar, componer y promediar hacen falta herramientas aparte
  • Los Euler angles son fáciles de manejar para las personas, pero pueden causar problemas como gimbal lock, velocidad angular no constante y una interpolación lineal que no toma el camino más corto
  • Los unit quaternions ofrecen interpolación por el camino más corto a velocidad constante mediante slerp, pero como no son un espacio vectorial, la autoría directa, la multiplicación por escalares y el promedio no resultan intuitivos
  • Los mapas exponencial/logarítmico conectan vectores axis/angle con matrices de rotación y permiten construir interpolaciones por el camino más corto en 2D y 3D con la forma R(t) = exp(t log(R1 R0^-1)) R0
  • El promedio de varias rotaciones puede sufrir catastrophic cancellation si solo se promedian axis/angle de forma simple; el Karcher mean encuentra iterativamente la rotación que minimiza la suma de distancias angulares al cuadrado y produce resultados más consistentes

Ventajas y desventajas de cada representación de rotación

  • En rotaciones 3D hay varias representaciones, y la opción adecuada cambia según si se quiere transformar, crear, interpolar o promediar
  • Matrices de rotación

    • La representación de álgebra lineal más directa es una matriz 3x3 ortonormal con determinante positivo
    • Las tres columnas de una matriz de rotación indican a dónde se mueven los ejes x, y, z después de la rotación
    • La transformación de puntos puede procesarse con multiplicación de matrices, y también puede componerse con otras transformaciones lineales mediante multiplicación de matrices
    • La razón por la que se usan matrices de rotación al dibujar en pantalla es que para mover puntos desde world-space a la pantalla solo se necesita una multiplicación de matrices
    • Las matrices de rotación no son un espacio vectorial, por lo que sumar dos matrices de rotación no vuelve a producir una matriz de rotación
    • Si se interpolan linealmente dos matrices de rotación, puede mezclarse scaling además de rotación
  • Euler angles

    • Los Euler angles especifican tres rotaciones sobre los ejes x, y, z, y también se conocen como pitch, yaw y roll
    • El orden de aplicación de las tres rotaciones componentes depende de la convención; el ejemplo usa el orden x, y, z
    • Son fáciles de entender para las personas y se usan a menudo para crear rotaciones, pero una interpolación simple puede producir resultados no deseados
    • El gimbal lock, en el que dos ejes de rotación se vuelven paralelos debido a una de las rotaciones componentes, corresponde a una singularity
    • En una singularity, cambiar cualquiera de los dos ángulos bloqueados puede producir la misma rotación de salida
    • Si la ruta de interpolación llega a una singularity, aumentan los grados de libertad para expresar la posición actual, y la interpolación de salida puede volverse discontinua al elegir una representación arbitraria para continuar
    • Como cada ángulo componente es cyclic, la interpolación lineal no siempre elige el camino más corto entre dos rotaciones
    • Si la ruta no pasa por una singularity, la interpolación es suave, y si no hace falta expresar “straight up” y “straight down”, se pueden esquivar sus límites
  • Quaternions

    • Los unit quaternions se usan como herramienta estándar para composición e interpolación de rotaciones
    • spherical linear interpolation, es decir slerp, elige el camino más corto a velocidad constante entre dos quaternions
    • Los unit quaternions tampoco son un espacio vectorial, son difíciles de crear directamente para una persona y pueden tener costo de cálculo en la interpolación
    • También falta una noción intuitiva de multiplicación por escalares o promedio
    • Como los quaternions cubren doblemente el espacio de rotaciones, en algunos casos Q(1) puede llegar a -Q1
  • Axis/angle

    • Una rotación axis/angle se representa como un vector 3D real
    • La dirección del vector especifica el eje de rotación, y su magnitud especifica el ángulo de rotación alrededor de ese eje
    • Se escribe como θu, donde u es un vector unitario y θ es el ángulo de rotación
    • Al ser un vector 3D, forma un espacio vectorial y permite suma, escalado e interpolación
    • Interpolar linealmente dos rotaciones axis/angle puede dar una velocidad angular suave y constante
    • Sin embargo, según qué representación axis/angle se elija para la rotación objetivo, la interpolación lineal puede no elegir el camino más corto
    • Igual que los quaternions, los vectores axis/angle también cubren doblemente el espacio de rotaciones

Mapas exponencial y logarítmico

  • Si se puede convertir entre varias representaciones de rotación según el objetivo, se pueden aprovechar juntas las ventajas de cada representación
  • Como para la transformación final se necesita una matriz de rotación, dejamos la matriz como forma canónica
  • Un mapa exponencial es una función que recibe un objeto de rotación y devuelve la matriz de rotación equivalente
  • Un mapa logarítmico es la función correspondiente que recibe una matriz de rotación y la devuelve a un objeto de rotación
  • Aquí se tratan los mapas exp y log que convierten entre matrices de rotación y vectores axis/angle

Intuición desde axis/angle en 2D

  • En 2D, como solo hay un eje de rotación que apunta fuera del plano, una rotación axis/angle puede representarse con un único ángulo θ
  • Un punto 2D p rotado en θ, , puede escribirse así
    • pθ = p cosθ + Jp sinθ
    • J es la matriz que rota un vector 2D 90 grados
  • J es [[0, -1], [1, 0]], y como J² = -I, aplicarla dos veces equivale a una rotación de 180 grados
  • Al expandir esta expresión se obtiene la matriz estándar de rotación 2D [[cosθ, -sinθ], [sinθ, cosθ]]

Mapas exponencial y logarítmico en 2D

  • Así como en la fórmula de Euler para números complejos e^(iθ) = cosθ + i sinθ la i actúa como un quarter turn, en la expresión matricial 2D J cumple el mismo rol
  • Si se introduce la matriz A = θJ en la Taylor series de la función exponencial, se puede realizar el mismo cálculo con suma, multiplicación y escalado de matrices
  • Al expandir, aparecen las Taylor series de sinθ y cosθ, y se obtiene la siguiente expresión
    • e^(θJ) = [[cosθ, -sinθ], [sinθ, cosθ]]
  • Por lo tanto, el mapa exponencial 2D convierte el ángulo θ en la matriz de rotación correspondiente
  • El mapa logarítmico se define como la inversa del mapa exponencial
    • Si R = exp(θJ), entonces log(R) = θJ
    • Puede recuperarse con θ = atan2(R21, R11)
  • El mapa exponencial no es injective
    • Como exp(θJ) = exp((θ + 2π)J), agregar una vuelta completa produce la misma matriz de rotación
    • El mapa logarítmico se define para devolver el ángulo más pequeño correspondiente a esa matriz de rotación
    • atan2 implementa esta definición

Interpolación basada en exp/log

  • Se pueden interpolar linealmente de forma simple dos ángulos de rotación 2D θ0, θ1 y luego crear una matriz de rotación
  • Pero si θ0 y θ1 están separados por más de π, no se refleja la naturaleza cyclic de los ángulos y se toma el camino largo
  • La interpolación basada en exp/log calcula la rotación de desplazamiento directamente a partir de dos matrices de rotación R0, R1
    • R1 R0^-1 es la rotación que primero deshace R0 y luego aplica R1
    • log(R1 R0^-1) proporciona el ángulo más pequeño para ir de R0 a R1
    • Después de escalar esta rotación axis/angle por t, se convierte de nuevo en matriz con exp
  • La expresión final de interpolación es la siguiente
    • R(t) = exp(t log(R1 R0^-1)) R0
    • R(0) = R0, R(1) = R1
  • En 2D también se podría revisar directamente la diferencia de ángulos, pero este método se generaliza sin cambios a 3D y a dimensiones arbitrarias

Axis/angle 3D y skew-symmetric matrix

  • También en 3D se puede exponenciar un axis/angle θu para crear una matriz de rotación
  • La clave está en encontrar una transformación de quarter turn alrededor del vector unitario u
  • El cross product u × p se define como un vector perpendicular al plano formado por u y p, pero también puede interpretarse como un quarter turn de p⊥, la proyección de p sobre el plano perpendicular a u
  • Se puede crear una matriz û que produzca el mismo resultado que u × p
    • û = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]
    • ûp = u × p
  • Como ûᵀ = -û, û es una skew-symmetric matrix
  • J en 2D también es skew-symmetric y representa el cross product 2D, así que se mantiene la misma estructura
  • La suma y la multiplicación por escalares de skew-symmetric matrices también son skew-symmetric, por lo que las propiedades de espacio vectorial de axis/angle se conservan en esta representación matricial
  • La identidad û^(k+2) = -û^k surge de la interpretación geométrica de que aplicar el cross product tres veces hace tres quarter turns de p⊥, lo que equivale a un quarter turn negativo

Mapa exponencial 3D: fórmula de Rodrigues

  • A partir de una rotación axis/angle θu, se crea θû y se exponencia para obtener una matriz de rotación 3D
  • Usando Taylor series y û^(k+2) = -û^k, se deriva la siguiente expresión
    • e^(θû) = I + sin(θ)û + (1 - cos(θ))û²
  • Esta expresión se conoce como fórmula de Rodrigues
  • Si θ = 0, entonces e^(0û)p = p, por lo que el punto se mantiene igual
  • Si θ = π/2, se obtiene u × p + p∥, una quarter rotation
  • Si θ = π, se obtiene -p⊥ + p∥, una half rotation
  • Esta matriz es ortonormal
    • La condición AᵀA = I se verifica con ûᵀ = -û y û^(k+2) = -û^k
  • El determinante es 1 cuando θ = 0, no hay casos en los que el determinante sea 0 y, como exp es continua respecto de θ y û, no puede volverse negativo
  • Por lo tanto, exp(θû) es una matriz de rotación 3D

Mapa logarítmico 3D

  • Como el mapa exponencial 3D tampoco es injective, el mapa logarítmico 3D se define para devolver la rotación axis/angle de menor magnitud correspondiente a una matriz dada
  • Si se toma la traza en R = exp(θû) = I + sin(θ)û + (1 - cos(θ))û², puede obtenerse el ángulo de rotación
    • La traza es la suma de la diagonal
    • tr(I) = 3
    • Como û es skew-symmetric, la suma de su diagonal es 0
    • tr(û²) = -2
    • Por lo tanto, tr(R) = 1 + 2cosθ
    • θ = arccos((tr(R) - 1) / 2)
  • El eje de rotación se recupera antisymmetrizing R
    • R - Rᵀ = 2 sin(θ)û
    • û = (R - Rᵀ) / (2 sinθ)
    • u = 1/(2 sinθ) [R32 - R23, R13 - R31, R21 - R12]ᵀ
  • Así queda completo el mapa logarítmico que vuelve de una matriz de rotación 3D a axis/angle

Resultado de la interpolación 3D

  • También en 3D se aplica tal cual la misma fórmula de interpolación que en 2D
    • R(t) = exp(t log(R1 R0^-1)) R0
  • Esta interpolación conserva las ventajas de la rotación axis/angle y siempre elige el camino más corto
  • Con Euler angles, el mismo ejemplo podría no verse fluido

Promedio de varias rotaciones

  • Si se usan quaternions, se puede obtener una buena interpolación sin las matemáticas matriciales de exp/log, así que el problema de interpolación también queda resuelto
  • Una tarea que puede hacerse más fácilmente con rotaciones axis/angle es el promedio de varias matrices de rotación
  • El método más simple es convertir cada matriz a axis/angle, promediar los vectores y volver a convertir
  • Este método es válido, pero puede producir comportamientos poco intuitivos
  • En particular, al combinar vectores axis/angle puede ocurrir catastrophic cancellation
    • Un ejemplo es promediar [π, 0, 0] y [-π, 0, 0], lo que da 0
    • Ambos valores son rotaciones equivalentes, pero el resultado promedio 0 no representa a las dos rotaciones

Karcher mean

  • El promedio de puntos en el plano puede verse como el punto que minimiza la distancia cuadrada total a todos los puntos
  • El procedimiento para encontrarlo mediante optimización iterativa es el siguiente
    • Elegir una estimación inicial x̄ ∈ R²
    • Calcular la translation ui = xi - x̄ desde cada punto hasta la estimación
    • Obtener el promedio vectorial u = (1/n) Σ ui
    • Moverse en la dirección promedio con x̄ = x̄ + τu
    • Repetir mientras |u| > ε
  • La misma idea puede aplicarse a las rotaciones R0, ..., Rn
    • Elegir una rotación de estimación inicial R̄ ∈ R^(3×3)
    • Para cada matriz, calcular el axis/angle ui = log(Ri R̄^-1) desde la estimación hasta esa rotación
    • Obtener el promedio vectorial u = (1/n) Σ ui
    • Moverse en la dirección de la rotación promedio con R̄ = exp(τu) R̄
    • Repetir mientras |u| > ε
  • El resultado de este algoritmo es el Karcher mean
  • El Karcher mean es la rotación que minimiza la distancia angular cuadrada hacia todas las demás rotaciones
  • No sufre catastrophic cancellation y siempre converge a una rotación intermedia distinta de 0
  • Los resultados del promedio axis/angle simple y del Karcher mean suelen ser parecidos, pero el Karcher mean muestra un comportamiento más consistente

Relación entre quaternions y exp/log

  • Esta parte presupone conocimientos sobre quaternions
  • Así como la exponenciación de números complejos era equivalente a la exponenciación de matrices skew-symmetric 2D, la exponenciación de quaternions es equivalente a la exponenciación de matrices skew-symmetric 3D
  • En 2D, a partir de una rotación axis/angle θ se crea un pure-imaginary complex number y se exponencia
    • e^(iθ) = cosθ + i sinθ
    • El resultado es un número complejo que, al multiplicarlo por un punto, lo rota en θ
    • Como siempre tiene norma 1, una rotación 2D puede representarse como un unit-norm complex number
  • En 3D, a partir de un vector de rotación axis/angle u se puede crear un pure-imaginary quaternion q = ux i + uy j + uz k
  • Usando las reglas de multiplicación de quaternions, se obtiene q² = -||q||² = -θ², lo cual se parece a la identidad usada con skew-symmetric matrices
  • El resultado de la exponenciación es el siguiente
    • e^q = cosθ + (q/θ) sinθ
    • Es casi igual a la expresión 2D, pero no hay un solo eje imaginario, sino tres
  • Una rotación axis/angle 3D se convierte en un unit-norm quaternion
  • Si no se necesita una rotation matrix, el mapa exponencial de quaternions es una opción fácil de calcular
  • El mapa logarítmico de quaternions también es simple
    • θ = arccos(Re(q))
    • u = Im(q) / sinθ
  • Para rotar un punto p con un quaternion q, se calcula la conjugation q p q^-1
    • El punto se representa como un pure-imaginary quaternion p = px i + py j + pz k
    • Técnicamente, la conjugation rota alrededor del eje u, así que basta con definir inicialmente |u| = θ/2

Lecturas adicionales

1 comentarios

 
GN⁺ 2024-06-16
Comentarios en Hacker News
  • La correspondencia entre grupos de Lie y álgebras de Lie es uno de los conceptos más geniales que ojalá me hubieran enseñado en la escuela. Son el mapa exponencial y el mapa logarítmico que menciona el artículo, pero presentados de una forma mucho más reutilizable
    Si tomas un objeto abstracto que quieres manejar, como las rotaciones 3D, sin enredarte en los detalles de las coordenadas, eso es un grupo de Lie; y si a partir de ahí derives una representación en coordenadas que funcione bien, eso se vuelve el álgebra de Lie correspondiente
    Entonces casi “gratis” obtienes la manera de ir y venir entre coordenadas y el objeto abstracto, de componerlas, etc.; y en los casos que aparecen seguido en ingeniería, también se pueden manejar interpolaciones y promedios de forma bastante razonable
    Si puedes expresar un problema como una combinación de grupos de Lie, encontrar cuál es cada álgebra te puede ahorrar mucho trabajo que tomaría bastante tiempo hacer a mano
    Aquí el objeto necesita tener una noción de cambio suave y algo de estructura adicional, y en el proceso de ir y venir a veces aparecen problemas de componentes conexas, pero esa también es una buena razón para reutilizar resultados ya conocidos

  • Ya casi termina una semana larga, y rotar la vaca con un deslizador era justo el descanso que necesitaba

    • En cuanto vi un montón de números, se me nubló la vista, pero la vaca sí estaba muy tierna
    • Da vibra de que sería perfecto como un juego cash cow para iOS de bajísimo esfuerzo
  • Desde hace mucho me molesta que tanto software 3D no use una interfaz Arcball para las rotaciones
    Productos de Autodesk como 3DSmax y Maya sí la usan, pero Blender y OpenSCAD no; y cuando trabajaba en Roblox tampoco pude convencer al PM porque los usuarios ya se aguantaban con el método existente
    Arcball está basado en cuaterniones y usa la función exponencial para interpolar; permite cualquier rotación con un solo arrastre, no tiene gimbal lock y además, si arrastras dibujando un bucle cerrado, tiene la propiedad de volver a la posición inicial
    Eso se puede demostrar matemáticamente a partir del hecho de que los cuaterniones unitarios son una doble cubierta de SO(3), parecido a cómo las rotaciones en el círculo quedan representadas exactamente por complejos unitarios
    Implementación de referencia de cuaterniones/Arcball para probar directamente: https://romankogan.net/math/arcball_js/index.html
    El código es Java con muchos comentarios, ejecutando la librería Processing en JavaScript mediante ProcessingJS
    Las manos y el cuerpo pueden entender los cuaterniones antes que el cerebro, así que si alguien hace software 3D, ojalá use este enfoque
    Arcball: http://courses.cms.caltech.edu/cs171/assignments/hw3/hw3-not...
    Cuaterniones para rotación: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotati...
    Arcball en Processing: https://romankogan.net/math/arcball_js/index.html

    • Me pregunto por qué se siente mucho peor si arrastras desde un punto como el de la derecha en vez del centro. Se siente como si se atorara y a veces brinca; si cambia el punto de referencia para calcular la rotación, parecería que eso debería hacerse visible en pantalla
    • Me pregunto si se podría hacer que también funcionara en móvil
      Lo estoy viendo ahora mismo desde el móvil, y https://asliceofrendering.com/camera/2019/11/30/ArcballCamer... me ayudó a entender Arcball
  • En este contexto, no me queda claro por qué les gustan tanto los cuaterniones. No es fácil decir que las matrices sean menos intuitivas que los cuaterniones
    Las matrices actúan sobre vectores, y las rotaciones también actúan sobre vectores, así que no se me ocurre qué podría ser más natural que ver una rotación como una matriz
    La exponencial matricial también es intuitiva si la conectas con ecuaciones diferenciales ordinarias. La solución de dx/dt = Ax es exp(t A), y si A es antisimétrica, entonces el cambio de x siempre es ortogonal a x, así que se vuelve una rotación que no cambia la longitud
    Los grupos de Lie y las álgebras de Lie generalizan mucho esta idea, pero el punto central es que las variaciones ortogonales generan rotaciones de forma continua y el mapa exponencial describe ese proceso. Esa imagen se siente mucho más geométrica e intuitiva

    • Los cuaterniones mismos a menudo se representan como matrices, como las matrices de Pauli, y eso se usa ampliamente para modelar espín cuántico
      Yo diría que la ventaja de los cuaterniones es que son más fáciles de manejar con papel y pluma que hacer a mano la misma multiplicación de matrices
      En lo personal, me parecen intuitivos en un sentido parecido al de los números complejos. Al principio se me hacían raros, pero ahora me resultan más simples de usar y razonar que las alternativas que conozco
    • El artículo también explicaba una gran ventaja de los cuaterniones frente a las matrices. Los cuaterniones interpolan bien y las matrices no
      Esta propiedad es muy importante en trabajos de gráficos como animación o cálculo de frames a lo largo de curvas spline 3D
    • Desde el punto de vista computacional, la ventaja de los cuaterniones es que usan solo 4 números en vez de los 9 de una matriz 3x3, y aplicar la rotación también reduce más o menos la cantidad de operaciones
    • La ventaja clave de los cuaterniones es la composición de rotaciones
      Es parecido a tratar las rotaciones 2D con números complejos: si multiplicas dos complejos, compones la rotación, y en 2D eso toma la forma de sumar los argumentos. Del mismo modo, si multiplicas dos cuaterniones puedes componer rotaciones 3D, y es mucho más eficiente que multiplicar matrices 3x3
      Para dar una intuición, los cuaterniones están muy ligados a la representación eje-ángulo, que es igual al álgebra de Lie so(3)
      Desde la perspectiva de actuar sobre vectores, puedes ver varias parametrizaciones de rotación como implementaciones del mismo rasgo abstracto Rotation. Ya sea que la implementación interna use matrices, cuaterniones, vectores de Euler, ángulos de Euler o vectores de Gibbs, la rotación actúa sobre vectores y se compone de la misma manera
  • Los cuaterniones unitarios son un grupo de Lie, y si quieres algo que se pueda sumar libremente, hay que mirar el álgebra de Lie de los cuaterniones completos que representan velocidad angular. Es equivalente a representar velocidad angular en eje-ángulo
    Comparar cuaterniones unitarios con eje-ángulo mezcla un poco las categorías; es más apropiado comparar cuaterniones unitarios con matrices de rotación, y cuaterniones completos con eje-ángulo
    Usar cuaterniones tiene la ventaja de que la aplicación exponencial se puede calcular fácilmente, pero cuando usas cuaterniones casi no necesitas matrices de rotación. Como en el artículo, la rotación se puede calcular con pqp^-1
    Creo que la forma más fácil de entender los cuaterniones es leer sobre álgebra geométrica. Tomó cientos de años inventar los cuaterniones, pero si entiendes el álgebra geométrica, que es sorprendentemente simple, puedes reinventarlos en unos minutos
    Un buen texto introductorio que vi hace unos años: https://crypto.stanford.edu/~blynn/haskell/ga.html

    • Al pensar en rotaciones, sigo creyendo que la aplicación exponencial es el método más sólido. Porque permite tratar el grupo de Lie SO(3) de la forma más directa, incluyendo cambios de coordenadas, diferenciación y manejo del espacio tangente
      Aunque pases por varias formalizaciones de álgebra geométrica, al final terminas usando rotores y motores para representar los espacios SO(3)/SE(3), y estos son isomorfos respectivamente a cuaterniones y cuaterniones duales
      Pero para ese propósito, sigo pensando que matrices de rotación 3x3 y matrices de transformación 4x4 acompañadas por la aplicación exponencial siguen siendo mucho más útiles. Los cuaterniones ocupan menos espacio y también son más rápidos de multiplicar entre sí, pero al transformar puntos las matrices son más rápidas, y la eficiencia total depende del caso
    • Me pregunto si con “cuaterniones completos” aquí se quiso decir cuaterniones puramente imaginarios
  • Una de las cosas geniales que aprendí en la universidad fue que, si redefinías el operador + para ajustarlo a matrices y a variaciones en espacios vectoriales, y el operador - para dos matrices, podías meter directamente matrices de rotación dentro del estado de un filtro de Kalman
    Así puedes estimar rotaciones sin preocuparte por el gimbal lock
    https://openslam-org.github.io/MTK

    • Me pregunto si quieres decir que se usa como estado el espacio tangente de SO(2)
    • Implementar el operador + en el espacio tangente es bastante común no solo en filtros de Kalman, sino en optimización no lineal en general. La biblioteca Ceres también ofrece LocalParameterization para esto
  • Estuvo muy bueno, y no solo la parte de la vaca
    En particular, me gustó que estos métodos al final calculan una matriz de rotación estándar. Si tienes que rotar un millón de vectores, haces el cálculo interesante una sola vez y después solo ejecutas un pipeline de multiplicación de matrices altamente optimizado

  • Era un blog genial, pero hice clic en el perfil del autor para ver otros textos y vi una frase que decía: “tuve mi primer contacto con la programación a los 9 años, por ahí de 2010”
    Yo tenía 13 en 2010 y estaba tratando de meterme en la cabeza matemáticas y ciencias de secundaria
    Cada vez que veo buenos textos sobre gráficos por computadora, siento una fuerte inferioridad porque parece que los escribió alguien más joven y mucho más talentoso que yo

    • Aún no es tarde. En los últimos años aprendí por mi cuenta algunas habilidades de nicho, y parece que cierta gran empresa quiere pagar por usarlas. Tengo como 35 años
      Igual no soy muy bueno dando consejos sobre cómo hacerlo. Simplemente seguí porque de verdad me gustaba. Aun así, parece posible que algo como la práctica estructurada también funcione
  • Estaba buscando una forma de calcular el promedio de varias rotaciones y encontré https://mathweb.ucsd.edu/~sbuss/ResearchWeb/spheremean/paper...
    El método de este artículo, al menos para mi nivel de matemáticas, se ve mucho más fácil que el de ese paper

    • Me da curiosidad el contexto en el que quieres calcular el promedio de varias rotaciones
      El promedio es una operación que puede hacerse con una suma, y en una suma el orden no importa. Pero las rotaciones no son conmutativas, así que el concepto de promedio tal como normalmente lo entendemos no se aplica de forma directa
      Si sostienes un teléfono, giras la pantalla 180° para alejarla de ti y luego lo giras 90° en sentido horario respecto al suelo, la cámara apuntará hacia la izquierda. Si haces las mismas dos rotaciones en orden inverso, la cámara apuntará hacia la derecha
      En el “promedio” de esas dos rotaciones no hay una única respuesta sobre hacia dónde debería apuntar la cámara; depende de qué propiedades quieras del promedio
    • Hace unos días escribí un comentario algo tangencial sobre rotaciones en el plano. En el plano todo se vuelve mucho más simple, y es especialmente cómodo si el entorno de programación soporta operaciones con números complejos como característica de primera clase
      https://news.ycombinator.com/item?id=40333541
      La intuición clave es que la suma es traslación y la multiplicación es rotación. Entonces, para una traslación promedio puedes usar la media aritmética, y para una rotación promedio puedes usar la media geométrica
  • Me tomó mucho tiempo darme cuenta de que en matemáticas también se crean abstracciones, parecido a cuando en ingeniería de software pensamos en abstracciones
    Cuando era más joven, me confundía por qué inventaban números imaginarios y qué se suponía que significaban las matrices
    Solo después entendí que estas representaciones fueron diseñadas. Si inventas algo como los números imaginarios, ciertos cálculos se vuelven más fáciles; y si escribes ecuaciones lineales como matrices, es mucho más fácil razonar sobre todo el sistema que escribirlo completo
    Parece obvio, pero nadie me lo dijo así

    • Incluso si estudias matemáticas más abstractas, esta perspectiva sigue siendo correcta. Por ejemplo, un grupo es una interfaz, y “algún grupo” puede verse como un tipo con una operación que implementa las tres propiedades/métodos necesarios
      Lo mismo pasa con espacios vectoriales, anillos, espacios métricos y categorías; las matemáticas están llenas de interfaces como patrones de diseño
      Eso sí, las interfaces en matemáticas se parecen más a type classes que a la herencia en programación, porque el mismo conjunto/tipo puede ser un grupo de varias maneras