- As rotações 3D têm pontos fortes diferentes conforme a forma de representação; para transformar pontos, matrizes de rotação são práticas, mas interpolação, composição e média exigem ferramentas separadas
- Ângulos de Euler são fáceis para humanos manipularem, mas podem causar gimbal lock, velocidade angular não constante e problemas de interpolação linear que deixam de seguir o caminho mais curto
- Quaternions unitários oferecem interpolação pelo caminho mais curto com velocidade constante via slerp, mas não formam um espaço vetorial, então autoria direta, multiplicação por escalar e média não são intuitivas
- Mapas exponencial/logarítmico conectam vetores axis/angle e matrizes de rotação para construir interpolação pelo caminho mais curto em 2D e 3D na forma
R(t) = exp(t log(R1 R0^-1)) R0 - A média de várias rotações pode sofrer cancelamento catastrófico se for feita apenas com a média de axis/angle; a média de Karcher encontra iterativamente a rotação que minimiza a soma dos quadrados das distâncias angulares, produzindo resultados mais consistentes
Vantagens e desvantagens de cada representação de rotação
- Existem várias representações para rotações 3D, e a escolha ideal muda conforme o objetivo: transformação, autoria, interpolação ou média
-
Matrizes de rotação
- A representação de álgebra linear mais direta é uma matriz ortonormal 3x3 com determinante positivo
- As três colunas da matriz de rotação mostram para onde os eixos x, y e z vão após a rotação
- A transformação de pontos pode ser feita com multiplicação de matrizes, e a composição com outras transformações lineares também
- Usa-se matriz de rotação na renderização porque mover pontos do world-space para a tela exige apenas uma multiplicação de matriz
- Matrizes de rotação não formam um espaço vetorial, então somar duas matrizes de rotação não produz outra matriz de rotação
- Interpolar linearmente duas matrizes de rotação pode misturar scaling junto com a rotação
-
Ângulos de Euler
- Ângulos de Euler especificam três rotações em torno dos eixos x, y e z, também chamadas de pitch, yaw e roll
- A ordem de aplicação dessas três rotações depende da convenção; o exemplo usa a ordem x, y, z
- Eles são fáceis de entender para humanos e muito usados para criar rotações, mas a interpolação simples pode gerar resultados indesejados
- O gimbal lock, em que uma rotação faz com que os outros dois eixos fiquem paralelos, corresponde a uma singularidade
- Na singularidade, alterar qualquer um dos dois ângulos travados pode produzir a mesma rotação final
- Se o caminho de interpolação chega à singularidade, aumenta a liberdade para representar a posição atual, e escolher uma representação arbitrária para continuar pode causar descontinuidade na interpolação final
- Como cada ângulo componente é cíclico, a interpolação linear nem sempre escolhe o caminho mais curto entre duas rotações
- Se o caminho não passar por uma singularidade, a interpolação pode ser suave, e dá para contornar a limitação se não for necessário representar “reto para cima” e “reto para baixo”
-
Quaternions
- Quaternions unitários são a ferramenta padrão para composição e interpolação de rotações
- A interpolação linear esférica, ou slerp, escolhe o caminho mais curto com velocidade constante entre dois quaternions
- Quaternions unitários também não formam um espaço vetorial, são difíceis de criar manualmente e podem ter custo computacional na interpolação
- Também não há uma noção intuitiva de multiplicação por escalar ou média
- Como quaternions fazem uma cobertura dupla do espaço de rotações, em alguns casos
Q(1)pode ir para-Q1
-
Axis/angle
- Uma rotação axis/angle é representada por um vetor real 3D
- A direção do vetor indica o eixo de rotação, e seu tamanho especifica o ângulo em torno desse eixo
- Ela é escrita como
θu, em queué um vetor unitário eθé o ângulo de rotação - Por ser um vetor 3D, forma um espaço vetorial, permitindo soma, escalonamento e interpolação
- Interpolar linearmente duas rotações axis/angle pode produzir um movimento suave com velocidade angular constante
- Porém, dependendo de como a rotação-alvo é representada em axis/angle, a interpolação linear pode não escolher o caminho mais curto
- Assim como quaternions, vetores axis/angle também fazem uma cobertura dupla do espaço de rotações
Mapas exponencial e logarítmico
- Se for possível converter entre diferentes representações de rotação conforme a necessidade, dá para combinar as vantagens de cada uma
- Como a transformação final exige uma matriz de rotação, a matriz é usada como forma canônica
- O mapa exponencial é uma função que recebe um objeto de rotação e devolve a matriz de rotação equivalente
- O mapa logarítmico é a função correspondente que recebe uma matriz de rotação e a converte de volta para um objeto de rotação
- Aqui tratamos dos mapas
expelogentre matrizes de rotação e vetores axis/angle
Intuição a partir de axis/angle em 2D
- Em 2D existe apenas um eixo de rotação, apontando para fora do plano, então uma rotação axis/angle pode ser representada por um único ângulo
θ - Um ponto 2D
protacionado porθ, denotadopθ, pode ser escrito assimpθ = p cosθ + Jp sinθJé a matriz que rotaciona um vetor 2D em 90 graus
Jé[[0, -1], [1, 0]], e comoJ² = -I, aplicá-la duas vezes equivale a uma rotação de 180 graus- Expandindo essa expressão, obtemos a matriz de rotação 2D padrão
[[cosθ, -sinθ], [sinθ, cosθ]]
Mapas exponencial e logarítmico em 2D
- Assim como, na fórmula de Euler dos números complexos
e^(iθ) = cosθ + i sinθ, oifaz o papel de um quarter turn, na expressão matricial 2DJcumpre esse mesmo papel - Ao inserir a matriz
A = θJna série de Taylor da função exponencial, é possível fazer o mesmo cálculo com soma, multiplicação e escalonamento de matrizes - No resultado da expansão aparecem as séries de Taylor de
sinθecosθ, levando à expressãoe^(θJ) = [[cosθ, -sinθ], [sinθ, cosθ]]
- Portanto, o mapa exponencial 2D converte o ângulo
θna matriz de rotação correspondente - O mapa logarítmico é definido como o inverso do mapa exponencial
- Se
R = exp(θJ), entãolog(R) = θJ θ = atan2(R21, R11)permite recuperar o ângulo
- Se
- O mapa exponencial não é injective
- Como
exp(θJ) = exp((θ + 2π)J), somar uma volta completa gera a mesma matriz de rotação - O mapa logarítmico é então definido para retornar o menor ângulo correspondente àquela matriz de rotação
atan2implementa essa definição
- Como
Interpolação baseada em exp/log
- É possível interpolar linearmente dois ângulos de rotação 2D
θ0eθ1e depois construir a matriz de rotação - Porém, se
θ0eθ1estiverem separados por mais deπ, a natureza cíclica dos ângulos não é levada em conta e o caminho escolhido será o mais longo - A interpolação baseada em exp/log calcula diretamente a rotação de deslocamento a partir de duas matrizes de rotação
R0eR1R1 R0^-1é a rotação que primeiro desfazR0e depois aplicaR1log(R1 R0^-1)fornece o menor ângulo para ir deR0aR1- Essa rotação axis/angle é escalada por
te depois convertida de volta em matriz comexp
- A fórmula final de interpolação é a seguinte
R(t) = exp(t log(R1 R0^-1)) R0R(0) = R0,R(1) = R1
- Em 2D dá para verificar diretamente a diferença angular, mas essa abordagem se generaliza sem modificações para 3D e dimensões arbitrárias
Axis/angle em 3D e matriz skew-symmetric
- Em 3D também é possível exponenciar
θuem axis/angle para obter uma matriz de rotação - A chave é encontrar a transformação de quarter turn em torno do eixo definido pelo vetor unitário
u - O produto vetorial
u × pé definido como o vetor perpendicular ao plano formado poruep, mas também pode ser interpretado como o quarter turn dep⊥, a projeção depno plano perpendicular au - É possível construir uma matriz
ûque produz o mesmo resultado deu × pû = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]ûp = u × p
- Como
ûᵀ = -û,ûé uma matriz skew-symmetric - O
Jdo caso 2D também é skew-symmetric e representa o produto vetorial 2D, então a mesma estrutura aparece aqui - A soma e o produto por escalar de matrizes skew-symmetric continuam sendo skew-symmetric, então a propriedade de espaço vetorial dos vetores axis/angle também é preservada nessa representação matricial
- A identidade
û^(k+2) = -û^kvem da interpretação geométrica de que aplicar o quarter turn dep⊥três vezes equivale a um quarter turn negativo
Mapa exponencial 3D: fórmula de Rodrigues
- A partir da rotação axis/angle
θu, constrói-seθûe então se aplica a exponencial para obter a matriz de rotação 3D - Usando a série de Taylor e
û^(k+2) = -û^k, obtém-se a fórmulae^(θû) = I + sin(θ)û + (1 - cos(θ))û²
- Essa expressão é conhecida como fórmula de Rodrigues
- Se
θ = 0, entãoe^(0û)p = p, e o ponto permanece inalterado - Se
θ = π/2, o resultado éu × p + p∥, caracterizando uma quarter rotation - Se
θ = π, o resultado é-p⊥ + p∥, caracterizando uma half rotation - Essa matriz é ortonormal
- A condição
AᵀA = Ipode ser verificada usandoûᵀ = -ûeû^(k+2) = -û^k
- A condição
- O determinante vale 1 quando
θ = 0, não há casos em que o determinante seja 0, e comoexpé contínua emθeû, ele não pode se tornar negativo - Portanto,
exp(θû)é uma matriz de rotação 3D
Mapa logarítmico 3D
- Como o mapa exponencial 3D também não é injective, o mapa logarítmico 3D é definido para retornar a rotação axis/angle de menor magnitude correspondente à matriz dada
- Em
R = exp(θû) = I + sin(θ)û + (1 - cos(θ))û², tomar o traço permite encontrar o ângulo de rotação- O traço é a soma da diagonal
tr(I) = 3- Como
ûé skew-symmetric, a soma da diagonal é 0 tr(û²) = -2- Portanto,
tr(R) = 1 + 2cosθ θ = arccos((tr(R) - 1) / 2)
- O eixo de rotação é recuperado pela antissimetrização de
RR - Rᵀ = 2 sin(θ)ûû = (R - Rᵀ) / (2 sinθ)u = 1/(2 sinθ) [R32 - R23, R13 - R31, R21 - R12]ᵀ
- Assim se completa o mapa logarítmico que leva de uma matriz de rotação 3D de volta a axis/angle
Resultado da interpolação em 3D
- Em 3D, a mesma fórmula de interpolação do caso 2D se aplica sem mudanças
R(t) = exp(t log(R1 R0^-1)) R0
- Essa interpolação preserva as vantagens da rotação axis/angle e sempre escolhe o caminho mais curto
- O mesmo exemplo pode não parecer suave ao usar ângulos de Euler
Média de várias rotações
- Com quaternions, já é possível obter boa interpolação mesmo sem a matemática matricial de exp/log, então o problema de interpolação pode ser resolvido por esse caminho
- Uma tarefa em que rotações axis/angle facilitam bastante é calcular a média de várias matrizes de rotação
- O método mais simples é converter cada matriz para axis/angle, fazer a média dos vetores e converter de volta
- Esse método funciona, mas pode produzir comportamentos pouco intuitivos
- Em especial, combinar vetores axis/angle pode causar cancelamento catastrófico
- Um exemplo é fazer a média de
[π, 0, 0]e[-π, 0, 0], resultando em 0 - Os dois valores representam rotações equivalentes, mas o resultado médio 0 não representa bem nenhuma delas
- Um exemplo é fazer a média de
Média de Karcher
- A média de pontos no plano pode ser vista como o ponto que minimiza a soma total das distâncias quadradas até todos os pontos
- Um procedimento iterativo para encontrá-la é o seguinte
- Escolhe-se uma estimativa inicial
x̄ ∈ R² - Para cada ponto, calcula-se a translação da estimativa até ele:
ui = xi - x̄ - Calcula-se a média vetorial
u = (1/n) Σ ui - Atualiza-se
x̄ = x̄ + τu, movendo na direção média - Repete-se enquanto
|u| > ε
- Escolhe-se uma estimativa inicial
- A mesma ideia pode ser aplicada a rotações
R0, ..., Rn- Escolhe-se uma rotação inicial estimada
R̄ ∈ R^(3×3) - Para cada matriz, calcula-se a rotação axis/angle da estimativa até ela:
ui = log(Ri R̄^-1) - Calcula-se a média vetorial
u = (1/n) Σ ui - Atualiza-se
R̄ = exp(τu) R̄, movendo na direção média das rotações - Repete-se enquanto
|u| > ε
- Escolhe-se uma rotação inicial estimada
- O resultado desse algoritmo é a média de Karcher
- A média de Karcher é a rotação que minimiza a soma das distâncias angulares quadradas até todas as outras rotações
- Como ela não sofre de cancelamento catastrófico, sempre converge para uma rotação intermediária não nula
- Os resultados da média simples em axis/angle e da média de Karcher costumam ser parecidos, mas a média de Karcher apresenta comportamento mais consistente
Relação entre quaternions e exp/log
- Esta parte pressupõe familiaridade com quaternions
- Assim como a exponenciação de números complexos era equivalente à exponenciação de matrizes skew-symmetric 2D, a exponenciação de quaternions é equivalente à exponenciação de matrizes skew-symmetric 3D
- Em 2D, a rotação axis/angle
θgera o número complexo puramente imaginárioiθ, que então é exponenciadoe^(iθ) = cosθ + i sinθ- O resultado é um número complexo que, ao ser multiplicado por um ponto, o rotaciona em
θ - Como sua norma é sempre 1, rotações 2D podem ser representadas por números complexos de norma unitária
- Em 3D, a partir do vetor de rotação axis/angle
u, pode-se construir o quaternion puramente imaginárioq = ux i + uy j + uz k - Usando as regras de multiplicação de quaternions, obtém-se
q² = -||q||² = -θ², o que lembra a identidade usada com matrizes skew-symmetric - O resultado da exponenciação é
e^q = cosθ + (q/θ) sinθ- A fórmula é quase igual à do caso 2D, mas agora há três eixos imaginários em vez de um só
- Uma rotação axis/angle 3D se converte em um quaternion de norma unitária
- Se não for necessário uma matriz de rotação, o mapa exponencial de quaternion é uma opção simples de calcular
- O mapa logarítmico de quaternion também é simples
θ = arccos(Re(q))u = Im(q) / sinθ
- Para rotacionar um ponto
pcom um quaternionq, calcula-se a conjugaçãoq p q^-1- O ponto é representado como um quaternion puramente imaginário
p = px i + py j + pz k - Tecnicamente, a conjugação rotaciona em
2θem torno do eixou, então inicialmente deve-se usar|u| = θ/2
- O ponto é representado como um quaternion puramente imaginário
Leitura adicional
- Como material para aprender quaternions, veja quaternions do eater.net
- O texto de Marc ten Bosch aborda por que geometric algebra pode ser mais intuitiva
- Aprender a estrutura algébrica das rotações 3D, SO(3), ajuda a entender melhor axis/angle, quaternions e a relação de cobertura dupla
- Há também um vídeo que explica visualmente a relação entre SO(3), SU(2), quaternions e axis/angle
- A página da Wikipedia sobre SO(3) trata de axis/angle, topologia, SU(2), quaternions e sua conexão com álgebra de Lie
- O espaço vetorial de matrizes skew-symmetric forma so(3), a álgebra de Lie correspondente a
SO(3)
1 comentários
Opiniões do Hacker News
A correspondência grupo de Lie/álgebra de Lie é um dos conceitos mais legais que eu gostaria de ter aprendido na escola. É o mapa exponencial e o mapa logarítmico mencionados no texto, mas apresentados de uma forma muito mais reutilizável
Quando você pega um objeto abstrato que quer manipular, como rotações 3D, sem se prender aos detalhes das coordenadas, isso é um grupo de Lie; ao derivar uma representação por coordenadas que funciona bem ali, você obtém a álgebra de Lie correspondente
Com isso, formas de ir e voltar entre as coordenadas e o objeto abstrato, de compor operações etc. praticamente vêm de graça; e, nos casos comuns em engenharia, interpolação e médias também podem ser tratadas de maneira bastante razoável
Se você consegue expressar um problema como uma combinação de grupos de Lie, basta descobrir quais são as respectivas álgebras para economizar muito trabalho que levaria tempo para fazer diretamente
Aqui, o objeto precisa ter uma noção de variação suave e um pouco de estrutura adicional, e no processo de ida e volta podem surgir problemas de componentes conexas, mas isso também é parte do motivo pelo qual é bom poder reutilizar resultados já conhecidos
Uma semana longa está quase acabando, e girar uma vaca com um slider era exatamente a pausa de que eu precisava
Uma reclamação antiga minha é que muitos softwares 3D não usam uma interface Arcball para rotações
Produtos da Autodesk, como 3DSmax e Maya, usam, mas Blender e OpenSCAD não; e, quando trabalhei na Roblox, também não consegui convencer o PM, pelo argumento de que os usuários se viravam com o método existente
Arcball é baseado em quatérnios e usa funções exponenciais para interpolação; permite qualquer rotação com um único arrasto, não tem gimbal lock e tem a propriedade de voltar à posição inicial quando você arrasta desenhando um loop fechado
Isso pode ser provado matematicamente a partir do fato de que os quatérnios unitários são uma cobertura dupla de SO(3), de modo parecido com como rotações no círculo são representadas exatamente por números complexos unitários
Implementação de referência de quatérnios/Arcball para mexer diretamente: https://romankogan.net/math/arcball_js/index.html
O código é Java com muitos comentários, usando a biblioteca Processing via ProcessingJS para rodar em JavaScript
As mãos e o corpo conseguem entender quatérnios antes do cérebro; então, se você cria software 3D, seria bom usar esse método
Arcball: http://courses.cms.caltech.edu/cs171/assignments/hw3/hw3-not...
Quatérnios para rotação: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotati...
Arcball em Processing: https://romankogan.net/math/arcball_js/index.html
Estou vendo no celular agora, e https://asliceofrendering.com/camera/2019/11/30/ArcballCamer... ajudou a entender Arcball
Neste contexto, não entendo muito bem por que as pessoas gostam tanto de quatérnios. É difícil dizer que matrizes sejam menos intuitivas que quatérnios
Matrizes atuam sobre vetores, e rotações também atuam sobre vetores; então fico pensando o que poderia ser mais natural do que ver rotações como matrizes
A exponencial de matriz também é intuitiva quando ligada a equações diferenciais ordinárias. A solução de
dx/dt = Axéexp(t A); se A é antissimétrica, a variação de x é sempre ortogonal a x, portanto se torna uma rotação que não altera o comprimentoGrupos de Lie/álgebras de Lie generalizam bastante isso, mas o ponto central é gerar rotações criando continuamente mudanças ortogonais, e o mapa exponencial descreve esse processo. Essa imagem parece muito mais geométrica e intuitiva
Vejo a vantagem dos quatérnios como o fato de serem mais fáceis de manipular com papel e caneta do que calcular a mesma multiplicação de matrizes à mão
Pessoalmente, acho intuitivo em um sentido parecido com números complexos. No começo parecia estranho, mas hoje parece mais simples de usar e raciocinar do que as alternativas que conheço
Essa propriedade é muito importante em trabalhos de computação gráfica, como calcular frames em animações ou ao longo de curvas spline 3D
É parecido com tratar rotações 2D por meio de números complexos: ao multiplicar dois números complexos, as rotações são compostas e, em 2D, isso equivale a somar os argumentos. Da mesma forma, ao multiplicar dois quatérnios é possível compor rotações 3D, e isso é muito mais eficiente do que multiplicar matrizes 3x3
Para dar uma intuição, quatérnios são intimamente ligados à representação eixo-ângulo, que é o mesmo que a álgebra de Lie so(3)
Do ponto de vista de atuar sobre vetores, basta ver as várias parametrizações de rotação como implementações da mesma característica abstrata
Rotation. Seja a implementação interna uma matriz, quatérnios, vetor de Euler, ângulos de Euler ou vetor de Gibbs, rotações atuam sobre vetores e são compostas da mesma maneiraQuaternions unitários são um grupo de Lie; se você quer algo que possa somar à vontade, precisa olhar para a álgebra de Lie de todos os quaternions, que representa a velocidade de rotação. É equivalente a representar a velocidade de rotação por eixo-ângulo.
Comparar quaternions unitários com eixo-ângulo é uma leve troca de categorias; é mais adequado comparar quaternions unitários com matrizes de rotação, e quaternions completos com eixo-ângulo.
Usar quaternions tem a vantagem de permitir calcular facilmente a aplicação exponencial, mas, quando se usa quaternions, quase não se precisa de matrizes de rotação. Como no texto, é possível calcular rotações com
pqp^-1.Acho que o caminho mais fácil para entender quaternions é ler sobre álgebra geométrica. Levou centenas de anos para inventar os quaternions, mas, ao entender a álgebra geométrica, que é surpreendentemente simples, dá para reinventá-los em poucos minutos.
Um texto que achei uma boa introdução alguns anos atrás: https://crypto.stanford.edu/~blynn/haskell/ga.html
Mesmo passando por várias formulações da álgebra geométrica, no fim você acaba usando rotores e motores para representar os espaços SO(3)/SE(3), e eles são isomorfos, respectivamente, a quaternions e quaternions duais.
Mas, para esse objetivo, acho que matrizes de rotação 3x3 e matrizes de transformação 4x4 acompanhadas da aplicação exponencial ainda são muito mais úteis. Quaternions ocupam menos espaço de armazenamento e também são mais rápidos de multiplicar entre si, mas, ao transformar pontos, matrizes são mais rápidas, e a eficiência geral depende da situação.
Uma das coisas legais que aprendi na universidade foi que, redefinindo o operador
+para mudanças em matrizes e espaços vetoriais, e o operador-para duas matrizes, dá para colocar uma matriz de rotação diretamente dentro do estado de um filtro de Kalman.Assim é possível estimar rotações sem se preocupar com gimbal lock.
https://openslam-org.github.io/MTK
+no espaço tangente é algo bastante comum não só em filtros de Kalman, mas também em otimização não linear em geral. A biblioteca Ceres também ofereceLocalParameterizationpara isso.Foi realmente muito bom, e não só a parte da vaca.
Gostei especialmente do fato de que esses métodos acabam calculando uma matriz de rotação padrão. Se você precisa rotacionar um milhão de vetores, faz a parte computacional interessante uma única vez e depois roda um pipeline de multiplicação de matrizes altamente otimizado.
Era um blog ótimo, mas cliquei no perfil do autor para ver outros textos e encontrei a frase “tive meu primeiro contato com programação por volta de 2010, quando tinha 9 anos”.
Eu tinha 13 anos em 2010 e estava tentando enfiar matemática e ciências do ensino fundamental II na cabeça.
Sempre que leio um texto legal sobre computação gráfica, fico com uma forte sensação de inferioridade, como se tivesse sido escrito por alguém mais jovem que eu e muito mais talentoso.
Dito isso, não sei muito bem que conselho dar sobre como fazer isso. Eu simplesmente gostava muito daquilo e continuei fazendo. Ainda assim, parece plausível que algo como prática estruturada também funcione.
Enquanto procurava um método para calcular a média de várias rotações, encontrei https://mathweb.ucsd.edu/~sbuss/ResearchWeb/spheremean/paper...
O método deste texto parece muito mais fácil que o daquele artigo, pelo menos para o meu nível de matemática.
Média é algo que se pode fazer com soma, e, na soma, a ordem de composição não importa. Mas rotações não obedecem à propriedade comutativa, então o conceito de média como normalmente o entendemos não se aplica diretamente.
Segure um celular, gire a tela 180° para que ela fique voltada para longe de você e depois gire-o 90° no sentido horário em relação ao chão; a câmera apontará para a esquerda. Se você fizer as mesmas duas rotações na ordem inversa, a câmera apontará para a direita.
Não há uma resposta única para onde a câmera deveria apontar na “média” dessas duas rotações; isso depende das propriedades desejadas para a média.
https://news.ycombinator.com/item?id=40333541
A intuição central é que adição é translação, e multiplicação é rotação. Então, para a translação média, pode-se usar a média aritmética; para a rotação média, pode-se usar a média geométrica.
Demorei bastante para perceber que, na matemática, também se criam abstrações de um jeito parecido com quando pensamos em abstrações na engenharia de software.
Quando eu era mais novo, ficava confuso sobre por que inventar números imaginários e qual era, afinal, o significado de matrizes.
Só depois entendi que essas representações foram projetadas. Criar algo chamado número imaginário facilita certos cálculos, e escrever equações lineares como matrizes torna muito mais fácil raciocinar sobre o conjunto do que expandir tudo.
Parece óbvio, mas ninguém tinha me explicado assim.
O mesmo vale para espaços vetoriais, anéis, espaços métricos e categorias; a matemática está cheia de interfaces como padrões de projeto.
Só que as interfaces da matemática se parecem mais com type classes do que com herança em programação, porque o mesmo conjunto/tipo pode ser um grupo de várias maneiras.