Γιατί αντικαταστήσαμε τρεις μηχανές γεωμετρίας του μαρκαδόρου επισήμανσης με σφραγίδες
Πραγματικά δεδομένα από το Apple Pencil αποκάλυψαν ελαττώματα που παρέβλεψαν οι συνθετικές δοκιμές και οδήγησαν το Lulucat Notes από τρεις μηχανές περιγράμματος στο μοντέλο σφραγίδων MaLiang.
Το Lulucat Notes ξεκίνησε με έναν συμβατικό αποδότη μαρκαδόρου επισήμανσης: κατασκευάζαμε ένα γεωμετρικό περίγραμμα γύρω από τη δειγματοληπτημένη διαδρομή και κατόπιν γεμίζαμε αυτό το περίγραμμα μία φορά με ένα ημιδιαφανές χρώμα. Ένα μόνο γέμισμα αποφεύγει τις πιο σκούρες ζώνες που εμφανίζονται όπου επικαλύπτονται ημιδιαφανή τμήματα. Επίσης, βάζει κάθε ένωση, αυτοτομή, απόληξη και σύντομη πινελιά μέσα στο ίδιο πρόβλημα γεωμετρίας.
Τρεις γενιές προσαρμοσμένης γεωμετρίας αφαίρεσαν η καθεμία μία κατηγορία ελαττωμάτων και αποκάλυψαν μια άλλη. Ο αποδότης που διαθέτουμε τώρα χρησιμοποιεί μαλακές κυκλικές σφραγίδες βασισμένες στο MaLiang, ένα πλαίσιο σχεδίασης ανοιχτού κώδικα με άδεια MIT από τον Harley-xk. Σε αντάλλαγμα για την εξάλειψη μιας ολόκληρης κατηγορίας αστοχιών περιγράμματος, αποδεχτήκαμε πιο σκούρες αυτοτομές και απολήξεις που λεπταίνουν με την πίεση.

Το αρχικό στιγμιότυπο οθόνης από τη συσκευή σε μεγέθυνση 228%. Μικρά άγκιστρα εμφανίζονται και στα δύο άκρα αρκετών πινελιών.
Η πραγματική γραφή δημιούργησε άγκιστρα που δεν έβγαλαν οι συνθετικές σκηνές
Οι συνθετικές σκηνές μας κάλυπταν ευθείες γραμμές, τόξα, σύντομα αγγίγματα, επιστροφές, αλλαγές πίεσης και απότομες στροφές, και όλα αποδίδονταν καθαρά. Η πραγματική κινεζική γραφή εξακολουθούσε να δημιουργεί άγκιστρα μήκους περίπου 1–3 points στην αρχή και στο τέλος πολλών πινελιών.
Γι’ αυτό προσθέσαμε ένα κουμπί αποθήκευσης στην εφαρμογή και καταγράψαμε 29 ολοκληρωμένες πινελιές. Κάθε δείγμα διατηρούσε τη θέση, την ακτίνα, την πίεση, το αζιμούθιο, τη γωνία ανύψωσης, τη χρονική σήμανση και τις σημαίες εκτίμησης του UIKit. Ένα πρόγραμμα εκτός σύνδεσης αποκωδικοποίησε αυτό το JSON και μεταγλώττισε τα ίδια αρχεία Stroke.swift, StrokeRenderer.swift και HighlighterStrokeBuilder.swift που χρησιμοποιεί η εφαρμογή. Η έξοδός του ταίριαζε με το στιγμιότυπο της συσκευής πινελιά προς πινελιά, μαζί με τα άγκιστρα.
Επειδή ο αποδότης εκτός σύνδεσης αναπαρήγαγε το ελάττωμα μόνο από την καταγεγραμμένη είσοδο, η αιτία βρισκόταν στα δείγματα και στη γεωμετρία, όχι στη συμπεριφορά της οθόνης. Μπορούσαμε πλέον να διαβάσουμε τα ακριβή δείγματα που είχαν εισέλθει στον αποδότη.
Η πρώτη μας υπόθεση κατηγόρησε τον εκτιμώμενο προσανατολισμό του Pencil κατά την επαφή και την απομάκρυνση. Τα δεδομένα την απέρριψαν. Και στις 29 πινελιές, το αζιμούθιο άλλαζε το πολύ κατά 0.09 radians και η γωνία ανύψωσης το πολύ κατά 0.02 radians μέσα στα πρώτα και τα τελευταία οκτώ δείγματα, ενώ κάθε σημαία εκτίμησης ήταν false σε εκείνο το iPad. Ο προσανατολισμός παρέμενε σταθερός, ενώ η πίεση και η κατεύθυνση άλλαζαν απότομα.
Ένα κατώφλι πίεσης προέκυψε από ένα καθαρό κενό στα δεδομένα
Το τελευταίο δείγμα κάθε καταγεγραμμένης πινελιάς είχε πίεση 0.000. Τα δείγματα κατά τη γραφή βρίσκονταν στο 0.01 ή ψηλότερα, ενώ τα δείγματα που καταγράφονταν αφού το Pencil είχε φύγει από την επιφάνεια βρίσκονταν στο 0.002 ή χαμηλότερα. Αυτά τα δείγματα στον αέρα συχνά συνεχίζονταν για 2–7 points και διένυαν 0.8–9.0 points, ενώ η κατεύθυνσή τους μπορούσε να στραφεί περίπου 90 degrees μακριά από την πινελιά που γραφόταν.
Η πινελιά 2 δείχνει τον μηχανισμό. Το σώμα της τελείωνε μεταξύ 143 και 180 degrees. Η ουρά χαμηλής πίεσης έπειτα στρεφόταν από −90 έως −67 degrees και διένυε άλλα 8.5 points. Ο αποδότης περιγράμματος θεωρούσε το τελευταίο δείγμα στον αέρα ως το έγκυρο τελικό σημείο, οπότε τέντωνε ένα στενό κομμάτι γεωμετρίας προς εκείνο το σημείο.
Οι μετρημένες πιέσεις αφήνουν σχεδόν μία τάξη μεγέθους ανάμεσα στην κίνηση κατά τη γραφή και την κίνηση στον αέρα, οπότε τοποθετήσαμε την αποκοπή μέσα σε αυτό το κενό:
private static let pressureFloor: CGFloat = 0.005
Αφαιρούνται μόνο δείγματα χαμηλής πίεσης στα δύο άκρα. Ένα δείγμα χαμηλής πίεσης στη μέση μιας πινελιάς παραμένει μέρος της. Ο κανόνας ακολουθεί το μετρημένο όριο του γεγονότος και αφήνει τη γραμμένη διαδρομή ανέπαφη.

Πριν από την περικοπή, ο αποδότης αγκυρώνει την απόληξη στα δείγματα στον αέρα. Οι πράσινες κουκκίδες είναι τα ακατέργαστα δείγματα· η κόκκινη γραμμή είναι το παραγόμενο περίγραμμα.

Μετά την περικοπή δειγμάτων κάτω από 0.005, η απόληξη τελειώνει στο τελευταίο σημείο της γραφής. Αυτό το κατώφλι πίεσης παραμένει στον τρέχοντα αποδότη σφραγίδων.
Το κατώφλι αφαίρεσε τα μακριά άγκιστρα στον αέρα. Οι σύντομες έλξεις κατά την επαφή και τα τόξα κατά την απομάκρυνση, των οποίων η πίεση παρέμενε πάνω από 0.005, επιβίωσαν, επειδή αποτελούν γραμμένη κίνηση. Η διαχείριση αυτών των κινήσεων μέσα σε ένα μοντέλο περιγράμματος οδήγησε στους επόμενους γύρους γεωμετρίας.
Τρεις μηχανές γεωμετρίας μετέθεσαν τα ελαττώματα
Γενιά ένα: ένα περίγραμμα, ένα γέμισμα
Η πρώτη μηχανή ευαίσθητη στην πίεση ακολουθούσε μια γνώριμη διαδικασία. Εξομάλυνε μια κεντρική γραμμή, υπολόγιζε αριστερές και δεξιές μετατοπίσεις, τις ένωνε σε ένα πολύγωνο και γέμιζε αυτό το πολύγωνο μία φορά. Η μύτη ήταν μια έλλειψη που καθοριζόταν από το αζιμούθιο και τη γωνία ανύψωσης του Apple Pencil, οπότε η διατομή της άλλαζε ανάλογα με την κατεύθυνση της γραφής. Τα σύντομα αγγίγματα είχαν ξεχωριστό σχήμα και οι επίπεδες απολήξεις χρησιμοποιούσαν μικρές ασυμμετρίες ώστε να αποφεύγονται κοιλότητες μηδενικής περιέλιξης.
Το ένα γέμισμα έλυσε τη συσσώρευση αδιαφάνειας μέσα σε μια πινελιά και απαιτούσε έγκυρο πολύγωνο σε κάθε στροφή. Οι έλξεις κατά την επαφή δημιουργούσαν σφήνες ανάμεσα στην απόληξη και το σώμα. Οι επιστροφές μπορούσαν να δημιουργήσουν λευκές κοιλότητες σε σχήμα ημισελήνου. Οι απότομες στροφές μπορούσαν να κάνουν το εσωτερικό περίγραμμα να αυτοτέμνεται και να αφήνουν μια ακάλυπτη εγκοπή.
Γενιά δύο: διόρθωση του περιγράμματος κοντά στις απολήξεις
Η δεύτερη μηχανή διατήρησε το περίγραμμα και πρόσθεσε τοπικές διορθώσεις: περικοπή επιστροφών, απόσβεση για πρώιμες εκτιμώμενες ιδιότητες, ευθυγράμμιση τελικών σημείων, περικοπή παροδικής κατεύθυνσης και μια μικρή επέκταση απόληξης. Κάθε διόρθωση αντιμετώπιζε μια αναπαραγμένη αστοχία. Όλες μαζί έκαναν τη συμπεριφορά των απολήξεων να εξαρτάται από πολλά κατώφλια και παράθυρα.
Η πραγματική γραφή έπειτα δημιούργησε περιπτώσεις έξω από αυτά τα παράθυρα. Ένα σταθερό παράθυρο ευθυγράμμισης 24-point έσβηνε σκόπιμα άγκιστρα σε σύντομες πινελιές. Ένα προσαρμοστικό παράθυρο διατηρούσε αυτά τα άγκιστρα, ενώ τα τόξα απομάκρυνσης μπορούσαν και πάλι να γίνουν ορατές γωνίες. Η περικοπή με επίγνωση κατεύθυνσης αφαίρεσε περισσότερη παροδική κίνηση, με τίμημα την απόρριψη περίπου 2.5 points μιας πραγματικά καμπύλης αρχής σε μία καταγεγραμμένη πινελιά.
Κάθε διόρθωση αντιμετώπισε την περίπτωση για την οποία προοριζόταν. Το υποκείμενο μοντέλο τους εξακολουθούσε να απαιτεί ένα σκληρό περίγραμμα που να παραμένει έγκυρο με θορυβώδη, καμπύλη είσοδο.
Γενιά τρία: ένωση κάλυψης με αποκομμένες τετράγωνες απολήξεις
Η τρίτη μηχανή σταμάτησε να κατασκευάζει ένα ενιαίο περίγραμμα. Σχεδίαζε ένα τραπέζιο για κάθε τμήμα και έναν δίσκο σε κάθε εσωτερικό δείγμα μέσα σε μια μάσκα κλίμακας του γκρι, έπαιρνε την ένωση της κάλυψης και έπειτα εφάρμοζε το χρώμα του μαρκαδόρου επισήμανσης μία φορά. Οι ημισέληνοι από επιστροφές, το σκούρεμα στις αυτοτομές και οι κοιλότητες μηδενικής περιέλιξης εξαφανίστηκαν, επειδή ο αποδότης δεν εξαρτιόταν πλέον από την περιέλιξη πολυγώνων.
Η ένωση στρογγύλεψε τις απολήξεις και επαναφέραμε τις τετράγωνες απολήξεις περικόπτοντας την κάλυψη με βάση δύο ημιεπίπεδα στα άκρα. Αυτή η περικοπή διόρθωσε ευθείες γραμμές σταθερής πίεσης και εισήγαγε ένα σοβαρότερο ελάττωμα: το σώμα μιας καμπύλης πινελιάς μπορεί νόμιμα να διασχίζει ένα ημιεπίπεδο άκρου, και τότε η περικοπή απόληξης αφαιρεί μέρος από τη μέση της πινελιάς. Κατά τη ζωντανή εισαγωγή, η κατεύθυνση της απόληξης άλλαζε συνεχώς, οπότε η περιοχή που περικοπτόταν μετακινούνταν και η πινελιά τρεμόπαιζε.

Ο καθολικός περιορισμός απόληξης περνά μέσα από το σώμα μιας καμπύλης πινελιάς.

Ο περιορισμός της περικοπής απολήξεων σε βασικά σχήματα εντός μισού πλάτους από την απόληξη αποκαθιστά αυτή την πινελιά.
Μια πύλη μήκους τόξου έκανε την περικοπή απολήξεων τοπική και διόρθωσε κάθε καταγεγραμμένη περίπτωση. Ένα ακραίο συνθετικό άγκιστρο εξακολουθούσε να δείχνει μια μικρή λευκή εγκοπή, εκεί όπου μια άκρη χαμηλής πίεσης συναντούσε την περικομμένη απόληξη. Η τρίτη μηχανή είχε και πάλι ανταλλάξει μία αστοχία γεωμετρίας με μια άλλη.
Η MaLiang αφαιρεί το σκληρό όριο
Το MaLiang χτίζει μια πινελιά από επαναλαμβανόμενες σφραγίδες υφής αντί για ένα κλειστό περίγραμμα. Η γεννήτρια διαδρομής του χρησιμοποιεί τμήματα τετραγωνικής καμπύλης Bézier που περνούν από τα μέσα διαδοχικών δειγμάτων και ο αποδότης γραμμών τοποθετεί σφραγίδες σε τακτικό βήμα κατά μήκος αυτής της διαδρομής. Το μέγεθος, η περιστροφή, το χρώμα και η αδιαφάνεια της σφραγίδας μπορούν να μεταβάλλονται κατά μήκος της πινελιάς.
Μια μαλακή σφραγίδα δεν έχει ξεχωριστή απόληξη, ένωση ή κανόνα περιέλιξης. Μια απότομη αλλαγή κατεύθυνσης παραμένει μια ακολουθία επικαλυπτόμενων σημαδιών. Οι επιστροφές δεν μπορούν να δημιουργήσουν άδεια κοιλότητα πολυγώνου και ένα ημιεπίπεδο άκρου δεν μπορεί να κόψει τη μέση μιας πινελιάς, επειδή το μοντέλο δεν περιέχει αποκοπή άκρου.
Υιοθετήσαμε το μοντέλο, όχι τον κώδικα. Το τρέχον HighlighterStrokeBuilder εκτελεί τέσσερις λειτουργίες:
- Αφαιρεί μόνο δείγματα στα άκρα των οποίων η πίεση είναι κάτω από
0.005. - Εξομαλύνει τις θέσεις με τμήματα τετραγωνικής καμπύλης Bézier μέσω των μέσων σημείων.
- Τοποθετεί μία κυκλική σφραγίδα σε κάθε σημείο του μήκους τόξου.
- Ορίζει τη διάμετρο της σφραγίδας από την κανονικοποιημένη πίεση και συνθέτει τις σφραγίδες με άλφα source-over.
Ο builder μειώθηκε από 686 γραμμές στις 190. Το αζιμούθιο, η γωνία ανύψωσης, η κατασκευή περιγράμματος, οι μάσκες ένωσης, τα παράθυρα κατεύθυνσης των άκρων, η επέκταση απολήξεων και η περικοπή απολήξεων έφυγαν όλα από τη διαδρομή του μαρκαδόρου επισήμανσης. Εξακολουθούμε να καταγράφουμε τον προσανατολισμό του Pencil, επειδή το μοντέλο εισόδου τον υποστηρίζει, και ο ίδιος ο μαρκαδόρος επισήμανσης δεν διαβάζει πλέον αυτά τα πεδία.
Ο τύπος πίεσης της MaLiang χρειάστηκε βαθμονόμηση συσκευής
Η MaLiang υπολογίζει το μέγεθος μιας σφραγίδας με έναν τύπο ισοδύναμο με
ο οποίος υποθέτει ότι το force χρησιμοποιεί ένα χρήσιμο τμήμα του εύρους από 0 έως 1. Τα δεδομένα της συσκευής μας δεν το έκαναν. Σε περίπου 3.400 δείγματα Apple Pencil, η διάμεση πίεση ήταν 0.047 και η μέγιστη 0.178. Η απευθείας τροφοδότηση αυτών των τιμών στον τύπο έκανε την κανονική γραφή πολύ λεπτότερη από το ονομαστικό μέγεθος του πινέλου.
Επομένως, κανονικοποιούμε γύρω από την παρατηρημένη διάμεσο, εφαρμόζουμε έπειτα τον εκθέτη και περιορίζουμε το αποτέλεσμα:
Η διάμεση πίεση γραφής αντιστοιχεί πλέον στην ονομαστική διάμετρο των 12-point. Η πολύ ελαφριά επαφή παραμένει ορατή στο 35% του ονομαστικού μεγέθους, ενώ η έντονη πίεση σταματά να μεγαλώνει στο 120%.
Αυτή η βαθμονόμηση ανήκει στη συσκευή εισόδου και στη συμπεριφορά του πινέλου, όχι στη MaLiang. Η αντιγραφή του αρχικού τύπου χωρίς μέτρηση της δικής μας κατανομής πίεσης θα είχε διατηρήσει την αρχιτεκτονική και θα είχε δημιουργήσει λάθος πινέλο.
Η αδιαφάνεια ανά σφραγίδα προέκυψε από τον γνωστό αριθμό επικαλύψεων
Η MaLiang αντισταθμίζει τις επικαλυπτόμενες ημιδιαφανείς σφραγίδες με την εμπειρική έκφραση alpha ÷ overlapping × 2.5. Το πινέλο μας έχει σταθερή ονομαστική διάμετρο 12-point και βήμα σφραγίδας 1-point, οπότε η κεντρική γραμμή λαμβάνει περίπου 12 στρώσεις. Στην περίπτωσή μας ο αριθμός επικαλύψεων είναι γνωστός και η αντιστάθμιση μπορεί να λυθεί αντί να εκτιμηθεί.
Για αδιαφάνεια πινελιάς-στόχο
οπότε μία σφραγίδα απαιτεί
Με

Ο τελικός αποδότης επαναλαμβάνει τις καταγεγραμμένες διαδρομές της συσκευής. Άγκιστρα, διαγώνιες τομές και λευκές κοιλότητες απουσιάζουν.
Τα δύο κόστη που αποδεχτήκαμε
Οι αυτοτομές γίνονται πιο σκούρες. Η σύνθεση source-over μετρά κάθε σφραγίδα, συμπεριλαμβανομένων των σφραγίδων που τοποθετήθηκαν από προηγούμενο πέρασμα στην ίδια περιοχή, ενώ η μηχανή ένωσης κάλυψης το είχε αποφύγει. Αποδεχτήκαμε την πιο σκούρα επικάλυψη επειδή είναι προβλέψιμη και αφήνει το σχήμα της πινελιάς ανέπαφο.
Οι απολήξεις στενεύουν με την πίεση. Μια πραγματική απομάκρυνση μειώνει την πίεση, η οποία μειώνει τη διάμετρο της σφραγίδας, οπότε η πινελιά λεπταίνει αντί να τελειώνει σε τετράγωνη απόληξη πλήρους πλάτους. Είχαμε αντιμετωπίσει αυτή την τετράγωνη απόληξη ως απαίτηση και στις τρεις μηχανές γεωμετρίας. Η κατάργησή της αφαίρεσε την περικοπή και τον μηχανισμό απολήξεων πίσω από αρκετές από τις παραπάνω αστοχίες, οπότε αποδεχτήκαμε το κωνικό άκρο.
Το μοντέλο που διαθέτουμε κάνει επομένως λιγότερα από τα προηγούμενα. Διατηρεί το μετρημένο γεγονός γραφής, ανταποκρίνεται στην πίεση μετά τη βαθμονόμηση της συσκευής και αποδίδει καμπύλες και αυτοτεμνόμενες διαδρομές χωρίς να απαιτεί ένα καθολικά έγκυρο περίγραμμα. Μια μύτη σε σχήμα σμίλης, μια απόλυτα τετράγωνη απόληξη και η ακριβής πολυγραμμή ανάμεσα στα ακατέργαστα δείγματα είναι τα χαρακτηριστικά που θυσιάσαμε γι’ αυτό.
Από όλα όσα παρήγαγε η διερεύνηση, το κατώφλι πίεσης μεταφέρεται πιο άμεσα σε άλλα έργα. Η τιμή 0.005 προέκυψε από το κενό ανάμεσα σε δύο συστάδες πραγματικής εισόδου: γραφή στο 0.01 και πάνω, παρακολούθηση στον αέρα στο 0.002 και κάτω. Οι ίδιες καταγεγραμμένες πινελιές έδειξαν έπειτα πού απέτυχε κάθε διόρθωση γεωμετρίας. Αυτές οι αστοχίες οδήγησαν στο μοντέλο σφραγίδων και στα δύο κόστη που αυτό συνεπάγεται.