- 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, dondeues 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
expylogque 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
protado enθ,pθ, puede escribirse asípθ = p cosθ + Jp sinθJes la matriz que rota un vector 2D 90 grados
Jes[[0, -1], [1, 0]], y comoJ² = -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θlaiactúa como un quarter turn, en la expresión matricial 2DJcumple el mismo rol - Si se introduce la matriz
A = θJen 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θycosθ, y se obtiene la siguiente expresióne^(θ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), entonceslog(R) = θJ - Puede recuperarse con
θ = atan2(R21, R11)
- Si
- 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
atan2implementa esta definición
- Como
Interpolación basada en exp/log
- Se pueden interpolar linealmente de forma simple dos ángulos de rotación 2D
θ0,θ1y luego crear una matriz de rotación - Pero si
θ0yθ1está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,R1R1 R0^-1es la rotación que primero deshaceR0y luego aplicaR1log(R1 R0^-1)proporciona el ángulo más pequeño para ir deR0aR1- Después de escalar esta rotación axis/angle por
t, se convierte de nuevo en matriz conexp
- La expresión final de interpolación es la siguiente
R(t) = exp(t log(R1 R0^-1)) R0R(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
θupara 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 × pse define como un vector perpendicular al plano formado poruyp, pero también puede interpretarse como un quarter turn dep⊥, la proyección depsobre el plano perpendicular au - Se puede crear una matriz
ûque produzca el mismo resultado queu × pû = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]ûp = u × p
- Como
ûᵀ = -û,ûes una skew-symmetric matrix Jen 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) = -û^ksurge de la interpretación geométrica de que aplicar el cross product tres veces hace tres quarter turns dep⊥, 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óne^(θû) = I + sin(θ)û + (1 - cos(θ))û²
- Esta expresión se conoce como fórmula de Rodrigues
- Si
θ = 0, entoncese^(0û)p = p, por lo que el punto se mantiene igual - Si
θ = π/2, se obtieneu × p + p∥, una quarter rotation - Si
θ = π, se obtiene-p⊥ + p∥, una half rotation - Esta matriz es ortonormal
- La condición
AᵀA = Ise verifica conûᵀ = -ûyû^(k+2) = -û^k
- La condición
- El determinante es 1 cuando
θ = 0, no hay casos en los que el determinante sea 0 y, comoexpes 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
RR - 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
- Un ejemplo es promediar
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| > ε
- Elegir una estimación inicial
- 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| > ε
- Elegir una rotación de estimación inicial
- 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 numberiθy se exponenciae^(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
use puede crear un pure-imaginary quaternionq = 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
pcon un quaternionq, se calcula la conjugationq p q^-1- El punto se representa como un pure-imaginary quaternion
p = px i + py j + pz k - Técnicamente, la conjugation rota
2θalrededor del ejeu, así que basta con definir inicialmente|u| = θ/2
- El punto se representa como un pure-imaginary quaternion
Lecturas adicionales
- Como material para aprender quaternions, se puede ver quaternions de eater.net
- Por qué geometric algebra es más intuitiva se trata en el artículo de Marc ten Bosch
- Aprender SO(3), la estructura algebraica de las rotaciones 3D, ayuda a entender mejor la relación entre axis/angle, quaternions y double-cover
- Como video relacionado, está un video que explica visualmente la relación entre SO(3), SU(2), quaternions y axis/angle
- La página de Wikipedia sobre SO(3) trata axis/angle, topology, SU(2), quaternions y conexiones con Lie algebra
- El espacio vectorial de las skew-symmetric matrices forma so(3), la Lie algebra correspondiente a
SO(3)
1 comentarios
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
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
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 = Axesexp(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 longitudLos 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
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
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
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 maneraLos 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^-1Creo 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
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
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 KalmanAsí puedes estimar rotaciones sin preocuparte por el gimbal lock
https://openslam-org.github.io/MTK
+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 ofreceLocalParameterizationpara estoEstuvo 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
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
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
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í
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