Wybór układu współrzędnych, czyli określenie, co oznacza 1 jednostka świata, jest ściśle powiązany z wyborem wartości epsilona pędzla.
Układ współrzędnych jest odzwierciedlony w wartości macierzy przekształcenia inputToWorld, którą przekazujesz do funkcji InProgressStrokesView.startStroke(), oraz w podobnym przekształceniu, które stosujesz do funkcji Canvas podczas rysowania suchych pociągnięć.
Typowa aplikacja może uwzględniać tylko jednostki światowe i pozostawić argument strokeToWorldTransform funkcji startStroke() jako domyślną macierz tożsamości.
Jeśli aplikacja obsługuje przesuwanie, powiększanie lub obracanie powierzchni rysowania, dokładna wartość tych macierzy przekształceń będzie się zmieniać w czasie, ale te zmiany odzwierciedlają zmianę sposobu, w jaki kamera, przez którą użytkownik ogląda powierzchnię rysowania, widzi układ współrzędnych świata.
Światowy układ współrzędnych można wyobrazić sobie jako siatkę, w której każda komórka ma rozmiar jednostki światowej. Epsilon to rozmiar w tej siatce, liczba zmiennoprzecinkowa jednostek świata.
Gdy użytkownicy powiększają treści, powiększają też siatkę jednostek świata, dlatego wybór jednostki świata i rozmiaru epsilona w odniesieniu do domyślnego poziomu powiększenia 100% jest ważny.
Definicja rozmiaru jednostki świata i wartość epsilona w jednostkach świata muszą być stałe przez cały okres działania aplikacji.
Wewnętrzna implementacja używa wartości epsilon, aby określić, jak blisko siebie muszą znajdować się 2 punkty, aby były traktowane jako ten sam punkt. Innymi słowy, każda odległość mniejsza niż epsilon jest traktowana jako odległość zerowa. Służy do kwantyzacji i zaokrąglania obliczeń wewnętrznych.
Jakie są rozsądne rozmiary jednostek świata i wartości epsilon?
Aby zapewnić przenośność na różnych ekranach i gęstościach urządzeń, rozmiar jednostki świata powinien być niezależny od gęstości. Klasyczną jednostką w takich przypadkach są piksele niezależne od gęstości (dp). Zwykle wybieraj 1 dp jako rozmiar jednostki świata.
Wybierając stałą wartość epsilonu, unikaj zaokrąglania liczb w implementacji wewnętrznej do odległości większej niż piksel. Przy jednostce światowej o rozmiarze 1 dp epsilon powinien wynosić co najwyżej 1/4 (0,25 jednostki światowej), aby odpowiadać rozmiarowi piksela na urządzeniach o wysokiej gęstości wyświetlacza, na których 1 dp może mieć 4 piksele. Jeśli jednak chcesz umożliwić użytkownikowi powiększanie treści nawet 10-krotnie i utrzymać zaokrąglanie związane z epsilonem na poziomie 1 piksela lub mniejszym, epsilon powinien wynosić 0,25 podzielone przez 10, czyli 0,025 jednostki świata.
Nie oznacza to, że nie możesz powiększyć obrazu bardziej niż 10-krotnie, ale w takim przypadku możesz zauważyć pewne niedokładności i artefakty w renderowaniu pociągnięć.
Wybór wartości epsilona to kompromis między dokładnością szczegółów podczas powiększania a zasobami obliczeniowymi, takimi jak:
- cykle procesora do obliczania dokładniejszej geometrii,
- pamięć, w której można przechowywać więcej szczegółów dotyczących tej geometrii;
- czas renderowania geometrii przez GPU;
Te wytyczne to rozsądne wartości domyślne, ale możesz ich użyć do wybrania układu współrzędnych i wartości epsilon, które lepiej odpowiadają Twoim potrzebom.
Zbyt duże odchylenia od tych zalecanych wartości mogą negatywnie wpłynąć na Twoją aplikację. Na przykład zwiększone zużycie zasobów może spowolnić działanie aplikacji. W niektórych przypadkach problemy z precyzją liczb zmiennoprzecinkowych mogą też objawiać się dziwnymi artefaktami wizualnymi.