La scelta di un sistema di coordinate, ovvero la scelta di cosa significa 1 unità del mondo, va di pari passo con la scelta del valore epsilon del pennello.
Il sistema di coordinate si riflette nel valore della matrice di trasformazione inputToWorld
che passi a InProgressStrokesView.startStroke() e nella trasformazione simile
che applichi a Canvas quando disegni tratti a secco.
Un'app tipica può considerare solo le unità mondiali e lasciare l'argomento
strokeToWorldTransform di startStroke() come matrice di identità predefinita.
Se la tua app supporta la panoramica, lo zoom o la rotazione di una superficie di disegno, il valore esatto di queste matrici di trasformazione cambierà nel tempo, ma queste modifiche riflettono un cambiamento nel modo in cui il sistema di coordinate del mondo viene visualizzato dalla fotocamera attraverso cui l'utente visualizza la superficie di disegno.
Il sistema di coordinate mondiali può essere immaginato come una griglia in cui ogni cella ha le dimensioni di un'unità mondiale. Epsilon è una dimensione in quella griglia, un numero in virgola mobile di unità del mondo.
Quando gli utenti aumentano lo zoom sui tuoi contenuti, aumentano lo zoom anche sulla griglia delle unità del mondo, quindi la scelta dell'unità del mondo e delle dimensioni di epsilon in termini di livello di zoom predefinito del 100% è importante.
La definizione delle dimensioni dell'unità del mondo e il valore epsilon nelle unità del mondo devono essere valori fissi per tutta la durata della tua app.
L'implementazione interna utilizza epsilon per determinare la vicinanza di due punti per essere trattati come lo stesso punto. In altre parole, qualsiasi distanza inferiore a epsilon viene considerata pari a zero. Viene utilizzato per quantizzare e arrotondare i calcoli interni.
Quali sono le dimensioni ragionevoli delle unità del mondo e i valori epsilon?
Per la portabilità su diverse dimensioni dello schermo e densità dei dispositivi, le dimensioni dell'unità del mondo devono essere indipendenti dalla densità. L'unità classica per questi scenari sono i pixel indipendenti dalla densità (dp). In genere, scegli 1 dp come dimensione dell'unità del mondo.
Quando scegli un valore epsilon fisso, evita l'arrotondamento dell'implementazione interna a qualsiasi distanza superiore a un pixel. Con una dimensione dell'unità mondo di 1 dp, epsilon deve essere al massimo 1/4 (0,25 unità mondo) per essere la dimensione di un pixel sui dispositivi con densità di visualizzazione elevata in cui 1 dp può essere 4 px. Tuttavia, se vuoi supportare lo zoom dell'utente sui contenuti fino a 10 volte e mantenere l'arrotondamento correlato a epsilon a 1 px o meno, epsilon deve essere 0,25 diviso per 10, ovvero 0,025 unità mondiali.
Ciò non significa che non puoi ingrandire ulteriormente l'immagine oltre 10 volte, ma potresti iniziare a notare una certa imprecisione e artefatti nel rendering del tratto a quel punto.
La scelta di un valore epsilon è un compromesso tra la precisione dei dettagli quando si esegue lo zoom e le risorse di calcolo, ad esempio:
- Cicli della CPU per calcolare una geometria più precisa
- Memoria per memorizzare più dettagli in quella geometria
- Tempo della GPU per il rendering della geometria
Queste linee guida sono valori predefiniti ragionevoli, ma puoi utilizzarli per scegliere valori di sistema di coordinate ed epsilon più adatti alle tue esigenze.
L'allontanamento eccessivo da questi valori consigliati può influire negativamente sulla tua applicazione. Ad esempio, un maggiore consumo di risorse può rallentare l'esecuzione dell'applicazione. In alcuni casi, i problemi di precisione in virgola mobile possono anche manifestarsi come strani artefatti visivi.