מערכת קואורדינטות ואפסילון

הבחירה שלכם במערכת קואורדינטות – במילים אחרות, הבחירה שלכם לגבי המשמעות של 1 יחידה עולמית – קשורה לבחירה שלכם בערך האפסילון של המברשת. מערכת הקואורדינטות משתקפת בערך של מטריצת הטרנספורמציה inputToWorld שמעבירים אל InProgressStrokesView.startStroke() ובטרנספורמציה הדומה שמחילים על Canvas כשמציירים קווים יבשים.

באפליקציה רגילה אפשר להשתמש רק ביחידות עולמיות ולהשאיר את הארגומנט strokeToWorldTransform של startStroke() כמטריצת הזהות שמוגדרת כברירת מחדל.

אם האפליקציה תומכת בהזזה, בהגדלה או בסיבוב של משטח ציור, הערך המדויק של מטריצות הטרנספורמציה האלה ישתנה לאורך זמן, אבל השינויים האלה משקפים שינוי באופן שבו מערכת קואורדינטות העולם מוצגת על ידי המצלמה שדרכה המשתמש רואה את משטח הציור.

אפשר לדמיין את מערכת הקואורדינטות העולמית כרשת שבה כל תא הוא בגודל של יחידה עולמית. אפסילון הוא גודל ברשת הזו, מספר נקודה צפה של יחידות עולמיות.

כשמשתמשים מגדילים את התצוגה של התוכן, הם מגדילים גם את התצוגה של רשת יחידות העולם, ולכן חשוב לבחור את יחידת העולם ואת גודל האפסילון בהתאם לרמת ברירת המחדל של הגדלת התצוגה (100%).

ההגדרה של גודל היחידה בעולם וערך האפסילון ביחידות עולמיות צריכים להיות ערכים קבועים לאורך חיי האפליקציה.

ההטמעה הפנימית משתמשת באפסילון כדי לקבוע עד כמה שתי נקודות צריכות להיות קרובות זו לזו כדי שייחשבו כנקודה זהה. במילים אחרות, כל מרחק קטן מאפסילון נחשב למרחק אפס. הוא משמש לכימות ולעיגול של חישובים פנימיים.

מהם גדלי יחידות סבירים בעולם וערכי אפסילון?

כדי לאפשר ניוד בין מסכים בגדלים שונים ובין צפיפויות מכשירים שונות, גודל יחידת העולם צריך להיות בלתי תלוי בצפיפות. היחידה הקלאסית לתרחישים כאלה היא פיקסלים שאינם תלויים בדחיסות (dp). בדרך כלל בוחרים 1 dp בתור גודל היחידה בעולם.

כשבוחרים ערך קבוע של אפסילון, צריך להימנע מהעיגול של מספרים בהטמעה הפנימית למרחק גדול יותר מפיקסל. אם גודל יחידת העולם הוא 1dp, אפסילון צריך להיות לכל היותר 1/4 (0.25 יחידות עולם) כדי להיות בגודל של פיקסל במכשירים עם צפיפות תצוגה גבוהה שבהם 1dp יכול להיות 4px. עם זאת, אם רוצים לאפשר למשתמשים להגדיל את התוכן עד פי 10, ועדיין לשמור על עיגול שקשור לאפסילון של פיקסל אחד או פחות, אז ערך האפסילון צריך להיות 0.25 חלקי 10, כלומר 0.025 יחידות עולמיות.

זה לא אומר שאי אפשר להגדיל יותר מפי 10, אבל יכול להיות שתתחילו לראות חוסר דיוק ופריטי מידע שנוצרו בתהליך הפיתוח (Artifact) בעיבוד של קו הציור בשלב הזה.

בחירת ערך אפסילון היא איזון בין פרטים מדויקים כשמבצעים זום אין לבין משאבי מחשוב כמו:

  • מחזורי מעבד לחישוב גיאומטריה מדויקת יותר
  • זיכרון לאחסון פרטים נוספים בצורה הגיאומטרית הזו
  • זמן GPU לעיבוד הגיאומטריה

ההנחיות האלה הן הגדרות ברירת מחדל סבירות, אבל אתם יכולים להשתמש בהן כדי לבחור מערכת קואורדינטות וערכי אפסילון שמתאימים יותר לצרכים שלכם.

חריגה משמעותית מהערכים המומלצים האלה עלולה להשפיע לרעה על האפליקציה. לדוגמה, צריכת משאבים מוגברת יכולה לגרום להרצת האפליקציה לאט. במקרים מסוימים, בעיות בדיוק של נקודה צפה יכולות להתבטא גם כארטיפקטים ויזואליים מוזרים.