Epsilon et système de coordonnées

Votre choix de système de coordonnées (autrement dit, votre choix de ce que signifie une unité du monde) va de pair avec votre choix de valeur epsilon du pinceau. Le système de coordonnées se reflète dans la valeur de la matrice de transformation inputToWorld que vous transmettez à InProgressStrokesView.startStroke() et dans la transformation similaire que vous appliquez à Canvas lors du dessin de traits secs.

Une application classique peut ne prendre en compte que les unités du monde et laisser l'argument strokeToWorldTransform de startStroke() comme matrice d'identité par défaut.

Si votre application permet de faire un panoramique, un zoom ou une rotation sur une surface de dessin, la valeur exacte de ces matrices de transformation changera au fil du temps. Toutefois, ces changements reflètent une modification de la façon dont votre système de coordonnées du monde est visualisé par la caméra à travers laquelle l'utilisateur voit la surface de dessin.

Le système de coordonnées du monde peut être envisagé comme une grille dont chaque cellule correspond à la taille d'une unité du monde. Epsilon est une taille dans cette grille, un nombre à virgule flottante d'unités mondiales.

Lorsque les utilisateurs font un zoom avant sur votre contenu, ils font également un zoom avant sur la grille d'unités du monde. Le choix de l'unité du monde et de la taille epsilon en termes de niveau de zoom par défaut de 100 % est donc important.

La définition de la taille de l'unité du monde et la valeur epsilon en unités du monde doivent être des valeurs fixes pendant toute la durée de vie de votre application.

L'implémentation interne utilise epsilon pour déterminer la proximité requise entre deux points pour qu'ils soient traités comme un même point. En d'autres termes, toute distance inférieure à epsilon est traitée comme une distance nulle. Cette valeur permet de quantifier et d'arrondir les calculs internes.

Quelles sont les tailles d'unités mondiales et les valeurs epsilon raisonnables ?

Pour assurer la portabilité sur différentes tailles d'écran et densités d'appareils, la taille de l'unité du monde doit être indépendante de la densité. L'unité classique pour de tels scénarios est le pixel indépendant de la densité (dp). En général, choisissez 1 dp comme taille de l'unité du monde.

Lorsque vous choisissez une valeur epsilon fixe, évitez d'arrondir les nombres d'implémentation interne à une distance supérieure à un pixel. Avec une taille d'unité mondiale de 1 dp, l'epsilon doit être d'au maximum 1/4 (0,25 unité mondiale) pour correspondre à la taille d'un pixel sur les appareils à haute densité d'affichage où 1 dp peut être égal à 4 px. Toutefois, si vous souhaitez permettre à l'utilisateur de zoomer sur son contenu jusqu'à 10x et de conserver un arrondi lié à l'epsilon à 1 px ou moins, l'epsilon doit être de 0,25 divisé par 10, ce qui équivaut à 0,025 unités mondiales.

Cela ne signifie pas que vous ne pouvez pas zoomer au-delà de x10, mais vous risquez de voir apparaître des imprécisions et des artefacts dans le rendu du tracé à ce moment-là.

Le choix d'une valeur epsilon est un équilibre entre la précision des détails lors du zoom avant et les ressources de calcul telles que :

  • Cycles de processeur pour calculer une géométrie plus précise
  • Mémoire permettant de stocker plus de détails dans cette géométrie
  • Temps d'exécution de la tâche du GPU pour afficher cette géométrie

Ces consignes sont des valeurs par défaut raisonnables, mais vous pouvez les utiliser pour choisir des valeurs de système de coordonnées et d'epsilon mieux adaptées à vos besoins.

Si vous vous éloignez trop de ces valeurs recommandées, votre application peut en pâtir. Par exemple, une consommation accrue de ressources peut ralentir l'exécution de votre application. Dans certains cas, les problèmes de précision à virgule flottante peuvent également se manifester sous la forme d'artefacts visuels étranges.