Zakaj smo tri geometrijske pogone označevalnika zamenjali z odtisi
Podatki iz Apple Pencila so razkrili napake, ki jih sintetični testi niso, zato je Lulucat Notes tri obrisne pogone zamenjal z modelom odtisov MaLiang.
Lulucat Notes se je začel z običajnim izrisovalnikom označevalnika: okoli vzorčene poti zgradimo geometrijski obris, nato pa ta obris enkrat zapolnimo s prosojno barvo. Enkratno zapolnjevanje prepreči temnejše pasove, ki se pojavijo, ko se prosojni odseki prekrivajo. Hkrati postavi vsak stik, samopresečišče, zaključek in kratko potezo v isti geometrijski problem.
Tri generacije lastne geometrije so vsaka odstranile en razred napak in razkrile drugega. Izrisovalnik, ki ga zdaj dobavljamo, uporablja mehke krožne odtise na osnovi MaLiang, odprtokodnega ogrodja za risanje pod licenco MIT, ki ga je razvil Harley-xk. V zameno za odstranitev celotne kategorije napak obrisov smo sprejeli temnejša samopresečišča in konce, zožene glede na pritisk.

Prvotni posnetek zaslona naprave pri 228 % povečavi. Na obeh koncih več potez se pojavijo majhni kavlji.
Pravo rokopisno pisanje je ustvarilo kavlje, ki jih sintetični prizori niso
Naši sintetični prizori so pokrivali ravne črte, loke, kratke dotike, vračanja po potezi, spremembe pritiska in ostre zavoje; vsi so se izrisali čisto. Pravo kitajsko rokopisno pisanje je na začetku in koncu številnih potez še vedno ustvarjalo približno 1–3 točke dolge kavlje.
Zato smo aplikaciji dodali gumb za shranjevanje in posneli 29 celotnih potez. Vsak vzorec je ohranil svoj položaj, polmer, pritisk, azimut, višinski kot, časovni žig in zastavice UIKit za ocene. Program brez povezave je dekodiral ta JSON in prevedel iste datoteke Stroke.swift, StrokeRenderer.swift in HighlighterStrokeBuilder.swift, ki jih uporablja aplikacija. Njegov izhod se je ujemal s posnetkom zaslona naprave potezo za potezo, vključno s kavlji.
Ker je izrisovalnik brez povezave napako poustvaril samo iz posnetega vhoda, je bil vzrok v vzorcih in geometriji, ne v vedenju prikaza. Zdaj smo lahko prebrali natančne vzorce, ki so vstopili v izrisovalnik.
Naša prva hipoteza je za orientacijo Pencila ob dotiku in dvigu krivila ocenjene vrednosti. Podatki so jo zavrnili. Pri vseh 29 potezah se je azimut v prvih in zadnjih osmih vzorcih spremenil za največ 0.09 radiana, višinski kot pa za največ 0.02 radiana, vse zastavice ocen pa so bile na tem iPadu false. Orientacija je ostala stabilna, medtem ko sta se pritisk in smer močno spremenila.
Prag pritiska je izšel iz čiste vrzeli v podatkih
Zadnji vzorec vsake posnete poteze je imel pritisk 0.000. Vzorci pri pisanju so bili pri 0.01 ali nad njim, vzorci, posneti po dvigu Pencila s površine, pa pri 0.002 ali pod njim. Ti zračni vzorci so se pogosto nadaljevali še 2–7 točk in prepotovali 0.8–9.0 točk, njihova smer pa se je lahko obrnila za približno 90 stopinj stran od napisane poteze.
Mehanizem pokaže poteza 2. Njeno telo se je končalo med 143 in 180 stopinjami. Rep z nizkim pritiskom se je nato obrnil na −90 do −67 stopinj in prepotoval še 8.5 točke. Izrisovalnik obrisov je zadnjo zračno točko obravnaval kot merodajno končno točko, zato je proti njej raztegnil ozek del geometrije.
Merjeni pritiski pustijo med pisanjem in zračnim gibanjem skoraj velikostni red razlike, zato smo prag postavili znotraj te vrzeli:
private static let pressureFloor: CGFloat = 0.005
Odstranijo se samo vzorci z nizkim pritiskom na obeh koncih. Vzorec z nizkim pritiskom na sredini poteze ostane njen del. Pravilo sledi izmerjeni meji dogodka in napisane poti ne spreminja.

Pred obrezovanjem izrisovalnik sidra zaključek na zračne vzorce. Zelene pike so surovi vzorci; rdeča črta je ustvarjeni obris.

Po odstranitvi vzorcev pod 0.005 se zaključek konča pri zadnji napisani točki. Ta prag pritiska ostaja v trenutnem izrisovalniku z odtisi.
Prag je odstranil dolge zračne kavlje. Kratki sunki ob dotiku in loki ob dvigu, katerih pritisk je ostal nad 0.005, so preživeli, ker gre za napisano gibanje. Obravnava teh gibanj z modelom obrisov je vodila v naslednje kroge geometrije.
Trije geometrijski pogoni so napake samo prestavljali
Prva generacija: en obris, eno zapolnjevanje
Prvi na pritisk občutljivi pogon je sledil znanemu cevovodu. Zgladil je osrednjo linijo, izračunal levi in desni odmik, ju združil v en poligon in ga enkrat zapolnil. Konica je bila elipsa, ki sta jo določala azimut in višinski kot Apple Pencila, zato se je njen presek spreminjal s smerjo pisanja. Kratki dotiki so imeli ločeno obliko, ploski zaključki pa so uporabljali majhne asimetrije za preprečevanje praznih območij zaradi pravila ničelnega windinga.
Enkratno zapolnjevanje je rešilo nabiranje motnosti znotraj poteze in zahtevalo veljaven poligon pri vsakem zavoju. Vlečenja ob dotiku so ustvarila kline med zaključkom in telesom. Vračanja po potezi so lahko ustvarila bele polmesece. Ostri zavoji so lahko povzročili, da se je notranji obris samopresekal in pustil nezapolnjeno zarezo.
Druga generacija: popravilo obrisov blizu koncev
Drugi pogon je ohranil obris in dodal lokalne popravke: obrezovanje vračanj, dušenje zgodnjih ocenjenih lastnosti, izravnavanje končnih točk, obrezovanje prehodne smeri in majhen podaljšek zaključka. Vsak popravek je obravnaval poustvarjeno napako. Skupaj so povzročili, da je bilo vedenje koncev odvisno od več pragov in oken.
Pravo pisanje je nato ustvarilo primere zunaj teh oken. Fiksno okno za izravnavanje s 24 točkami je v kratkih potezah izbrisalo namerne kavlje. Prilagodljivo okno je te kavlje ohranilo, loki ob dvigu pa so se lahko še vedno spremenili v vidne kote. Obrezovanje, ki upošteva smer, je odstranilo več prehodnega gibanja, vendar za ceno približno 2.5 točke pristno ukrivljenega začetka v eni posneti potezi.
Vsak popravek je popravil svoj ciljni primer. Model pod njimi pa je še vedno zahteval trd obris, ki je ostal veljaven pri šumnem, ukrivljenem vhodu.
Tretja generacija: unija pokritosti z obrezanimi kvadratnimi zaključki
Tretji pogon je prenehal konstruirati en sam obris. Za vsak odsek je v sivinsko masko narisal trapez, pri vsakem notranjem vzorcu pa disk, nato vzel unijo njihove pokritosti in šele enkrat nanesel barvo označevalnika. Polmeseci pri vračanju, potemnitev samopresečišč in luknje zaradi ničelnega windinga so izginili, ker izrisovalnik ni bil več odvisen od smeri poligona.
Unija je zaoblila konce, zato smo kvadratne zaključke povrnili tako, da smo pokritost obrezali z dvema polravninama končnih točk. Ta obrezava je popravila ravne črte s stalnim pritiskom in uvedla resnejšo napako: telo ukrivljene poteze lahko upravičeno prečka polravnino končne točke, obrezovanje zaključka pa je nato odstranilo del sredine poteze. Med izrisom v živo se je smer končne točke ves čas spreminjala, zato se je obrezano območje premikalo in poteza utripala.

Globalna omejitev zaključka prereže telo ukrivljene poteze.

Če obrezovanje zaključka omejimo na primitive znotraj ene polovične širine od končne točke, se ta poteza obnovi.
Omejitev po dolžini loka je obrezovanje zaključka naredila lokalno in popravila vsak posneti primer. Tudi skrajni sintetični kavelj je še vedno pokazal majhno belo zarezo, kjer se je konica z nizkim pritiskom srečala z obrezanim zaključkom. Tretja generacija je znova zamenjala eno geometrijsko napako za drugo.
MaLiang odstrani trdo mejo
MaLiang gradi potezo iz ponavljajočih se teksturnih odtisov namesto iz enega zaprtega obrisa. Njegov generator poti uporablja kvadratne Bézierjeve odseke, ki potekajo skozi sredine sosednjih vzorcev, izrisovalnik črt pa postavlja odtise v enakomernem koraku vzdolž te poti. Velikost, vrtenje, barva in motnost odtisa se lahko vzdolž poteze spreminjajo.
Mehki odtis nima ločenega zaključka, stika ali pravila windinga. Ostra sprememba smeri ostane zaporedje prekrivajočih se oznak. Vračanja ne morejo ustvariti praznega poligonskega žepka, polravnina končne točke pa ne more odrezati sredine poteze, ker model ne vsebuje obrezovanja končne točke.
Sprejeli smo model, ne kode. Trenutni HighlighterStrokeBuilder izvede štiri operacije:
- Odstrani samo končne vzorce, katerih pritisk je pod
0.005. - Zgladi položaje z uporabo kvadratnih Bézierjevih odsekov skozi sredine.
- Postavi en krožni odtis na vsako točko po dolžini loka.
- Premer odtisa določi iz normaliziranega pritiska in odtise sestavi z alfo source-over.
Gradnik se je skrčil s 686 vrstic na 190. Azimut, višinski kot, konstrukcija obrisov, maske unije, okna smeri končnih točk, podaljšek zaključka in obrezovanje zaključka so vsi zapustili pot označevalnika. Orientacijo Pencila še vedno beležimo, ker jo vhodni model podpira, vendar je označevalnik sam ne bere več.
MaLiangova formula za pritisk je potrebovala umerjanje naprave
MaLiang določi velikost odtisa s formulo, ekvivalentno
ki predpostavlja, da force uporablja uporaben del območja od 0 do 1. Naši podatki naprave tega niso pokazali. Med približno 3.400 vzorci Apple Pencila je bil mediani pritisk 0.047, največji pa 0.178. Če smo te vrednosti neposredno vnesli v formulo, je bilo običajno pisanje precej tanjše od nazivne velikosti čopiča.
Zato najprej normaliziramo okoli opaženega medianega pritiska, nato uporabimo eksponent in rezultat omejimo:
Mediani pritisk pri pisanju se zdaj preslika v nazivni premer 12 točk. Zelo rahel stik ostane viden pri 35 % nazivne velikosti, močan pritisk pa se ne poveča nad 120 %.
Ta kalibracija pripada vhodni napravi in vedenju čopiča, ne MaLiangu. Kopiranje izvirne formule brez merjenja lastne porazdelitve pritiska bi ohranilo arhitekturo in ustvarilo napačen čopič.
Alfa posameznega odtisa je izšla iz znanega števila prekrivanj
MaLiang kompenzira prekrivanje prosojnih odtisov z empiričnim izrazom alpha ÷ overlapping × 2.5. Naš čopič ima fiksni nazivni premer 12 točk in korak odtisa 1 točko, zato njegova sredinska črta prejme približno 12 plasti. Pri nas je število prekrivanj znano, zato lahko kompenzacijo rešimo namesto ocenimo.
Za ciljno motnost poteze
zato en odtis potrebuje
Pri

Končni izrisovalnik ponovno izrisuje posnete poti naprave. Kavljev, diagonalnih rezov in belih žepkov ni.
Dve ceni, ki smo ju sprejeli
Samopresečišča postanejo temnejša. Sestavljanje source-over šteje vsak odtis, vključno z odtisi, položenimi v prejšnjem prehodu čez isto območje, čemur se je izrisovalnik z unijo pokritosti izognil. Temnejše prekrivanje smo sprejeli, ker je predvidljivo in ohrani obliko poteze.
Konci se s pritiskom zožijo. Pravi dvig peresa zmanjša pritisk in s tem premer odtisa, zato se poteza zoži, namesto da bi se končala s polno širokim kvadratnim zaključkom. V vseh treh geometrijskih pogonih smo ta kvadratni zaključek obravnavali kot zahtevo. Če smo ga opustili, smo odstranili obrezovanje in mehanizem končnih točk, ki sta bila v ozadju več zgornjih napak, zato smo sprejeli zoženi konec.
Model, ki ga dobavljamo, zato naredi manj od prejšnjih. Ohrani izmerjeni dogodek pisanja, po umerjanju naprave se odziva na pritisk in izrisuje ukrivljene poti ter poti s samopresečišči, ne da bi zahteval globalno veljaven obris. Konica v obliki dleta, popolnoma kvadratni zaključek in natančna poligonska črta med surovimi vzorci so lastnosti, ki smo se jim za to odpovedali.
Prag pritiska se najbolj neposredno prenese v druge projekte. Vrednost 0.005 je prišla iz vrzeli med dvema skupinama v resničnem vhodu: pisanje pri 0.01 in več ter sledenje po zraku pri 0.002 in manj. Iste posnete poteze so pokazale, kje je odpovedal vsak geometrijski popravek. Te napake so vodile do modela odtisov in dveh cen, ki ju prinaša.