ಮೂರು ಹೈಲೈಟರ್ ಜ್ಯಾಮಿತಿ ಎಂಜಿನ್ಗಳ ಬದಲು ಸ್ಟ್ಯಾಂಪ್ಗಳನ್ನು ಆರಿಸಿದ ಕಾರಣ
ನೈಜ Apple Pencil ಡೇಟಾ ಕೃತಕ ಪರೀಕ್ಷೆಗಳಲ್ಲಿ ತಪ್ಪಿಸಿಕೊಂಡ ದೋಷಗಳನ್ನು ತೋರಿಸಿತು; ಅದರಿಂದ Lulucat Notes ಮೂರು ಹೊರರೇಖೆ ಎಂಜಿನ್ಗಳಿಂದ MaLiang ಸ್ಟ್ಯಾಂಪ್ ಮಾದರಿಗೆ ಸರಿಯಿತು.
Lulucat Notes ಆರಂಭದಲ್ಲಿ ಸಾಮಾನ್ಯ ಹೈಲೈಟರ್ ರೆಂಡರರ್ ಬಳಸುತ್ತಿತ್ತು: ಸ್ಯಾಂಪಲ್ ಮಾಡಿದ ಪಥದ ಸುತ್ತಲೂ ಒಂದು ಜ್ಯಾಮಿತೀಯ ಹೊರರೇಖೆ ಕಟ್ಟುವುದು, ನಂತರ ಅದನ್ನು ಪಾರದರ್ಶಕ ಬಣ್ಣದಿಂದ ಒಂದೇ ಬಾರಿ ತುಂಬುವುದು. ಒಂದೇ fill ಇರುವುದರಿಂದ ಪಾರದರ್ಶಕ ವಿಭಾಗಗಳು ಒಂದರ ಮೇಲೊಂದು ಬಿದ್ದಾಗ ಉಂಟಾಗುವ ಗಾಢ ಪಟ್ಟೆಗಳು ಕಾಣಿಸಿಕೊಳ್ಳುವುದಿಲ್ಲ. ಆದರೆ join, self-intersection, cap ಮತ್ತು ಚಿಕ್ಕ ಸ್ಟ್ರೋಕ್—ಇವೆಲ್ಲವೂ ಒಂದೇ ಜ್ಯಾಮಿತಿ ಸಮಸ್ಯೆಯೊಳಗೆ ಸೇರಬೇಕಾಗುತ್ತದೆ.
ಕಸ್ಟಮ್ ಜ್ಯಾಮಿತಿಯ ಮೂರು ತಲೆಮಾರುಗಳು ತಲಾ ಒಂದು ಬಗೆಯ ದೋಷವನ್ನು ತೆಗೆದರೂ, ಇನ್ನೊಂದು ಬಗೆಯ ದೋಷವನ್ನು ಹೊರಗೆ ತಂದವು. ಈಗಿನ ರೆಂಡರರ್ MaLiang ಆಧಾರಿತ ಮೃದುವಾದ ವೃತ್ತಾಕಾರದ ಸ್ಟ್ಯಾಂಪ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ; Harley-xk ನಿರ್ಮಿಸಿದ MIT-ಪರವಾನಗಿ ಪಡೆದ ಓಪನ್-ಸೋರ್ಸ್ ಡ್ರಾಯಿಂಗ್ ಫ್ರೇಮ್ವರ್ಕ್ ಅದು. ಹೊರರೇಖೆಯ ವೈಫಲ್ಯಗಳ ಒಂದು ದೊಡ್ಡ ವರ್ಗವನ್ನೇ ತೆಗೆದುಹಾಕುವ ಬದಲಿಗೆ, ಗಾಢವಾಗುವ self-intersections ಮತ್ತು ಒತ್ತಡ ಕಡಿಮೆಯಾದಂತೆ ಸಣ್ಣವಾಗುವ ತುದಿಗಳನ್ನು ನಾವು ಒಪ್ಪಿಕೊಂಡೆವು.

228% ಜೂಮ್ನಲ್ಲಿರುವ ಸಾಧನದ ಮೂಲ ಸ್ಕ್ರೀನ್ಶಾಟ್. ಹಲವು ಸ್ಟ್ರೋಕ್ಗಳ ಎರಡೂ ತುದಿಗಳಲ್ಲಿ ಸಣ್ಣ ಹುಕ್ಗಳು ಕಾಣುತ್ತವೆ.
ಕೃತಕ ದೃಶ್ಯಗಳಲ್ಲಿ ಕಾಣಿಸದ ಹುಕ್ಗಳನ್ನು ನೈಜ ಕೈಬರಹ ತೋರಿಸಿತು
ನಮ್ಮ synthetic scenes ನಲ್ಲಿ straight lines, arcs, short taps, backtracks, pressure changes ಮತ್ತು sharp turns ಎಲ್ಲವೂ ಇದ್ದವು; ಅವುಗಳ rendering ಸ್ವಚ್ಛವಾಗಿತ್ತು. ಆದರೂ ನೈಜ ಚೀನೀ ಕೈಬರಹದಲ್ಲಿ ಅನೇಕ ಸ್ಟ್ರೋಕ್ಗಳ ಆರಂಭ-ಅಂತ್ಯದಲ್ಲಿ ಸುಮಾರು 1–3 points ಉದ್ದದ ಹುಕ್ಗಳು ಕಾಣಿಸಿಕೊಂಡವು.
ಅದಕ್ಕಾಗಿ ಆ್ಯಪ್ಗೆ save button ಸೇರಿಸಿ 29 complete strokes ದಾಖಲಿಸಿದೆವು. ಪ್ರತಿಯೊಂದು sample-ನ position, radius, pressure, azimuth, altitude, timestamp ಮತ್ತು UIKit estimation flags ಉಳಿಸಿಕೊಂಡೆವು. Offline program ಆ JSON ಡಿಕೋಡ್ ಮಾಡಿ, ಆ್ಯಪ್ ಬಳಸುವ ಅದೇ Stroke.swift, StrokeRenderer.swift ಮತ್ತು HighlighterStrokeBuilder.swift ಫೈಲ್ಗಳನ್ನು compile ಮಾಡಿತು. ಹುಕ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ output ಸಾಧನದ screenshot ಗೆ stroke by stroke ಹೊಂದಿಕೊಂಡಿತು.
Recorded input ಮಾತ್ರದಿಂದ offline renderer ದೋಷವನ್ನು ಮತ್ತೆ ತೋರಿಸಿದ ಕಾರಣ, ಕಾರಣ display behavior ನಲ್ಲಿ ಇರಲಿಲ್ಲ; samples ಮತ್ತು geometry ಯಲ್ಲಿತ್ತು. Renderer ಗೆ ಸೇರಿದ ನಿಖರ samples ಈಗ ನಮ್ಮ ಮುಂದೆ ಇದ್ದವು.
Touchdown ಮತ್ತು lift-off ಸಮಯದಲ್ಲಿ ಅಂದಾಜಿಸಿದ Pencil orientation ಕಾರಣವಾಗಿರಬಹುದು ಎಂಬುದು ಮೊದಲ ಊಹೆ. ಡೇಟಾ ಅದನ್ನು ಒಪ್ಪಲಿಲ್ಲ. ಎಲ್ಲಾ 29 strokes ನಲ್ಲಿ first ಮತ್ತು last eight samples ಒಳಗೆ azimuth ಬದಲಾವಣೆ ಗರಿಷ್ಠ 0.09 radians, altitude ಬದಲಾವಣೆ ಗರಿಷ್ಠ 0.02 radians ಆಗಿತ್ತು; ಆ iPad ನಲ್ಲಿ ಎಲ್ಲ estimation flags-ವೂ false. Pressure ಮತ್ತು direction ತೀವ್ರವಾಗಿ ಬದಲಾಗುತ್ತಿದ್ದರೂ orientation ಸ್ಥಿರವಾಗಿತ್ತು.
ಡೇಟಾದಲ್ಲಿದ್ದ ಸ್ಪಷ್ಟ ಅಂತರವೇ pressure floor ಅನ್ನು ಸೂಚಿಸಿತು
ದಾಖಲಿಸಿದ ಪ್ರತಿಯೊಂದು stroke ನ ಕೊನೆಯ sample ನಲ್ಲಿ pressure 0.000 ಇತ್ತು. Writing samples 0.01 ಅಥವಾ ಮೇಲಾಗಿದ್ದವು; Pencil surface ಬಿಟ್ಟ ನಂತರ ಬಂದ samples 0.002 ಅಥವಾ ಕೆಳಗಿದ್ದವು. ಆ airborne samples ಹಲವು ಬಾರಿ 2–7 points ಮುಂದುವರಿದು 0.8–9.0 points ಪ್ರಯಾಣಿಸಿದವು; ಅವುಗಳ ದಿಕ್ಕು ಬರೆದ stroke ನಿಂದ ಸುಮಾರು 90 degrees ದೂರಕ್ಕೆ ತಿರುಗಬಹುದಿತ್ತು.
Stroke 2 ಆ ಪ್ರಕ್ರಿಯೆಯನ್ನು ತೋರಿಸುತ್ತದೆ. ಅದರ body 143 ಮತ್ತು 180 degrees ನಡುವಲ್ಲಿ ಮುಗಿಯಿತು. Low-pressure tail ನಂತರ −90 ರಿಂದ −67 degrees ವರೆಗೆ ತಿರುಗಿ ಇನ್ನೂ 8.5 points ಹೋಯಿತು. Outline renderer ಕೊನೆಯ airborne point ಅನ್ನು ನಿಜವಾದ endpoint ಎಂದು ಭಾವಿಸಿದುದರಿಂದ, ಆ point ಕಡೆಗೆ ಸಣ್ಣ geometry ತುಣುಕನ್ನು ಎಳೆದಿತು.
ಅಳತೆ ಮಾಡಿದ pressures ನಲ್ಲಿ writing ಮತ್ತು airborne movement ನಡುವೆ ಸುಮಾರು ಒಂದು order of magnitude ಅಂತರವಿತ್ತು. ಆದ್ದರಿಂದ cutoff ಅನ್ನು ಆ ಅಂತರದೊಳಗೆ ಇಟ್ಟೆವು:
private static let pressureFloor: CGFloat = 0.005
ಎರಡು ತುದಿಗಳಲ್ಲಿನ low-pressure samples ಮಾತ್ರ ತೆಗೆದುಹಾಕಲಾಗುತ್ತವೆ. Stroke ನ ಮಧ್ಯದಲ್ಲಿರುವ low-pressure sample ಅದರ ಭಾಗವಾಗಿಯೇ ಉಳಿಯುತ್ತದೆ. ಈ ನಿಯಮ measured event boundary ಯನ್ನು ಅನುಸರಿಸಿ, ಬರೆದ path ಅನ್ನು ಬದಲಾಯಿಸುವುದಿಲ್ಲ.

Trim ಮಾಡುವ ಮೊದಲು renderer cap ಅನ್ನು airborne samples ಗೆ anchor ಮಾಡುತ್ತದೆ. ಹಸಿರು dots raw samples; ಕೆಂಪು line generated outline.

0.005ಕ್ಕಿಂತ ಕಡಿಮೆ samples ತೆಗೆದ ನಂತರ cap ಕೊನೆಯ written point ನಲ್ಲಿ ಮುಗಿಯುತ್ತದೆ. ಈಗಿನ stamp renderer ನಲ್ಲೂ ಈ pressure floor ಇದೆ.
ಈ floor ದೀರ್ಘ airborne hooks ಅನ್ನು ತೆಗೆದುಹಾಕಿತು. 0.005ಕ್ಕಿಂತ ಮೇಲಾಗಿದ್ದ pressure ಹೊಂದಿದ ಚಿಕ್ಕ touchdown drags ಮತ್ತು lift-off arcs ಬರೆಯಲಾದ ಚಲನೆಯಾಗಿದ್ದರಿಂದ ಉಳಿದವು. ಅವುಗಳನ್ನು outline model ಒಳಗೆ ನಿರ್ವಹಿಸುವುದೇ ಮುಂದಿನ geometry ಸುತ್ತುಗಳಿಗೆ ದಾರಿ ಮಾಡಿತು.
ಮೂರು ಜ್ಯಾಮಿತಿ ಎಂಜಿನ್ಗಳು ದೋಷಗಳನ್ನು ಮಾತ್ರ ಸ್ಥಳಾಂತರಿಸಿದವು
ಮೊದಲ ತಲೆಮಾರು: ಒಂದು outline, ಒಂದು fill
ಮೊದಲ pressure-sensitive engine ಪರಿಚಿತ pipeline ಅನುಸರಿಸಿತು. Spine ಅನ್ನು smooth ಮಾಡಿ, ಎಡ-ಬಲ offsets ಲೆಕ್ಕಿಸಿ, ಅವನ್ನು ಒಂದೇ polygon ಆಗಿ ಸೇರಿಸಿ, polygon ಅನ್ನು ಒಮ್ಮೆ fill ಮಾಡಿತು. Nib ಒಂದು ellipse; Apple Pencil ನ azimuth ಮತ್ತು altitude ಅದನ್ನು ಚಾಲಿತಗೊಳಿಸುತ್ತಿದ್ದವು. ಹೀಗಾಗಿ ಬರೆಯುವ direction ಬದಲಾದಂತೆ cross-section ಕೂಡ ಬದಲಾಗುತ್ತಿತ್ತು. Short taps ಗೆ ಬೇರೆ shape ಇತ್ತು; zero-winding pockets ತಪ್ಪಿಸಲು flat caps ನಲ್ಲಿ ಸಣ್ಣ asymmetries ಬಳಸಲಾಗುತ್ತಿತ್ತು.
Single fill stroke ಒಳಗಿನ opacity accumulation ಅನ್ನು ನಿಲ್ಲಿಸಿತು, ಆದರೆ ಪ್ರತಿಯೊಂದು turn ನಲ್ಲೂ valid polygon ಬೇಕಿತ್ತು. Touchdown drags cap ಮತ್ತು body ನಡುವೆ wedges ತಂದವು. Backtracks white crescent pockets ಉಂಟುಮಾಡಬಹುದಾಗಿತ್ತು. Sharp turns inner outline ಅನ್ನು self-intersect ಮಾಡಿಸಿ fill ಆಗದ notch ಬಿಟ್ಟುಬಿಡಬಹುದಾಗಿತ್ತು.
ಎರಡನೇ ತಲೆಮಾರು: ತುದಿಗಳ ಹತ್ತಿರ outline repair ಮಾಡುವುದು
ಎರಡನೇ engine outline ಉಳಿಸಿಕೊಂಡು ಕೆಲವು local repairs ಸೇರಿಸಿತು: backtrack trimming, ಆರಂಭಿಕ estimated properties ಗೆ damping, endpoint straightening, transient-direction trimming ಮತ್ತು ಚಿಕ್ಕ cap extension. ಪ್ರತಿಯೊಂದು patch ಮರುಸೃಷ್ಟಿಸಿದ failure ಒಂದನ್ನು ಗುರಿಯಾಗಿಸಿತು. ಅವೆಲ್ಲ ಸೇರಿ endpoint behavior ಹಲವು thresholds ಮತ್ತು windows ಮೇಲೆ ಅವಲಂಬಿತವಾಯಿತು.
ನೈಜ ಬರವಣಿಗೆಯಲ್ಲಿ ಆ windows ಗೆ ಹೊರಗಿನ ಪ್ರಕರಣಗಳು ಎದುರಾದವು. ನಿಗದಿತ 24-point straightening window ಚಿಕ್ಕ strokes ನಲ್ಲಿ ಉದ್ದೇಶಪೂರ್ವಕ hooks ಅನ್ನು ಅಳಿಸಿತು. Adaptive window ಅವುಗಳನ್ನು ಉಳಿಸಿತು, ಆದರೆ lift-off arcs ಇನ್ನೂ ಕಾಣುವ corners ಆಗಬಹುದಾಗಿತ್ತು. Direction-aware trimming ಹೆಚ್ಚಿನ transient motion ತೆಗೆದುಹಾಕಿತು; ಬದಲಾಗಿ ಒಂದು recorded stroke ನ ನಿಜವಾಗಿ ವಕ್ರವಾಗಿದ್ದ ಆರಂಭದಿಂದ ಸುಮಾರು 2.5 points ಕಳೆದುಕೊಂಡೆವು.
ಪ್ರತಿಯೊಂದು patch ತನ್ನ ಗುರಿಯ case ಅನ್ನು ಸರಿಪಡಿಸಿತು. ಆದರೆ ಕೆಳಗಿನ model ಗೆ noisy, curved input ಎದುರು valid ಆಗಿ ಉಳಿಯುವ hard outline ಇನ್ನೂ ಅಗತ್ಯವಾಗಿತ್ತು.
ಮೂರನೇ ತಲೆಮಾರು: clipped square caps ಇರುವ coverage union
ಮೂರನೇ engine ಒಂದೇ contour ಕಟ್ಟುವುದನ್ನು ಬಿಟ್ಟಿತು. Grayscale mask ಒಳಗೆ ಪ್ರತಿ segment ಗೆ trapezoid ಮತ್ತು ಪ್ರತಿ interior sample ಗೆ disc ಚಿತ್ರಿಸಿ, coverage union ತೆಗೆದು, ನಂತರ highlighter color ಅನ್ನು ಒಮ್ಮೆ ಅನ್ವಯಿಸಿತು. Renderer polygon winding ಮೇಲೆ ಅವಲಂಬಿಸದ ಕಾರಣ backtrack crescents, self-intersection darkening ಮತ್ತು zero-winding holes ಮಾಯವಾದವು.
Union ತುದಿಗಳನ್ನು round ಮಾಡಿತು. ಆದ್ದರಿಂದ ಎರಡು endpoint half-planes ಬಳಸಿ coverage clip ಮಾಡಿ square caps ಹಿಂದಕ್ಕೆ ತಂದೆವು. ಆ clip constant-pressure straight lines ಅನ್ನು ಸರಿಪಡಿಸಿತು, ಆದರೆ ಗಂಭೀರ ಸಮಸ್ಯೆಯನ್ನೂ ತಂದಿತು: curved stroke ನ body endpoint half-plane ದಾಟುವುದು ನ್ಯಾಯಸಮ್ಮತವಾಗಿರಬಹುದು; cap clip ಆಗ stroke ನ middle ಭಾಗವನ್ನೇ ಅಳಿಸಿತು. Live input ನಲ್ಲಿ endpoint direction ಬದಲಾಗುತ್ತಿದ್ದುದರಿಂದ clipped area ಚಲಿಸಿ stroke flicker ಆಯಿತು.

Global cap constraint ವಕ್ರ stroke ನ body ಯನ್ನು ಕತ್ತರಿಸುತ್ತದೆ.

Endpoint ನ ಒಂದು half-width ಒಳಗಿನ primitives ಗಳಿಗೆ ಮಾತ್ರ cap clipping ಸೀಮಿತಗೊಳಿಸಿದರೆ ಈ stroke ಮತ್ತೆ ಸಿಗುತ್ತದೆ.
Arc-length gate cap clipping ಅನ್ನು local ಮಾಡಿ, ದಾಖಲಿಸಿದ ಪ್ರತಿಯೊಂದು case ಅನ್ನು ಸರಿಪಡಿಸಿತು. ಆದರೂ extreme synthetic hook ನಲ್ಲಿ low-pressure tip clipped cap ಅನ್ನು ತಾಗುವ ಸ್ಥಳದಲ್ಲಿ ಸಣ್ಣ white notch ಕಂಡಿತು. ಮೂರನೇ engine ಕೂಡ ಮತ್ತೊಮ್ಮೆ ಒಂದು geometry failure ಬದಲಿಗೆ ಇನ್ನೊಂದನ್ನು ತಂದಿತು.
MaLiang ಕಠಿಣ ಗಡಿಯನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ
MaLiang ಒಂದು closed outline ಬದಲು repeated texture stamps ಬಳಸಿ stroke ಕಟ್ಟುತ್ತದೆ. ಅದರ path generator ಪಕ್ಕಪಕ್ಕದ samples ನ midpoints ಮೂಲಕ ಹೋಗುವ quadratic Bézier segments ಬಳಸುತ್ತದೆ; line renderer ಆ path ಮೇಲೆ regular step ನಲ್ಲಿ stamps ಇಡುತ್ತದೆ. Stroke ಉದ್ದಕ್ಕೂ stamp size, rotation, color ಮತ್ತು opacity ಬದಲಾಗಬಹುದು.
Soft stamp ಗೆ ಬೇರೆ cap, join ಅಥವಾ winding rule ಇರುವುದಿಲ್ಲ. Direction ನಲ್ಲಿ ತೀಕ್ಷ್ಣ ಬದಲಾವಣೆ ಆದರೂ ಅದು overlapping marks ಗಳ ಸರಣಿಯಾಗಿಯೇ ಉಳಿಯುತ್ತದೆ. Backtracks ಖಾಲಿ polygon pocket ಮಾಡಲಾರವು; endpoint half-plane stroke ನ middle ಕತ್ತರಿಸಲಾರದು, ಏಕೆಂದರೆ model ನಲ್ಲಿ endpoint clip ಇಲ್ಲ.
ನಾವು code ಅಲ್ಲ, model ತೆಗೆದುಕೊಂಡೆವು. ಈಗಿನ HighlighterStrokeBuilder ನಾಲ್ಕು ಕೆಲಸಗಳನ್ನು ಮಾಡುತ್ತದೆ:
- Pressure
0.005ಕ್ಕಿಂತ ಕಡಿಮೆ ಇರುವ endpoint samples ಮಾತ್ರ remove ಮಾಡುತ್ತದೆ. - Midpoint quadratic Bézier segments ಬಳಸಿ positions smooth ಮಾಡುತ್ತದೆ.
- Arc length ನ ಪ್ರತಿಯೊಂದು point ಗೆ circular stamp ಒಂದನ್ನು ಇಡುತ್ತದೆ.
- Normalized pressure ಆಧರಿಸಿ stamp diameter ನಿಗದಿಪಡಿಸಿ source-over alpha ಯಿಂದ stamps composite ಮಾಡುತ್ತದೆ.
Builder 686 lines ನಿಂದ 190ಕ್ಕೆ ಇಳಿಯಿತು. Azimuth, altitude, outline construction, union masks, endpoint direction windows, cap extension ಮತ್ತು cap clipping ಎಲ್ಲವೂ highlighter path ನಿಂದ ಹೊರಬಿದ್ದವು. Input model orientation ಬೆಂಬಲಿಸುವುದರಿಂದ Pencil orientation ದಾಖಲಿಸುತ್ತೇವೆ; ಆದರೆ highlighter ಈಗ ಆ fields ಓದುವುದಿಲ್ಲ.
MaLiang pressure formula ಗೆ device calibration ಬೇಕಾಯಿತು
MaLiang stamp ಗಾತ್ರವನ್ನು ಈ formula ಗೆ ಸಮಾನವಾದ ವಿಧಾನದಿಂದ ನಿರ್ಧರಿಸುತ್ತದೆ:
force 0 ರಿಂದ 1 ರವರೆಗಿನ range ನ ಉಪಯುಕ್ತ ಭಾಗ ಬಳಸುತ್ತದೆ ಎಂಬ ಊಹೆ ಇದರಲ್ಲಿ ಇದೆ. ನಮ್ಮ device data ಹಾಗಿರಲಿಲ್ಲ. ಸುಮಾರು 3,400 Apple Pencil samples ಗಳಲ್ಲಿ median pressure 0.047, maximum 0.178 ಆಗಿತ್ತು. ಈ values ಅನ್ನು formula ಗೆ ನೇರವಾಗಿ ನೀಡಿದರೆ normal writing nominal brush size ಗಿಂತ ತುಂಬಾ ತೆಳುವಾಯಿತು.
ಆದ್ದರಿಂದ observed median ಸುತ್ತ normalize ಮಾಡಿ, exponent ಅನ್ವಯಿಸಿ result ಅನ್ನು clamp ಮಾಡಿದೆವು:
Median written pressure ಈಗ nominal 12-point diameter ಗೆ map ಆಗುತ್ತದೆ. ಬಹಳ ಸೌಮ್ಯವಾದ ಸ್ಪರ್ಶ nominal size ನ 35% ನಲ್ಲೂ ಕಾಣಿಸುತ್ತದೆ; ಭಾರವಾದ pressure 120% ದಾಟಿ ದೊಡ್ಡದಾಗುವುದಿಲ್ಲ.
ಈ calibration MaLiang ಗೆ ಸೇರಿದ್ದಲ್ಲ; ಅದು input device ಮತ್ತು brush behavior ಗೆ ಸೇರಿದೆ. ನಮ್ಮ pressure distribution ಅಳೆಯದೆ original formula ನಕಲಿಸಿದ್ದರೆ architecture ಉಳಿದರೂ brush ತಪ್ಪಾಗುತ್ತಿತ್ತು.
ತಿಳಿದಿದ್ದ overlap count ನಿಂದ per-stamp alpha ಲಭಿಸಿತು
Overlapping translucent stamps ಗೆ MaLiang empirical expression alpha ÷ overlapping × 2.5 ಮೂಲಕ compensation ಕೊಡುತ್ತದೆ. ನಮ್ಮ brush ನಲ್ಲಿ nominal diameter 12 points, stamp step 1 point ಎಂದು ನಿಗದಿಯಾಗಿದೆ; ಆದ್ದರಿಂದ centerline ಸುಮಾರು 12 layers ಪಡೆಯುತ್ತದೆ. ಇಲ್ಲಿ overlap count ಗೊತ್ತಿರುವುದರಿಂದ compensation ಅನ್ನು estimate ಮಾಡುವ ಬದಲು solve ಮಾಡಬಹುದು.
Target stroke opacity
ಹೀಗಾಗಿ ಒಂದೇ stamp ಗೆ ಬೇಕಾಗುವುದು

ದಾಖಲಿಸಿದ device paths ಅನ್ನು replay ಮಾಡುವ ಅಂತಿಮ renderer. Hooks, diagonal cuts ಮತ್ತು white pockets ಕಾಣುವುದಿಲ್ಲ.
ನಾವು ಸ್ವೀಕರಿಸಿದ ಎರಡು ವೆಚ್ಚಗಳು
Self-intersections ಹೆಚ್ಚು ಗಾಢವಾಗುತ್ತವೆ. Source-over composition ಪ್ರತಿ stamp ಅನ್ನು ಎಣಿಸುತ್ತದೆ; ಅದೇ ಪ್ರದೇಶವನ್ನು ಹಿಂದಿನ pass ನಲ್ಲಿ ದಾಟಿದಾಗ ಹಾಕಿದ stamps ಕೂಡ ಸೇರಿವೆ. Coverage-union engine ಇದನ್ನು ತಪ್ಪಿಸಿತ್ತು. ಆದರೂ ಆ darker overlap predictable ಆಗಿದ್ದು stroke shape ಅಚಲವಾಗಿರುವುದರಿಂದ ನಾವು ಸ್ವೀಕರಿಸಿದೆವು.
Pressure ಕಡಿಮೆಯಾದಂತೆ endpoints ಸಣ್ಣವಾಗುತ್ತವೆ. ನಿಜವಾದ lift-off pressure ಕಡಿಮೆ ಮಾಡುತ್ತದೆ, stamp diameter ಕೂಡ ಕಡಿಮೆಯಾಗುತ್ತದೆ; ಹೀಗಾಗಿ stroke ಪೂರ್ಣ ಅಗಲದ square cap ನಲ್ಲಿ ಕೊನೆಗೊಳ್ಳದೆ taper ಆಗುತ್ತದೆ. ಮೂರೂ geometry engines ನಲ್ಲಿ square cap ಅನ್ನು ನಾವು requirement ಎಂದು ನೋಡಿದ್ದೆವು. ಅದನ್ನು ಬಿಟ್ಟದ್ದರಿಂದ ಮೇಲಿನ ಹಲವಾರು ದೋಷಗಳಿಗೆ ಕಾರಣವಾಗಿದ್ದ clipping ಮತ್ತು endpoint machinery ತೆಗೆದುಹಾಕಲಾಯಿತು; ಆದ್ದರಿಂದ taper ಆದ ತುದಿಯನ್ನು ಒಪ್ಪಿಕೊಂಡೆವು.
ಹೀಗಾಗಿ ನಾವು ship ಮಾಡುವ model ಹಿಂದಿನವುಗಳಿಗಿಂತ ಕಡಿಮೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ. ಅದು ಅಳೆಯಲಾದ writing event ಉಳಿಸುತ್ತದೆ, device calibration ನಂತರ pressure ಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತದೆ, ಮತ್ತು globally valid outline ಬೇಡದೆ curved ಹಾಗೂ self-crossing paths ಅನ್ನು render ಮಾಡುತ್ತದೆ. Chisel-shaped nib, ಸಂಪೂರ್ಣ square cap, raw samples ಗಳ ನಡುವಿನ exact polyline—ಇವುಗಳನ್ನೇ ನಾವು ಅದರ ಬದಲಿಗೆ ತ್ಯಜಿಸಿದ್ದೇವೆ.
Pressure floor ಅನ್ನು ಬೇರೆ projects ಗೆ ಅತ್ಯಂತ ನೇರವಾಗಿ ಅನ್ವಯಿಸಬಹುದು. 0.005 ಎಂಬ value ನೈಜ input ನ ಎರಡು clusters ನಡುವಿನ gap ನಿಂದ ಬಂದಿದೆ: 0.01 ಮತ್ತು ಮೇಲಿನ writing, 0.002 ಮತ್ತು ಕೆಳಗಿನ airborne tracking. ಅದೇ recorded strokes ಪ್ರತಿಯೊಂದು geometry repair ಎಲ್ಲಿ ವಿಫಲವಾಯಿತು ಎಂಬುದನ್ನು ತೋರಿಸಿದವು. ಆ ವೈಫಲ್ಯಗಳೇ stamp model ಮತ್ತು ಅದರ ಎರಡು ವೆಚ್ಚಗಳತ್ತ ನಮ್ಮನ್ನು ಕರೆದೊಯ್ದವು.