Épsilon e sistema de coordenadas

A escolha de um sistema de coordenadas (ou seja, o que uma unidade do mundo significa) está relacionada à escolha do valor de epsilon do pincel. O sistema de coordenadas é refletido no valor da matriz de transformação inputToWorld que você transmite para InProgressStrokesView.startStroke() e na transformação semelhante que você aplica ao Canvas ao desenhar traços secos.

Um app típico pode considerar apenas unidades mundiais e deixar o argumento strokeToWorldTransform de startStroke() como a matriz de identidade padrão.

Se o app for compatível com panorâmica, zoom ou rotação de uma superfície de desenho, o valor exato dessas matrizes de transformação vai mudar com o tempo, mas essas mudanças refletem uma alteração na forma como o sistema de coordenadas do mundo está sendo visto pela câmera que o usuário usa para ver a superfície de desenho.

O sistema de coordenadas do mundo pode ser imaginado como uma grade em que cada célula tem o tamanho de uma unidade do mundo. Epsilon é um tamanho nessa grade, um número de ponto flutuante de unidades mundiais.

À medida que os usuários aumentam o zoom no conteúdo, eles também aumentam o zoom na grade de unidades do mundo. Portanto, a escolha da unidade do mundo e do tamanho do épsilon em termos de um nível de zoom padrão de 100% é importante.

A definição do tamanho da unidade mundial e o valor de epsilon em unidades mundiais precisam ser valores fixos durante toda a vida útil do app.

A implementação interna usa epsilon para determinar a proximidade necessária entre dois pontos para que sejam tratados como o mesmo ponto. Em outras palavras, qualquer distância menor que epsilon é tratada como distância zero. Isso é usado para quantizar e arredondar cálculos internos.

Quais são os tamanhos de unidade mundial e valores de epsilon razoáveis?

Para portabilidade em diferentes tamanhos de tela e densidades de dispositivo, o tamanho da unidade mundial precisa ser independente da densidade. A unidade clássica para esses cenários é pixels de densidade independente (dp). Normalmente, escolha 1 dp como o tamanho da unidade mundial.

Ao escolher um valor epsilon fixo, evite o arredondamento de números da implementação interna para qualquer distância maior que um pixel. Com um tamanho de unidade mundial de 1 dp, o epsilon precisa ser no máximo 1/4 (0,25 unidades mundiais) para ter o tamanho de um pixel em dispositivos de alta densidade de exibição, em que 1 dp pode ser 4 px. No entanto, se você quiser oferecer suporte ao zoom de até 10 vezes no conteúdo do usuário e ainda manter o arredondamento relacionado a epsilon em 1 px ou menos, o epsilon deverá ser 0,25 dividido por 10, o que equivale a 0,025 unidades mundiais.

Isso não significa que você não pode aumentar mais do que 10 vezes, mas pode começar a notar imprecisão e artefatos na renderização do traço nesse ponto.

Escolher um valor de epsilon é um equilíbrio entre detalhes precisos ao aumentar o zoom e recursos computacionais, como:

  • Ciclos de CPU para calcular uma geometria mais precisa
  • Memória para armazenar mais detalhes nessa geometria
  • Tempo de GPU para renderizar essa geometria

Essas diretrizes são padrões razoáveis, mas você pode usá-las para escolher o sistema de coordenadas e os valores de epsilon mais adequados às suas necessidades.

Desviar muito desses valores recomendados pode afetar negativamente seu aplicativo. Por exemplo, o aumento do consumo de recursos pode fazer com que seu aplicativo funcione lentamente. Em alguns casos, problemas de precisão de ponto flutuante também podem se manifestar como artefatos visuais estranhos.