La elección de un sistema de coordenadas (en otras palabras, la elección de lo que significa 1 unidad del mundo) va de la mano con la elección del valor de épsilon del pincel.
El sistema de coordenadas se refleja en el valor de la matriz de transformación inputToWorld que pasas a InProgressStrokesView.startStroke() y en la transformación similar que aplicas a Canvas cuando dibujas trazos en seco.
Una app típica solo puede considerar unidades del mundo y dejar el argumento strokeToWorldTransform de startStroke() como la matriz de identidad predeterminada.
Si tu app admite el desplazamiento, el zoom o la rotación de una superficie de dibujo, el valor exacto de esas matrices de transformación cambiará con el tiempo, pero esos cambios reflejan un cambio en la forma en que la cámara a través de la cual el usuario ve la superficie de dibujo visualiza tu sistema de coordenadas del mundo.
El sistema de coordenadas del mundo se puede visualizar como una cuadrícula en la que cada celda tiene el tamaño de una unidad del mundo. Epsilon es un tamaño en esa cuadrícula, un número de punto flotante de unidades mundiales.
A medida que los usuarios acercan el contenido, también acercan la cuadrícula de unidades del mundo, por lo que es importante elegir la unidad del mundo y el tamaño de épsilon en términos de un nivel de zoom predeterminado del 100%.
La definición del tamaño de la unidad del mundo y el valor de Epsilon en unidades del mundo deben ser valores fijos durante todo el ciclo de vida de tu app.
La implementación interna usa epsilon para determinar qué tan cerca deben estar dos puntos entre sí para considerarse el mismo punto. En otras palabras, cualquier distancia inferior a épsilon se considera como distancia cero. Se usa para cuantificar y redondear los cálculos internos.
¿Cuáles son los tamaños de unidad mundial y los valores de épsilon razonables?
Para garantizar la portabilidad en diferentes tamaños de pantalla y densidades de dispositivos, el tamaño de la unidad mundial debe ser independiente de la densidad. La unidad clásica para estos casos es el píxel independiente de la densidad (dp). Por lo general, elige 1 dp como el tamaño de la unidad del mundo.
Cuando elijas un valor de épsilon fijo, evita que el redondeo de la implementación interna genere números para cualquier distancia que sea mayor que un píxel. Con un tamaño de unidad mundial de 1 dp, epsilon debe ser como máximo 1/4 (0.25 unidades mundiales) para ser del tamaño de un píxel en dispositivos con alta densidad de pantalla, en los que 1 dp puede ser 4 px. Sin embargo, si quieres permitir que el usuario acerque el contenido hasta 10 veces y, aun así, mantener el redondeo relacionado con epsilon en 1 px o menos, epsilon debe ser 0.25 dividido por 10, lo que equivale a 0.025 unidades mundiales.
Esto no significa que no puedas acercar la imagen más de 10 veces, pero es posible que comiences a ver cierta imprecisión y artefactos en la renderización del trazo en ese punto.
Elegir un valor de epsilon es un equilibrio entre el detalle preciso cuando se acerca la imagen y los recursos de procesamiento, como los siguientes:
- Ciclos de CPU para calcular una geometría más precisa
- Memoria para almacenar más detalles en esa geometría
- Tiempo de GPU para renderizar esa geometría
Estos lineamientos son valores predeterminados razonables, pero puedes usarlos para elegir valores de sistema de coordenadas y épsilon que se adapten mejor a tus necesidades.
Si te desvías demasiado de estos valores recomendados, es posible que tu aplicación se vea afectada de forma negativa. Por ejemplo, el aumento del consumo de recursos puede hacer que tu aplicación se ejecute lentamente. En algunos casos, los problemas de precisión de punto flotante también pueden manifestarse como artefactos visuales extraños.