Die Wahl eines Koordinatensystems – also die Wahl dessen, was eine Welt-Einheit bedeutet – geht Hand in Hand mit der Wahl des Epsilon-Werts für den Pinsel.
Das Koordinatensystem spiegelt sich im Wert der Transformationsmatrix „inputToWorld“ wider, die Sie an InProgressStrokesView.startStroke() übergeben, und in der ähnlichen Transformation, die Sie beim Zeichnen von Trockenstrichen auf Canvas anwenden.
Bei einer typischen App können nur Welt-Einheiten berücksichtigt werden. Das strokeToWorldTransform-Argument von startStroke() kann als Standard-Einheitsmatrix beibehalten werden.
Wenn Ihre App das Schwenken, Zoomen oder Drehen einer Zeichenfläche unterstützt, ändert sich der genaue Wert dieser Transformationsmatrizen im Laufe der Zeit. Diese Änderungen spiegeln jedoch eine Änderung der Art und Weise wider, wie das Weltkoordinatensystem von der Kamera betrachtet wird, durch die der Nutzer die Zeichenfläche sieht.
Das Weltkoordinatensystem kann als Raster betrachtet werden, wobei jede Zelle die Größe einer Weltkoordinate hat. Epsilon ist eine Größe in diesem Raster, eine Gleitkommazahl in Weltkoordinaten.
Wenn Nutzer Ihre Inhalte vergrößern, wird auch das Raster der Weltkoordinateneinheit vergrößert. Daher ist die Wahl der Weltkoordinateneinheit und der Epsilon-Größe in Bezug auf eine standardmäßige Zoomstufe von 100% wichtig.
Die Definition der Größe der Welt-Einheit und der Epsilon-Wert in Welt-Einheiten müssen während der gesamten Lebensdauer Ihrer App feste Werte sein.
Bei der internen Implementierung wird mit Epsilon bestimmt, wie nah zwei Punkte beieinander liegen müssen, damit sie als derselbe Punkt behandelt werden. Mit anderen Worten: Jede Distanz, die kleiner als Epsilon ist, wird als Distanz 0 behandelt. Dieser Wert wird verwendet, um interne Berechnungen zu quantisieren und zu runden.
Was sind angemessene Größen für die Welt-Einheiten und Epsilon-Werte?
Damit die Welt auf verschiedenen Bildschirmgrößen und Gerätedichten portierbar ist, sollte die Größe der Welt-Einheit unabhängig von der Dichte sein. Die klassische Einheit für solche Szenarien sind dichteunabhängige Pixel (dp). Normalerweise wählen Sie 1 dp als Größe der Welt-Einheit aus.
Wenn Sie einen festen Epsilon-Wert auswählen, sollten Sie vermeiden, dass die interne Implementierung Zahlen auf eine Entfernung rundet, die größer als ein Pixel ist. Bei einer Welt-Einheitengröße von 1 dp sollte Epsilon höchstens 1/4 (0,25 Welt-Einheiten) betragen, um der Größe eines Pixels auf Geräten mit hoher Displaydichte zu entsprechen, auf denen 1 dp 4 px entsprechen kann. Wenn Sie jedoch möchten, dass der Nutzer bis zu 10-mal in seine Inhalte hineinzoomen kann und die Epsilon-bezogene Rundung weiterhin auf 1 Pixel oder weniger begrenzt bleibt, sollte Epsilon 0,25 geteilt durch 10 betragen, was 0,025 Einheiten entspricht.
Das bedeutet nicht, dass Sie nicht weiter als 10-fach zoomen können. Allerdings können dann Ungenauigkeiten und Artefakte beim Rendern der Striche auftreten.
Die Wahl eines Epsilon-Werts ist ein Kompromiss zwischen präzisen Details beim Zoomen und Rechenressourcen wie:
- CPU-Zyklen zum Berechnen einer genaueren Geometrie
- Speicher, um mehr Details in dieser Geometrie zu speichern
- GPU-Zeit zum Rendern dieser Geometrie
Diese Richtlinien sind angemessene Standardeinstellungen. Sie können sie jedoch verwenden, um Koordinatensysteme und Epsilon-Werte auszuwählen, die besser zu Ihren Anforderungen passen.
Wenn Sie zu stark von diesen empfohlenen Werten abweichen, kann sich das negativ auf Ihre Anwendung auswirken. Beispielsweise kann ein erhöhter Ressourcenverbrauch dazu führen, dass Ihre Anwendung langsam ausgeführt wird. In einigen Fällen können Probleme mit der Gleitkommazahlgenauigkeit auch zu seltsamen visuellen Artefakten führen.