1 pontos por GN⁺ 2024-06-16 | 1 comentários | Compartilhar no WhatsApp
  • 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 que u é 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 exp e log entre 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 p rotacionado por θ, denotado , pode ser escrito assim
    • pθ = p cosθ + Jp sinθ
    • J é a matriz que rotaciona um vetor 2D em 90 graus
  • J é [[0, -1], [1, 0]], e como J² = -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θ, o i faz o papel de um quarter turn, na expressão matricial 2D J cumpre esse mesmo papel
  • Ao inserir a matriz A = θJ na 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θ e cosθ, levando à expressão
    • e^(θ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ão log(R) = θJ
    • θ = atan2(R21, R11) permite recuperar o ângulo
  • 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
    • atan2 implementa essa definição

Interpolação baseada em exp/log

  • É possível interpolar linearmente dois ângulos de rotação 2D θ0 e θ1 e depois construir a matriz de rotação
  • Porém, se θ0 e θ1 estiverem 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 R0 e R1
    • R1 R0^-1 é a rotação que primeiro desfaz R0 e depois aplica R1
    • log(R1 R0^-1) fornece o menor ângulo para ir de R0 a R1
    • Essa rotação axis/angle é escalada por t e depois convertida de volta em matriz com exp
  • A fórmula final de interpolação é a seguinte
    • R(t) = exp(t log(R1 R0^-1)) R0
    • R(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 θu em 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 por u e p, mas também pode ser interpretado como o quarter turn de p⊥, a projeção de p no plano perpendicular a u
  • É possível construir uma matriz û que produz o mesmo resultado de u × p
    • û = [[0, -uz, uy], [uz, 0, -ux], [-uy, ux, 0]]
    • ûp = u × p
  • Como ûᵀ = -û, û é uma matriz skew-symmetric
  • O J do 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) = -û^k vem da interpretação geométrica de que aplicar o quarter turn de p⊥ 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órmula
    • e^(θû) = I + sin(θ)û + (1 - cos(θ))û²
  • Essa expressão é conhecida como fórmula de Rodrigues
  • Se θ = 0, então e^(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 = I pode ser verificada usando ûᵀ = -û e û^(k+2) = -û^k
  • O determinante vale 1 quando θ = 0, não há casos em que o determinante seja 0, e como exp é 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 R
    • R - 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

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| > ε
  • 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| > ε
  • 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ário , que então é exponenciado
    • e^(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ário q = 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 p com um quaternion q, calcula-se a conjugação q 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 em torno do eixo u, então inicialmente deve-se usar |u| = θ/2

Leitura adicional

1 comentários

 
GN⁺ 2024-06-16
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

    • Assim que apareceu um monte de números meus olhos ficaram vidrados, mas a vaca era muito fofa
    • Parece perfeito para virar um joguinho caça-níquel de baixo esforço para iOS
  • 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

    • Fico me perguntando por que parece muito pior quando se arrasta a partir de um ponto como o lado direito, em vez do centro. Dá uma sensação de travar e às vezes dar saltos; se o ponto de referência usado para calcular a rotação muda, acho que esse significado deveria ficar visualmente evidente na tela
    • Fico curioso se daria para fazer funcionar também no mobile
      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 comprimento
    Grupos 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

    • Os próprios quatérnios também muitas vezes são representados por matrizes, como as matrizes de Pauli, e isso é amplamente usado para modelar spin quântico
      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
    • O texto também explicou a grande vantagem dos quatérnios sobre matrizes. Quatérnios interpolam bem, matrizes nã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
    • Do ponto de vista computacional, a vantagem dos quatérnios é usar apenas 4 números em vez dos 9 de uma matriz 3x3, e a aplicação da rotação também reduz a quantidade de operações de forma semelhante
    • A principal vantagem dos quatérnios é a composição de rotações
      É 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 maneira
  • Quaternions 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

    • Ao pensar em rotações, ainda acho que a aplicação exponencial é a abordagem mais robusta. Isso porque ela permite tratar o grupo de Lie SO(3) da forma mais direta, incluindo mudanças de coordenadas, diferenciação e espaços tangentes.
      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.
    • Fiquei curioso se, ao dizer “quaternions completos”, você quis dizer quaternions puramente imaginários.
  • 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

    • Fiquei curioso se isso significa manter o espaço tangente de SO(2) como estado.
    • Implementar o operador + 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 oferece LocalParameterization para 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.

    • Ainda não é tarde. Nos últimos anos, aprendi por conta própria uma tecnologia de nicho, e parece que uma grande empresa quer pagar para usá-la. Tenho cerca de 35 anos.
      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.

    • Fiquei curioso sobre o contexto em que você quer calcular a média de várias rotações.
      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.
    • Alguns dias atrás escrevi um comentário meio tangencial relacionado a rotações no plano. No plano, tudo fica muito mais simples, especialmente se o ambiente de programação oferecer operações com números complexos como recurso de primeira classe.
      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.

    • Esse ponto de vista continua válido mesmo ao estudar matemática mais abstrata. Por exemplo, um grupo é uma interface, e “um certo grupo” pode ser visto como um tipo com uma operação que implementa as três propriedades/métodos necessários.
      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.