ਅਸੀਂ ਤਿੰਨ ਹਾਈਲਾਈਟਰ ਜਿਓਮੈਟਰੀ ਇੰਜਨਾਂ ਨੂੰ ਸਟੈਂਪਾਂ ਨਾਲ ਕਿਉਂ ਬਦਲਿਆ
ਅਸਲ Apple Pencil ਡੇਟਾ ਨੇ ਸਿੰਥੈਟਿਕ ਟੈਸਟਾਂ ਤੋਂ ਲੁਕੀਆਂ ਖਾਮੀਆਂ ਦਿਖਾਈਆਂ ਅਤੇ Lulucat Notes ਨੂੰ ਤਿੰਨ ਆਉਟਲਾਈਨ ਇੰਜਨਾਂ ਤੋਂ MaLiang ਸਟੈਂਪ ਮਾਡਲ ਤੱਕ ਲੈ ਗਿਆ।
Lulucat Notes ਦੀ ਸ਼ੁਰੂਆਤ ਇੱਕ ਰਵਾਇਤੀ ਹਾਈਲਾਈਟਰ ਰੈਂਡਰਰ ਨਾਲ ਹੋਈ: ਸੈਂਪਲ ਕੀਤੇ ਪਾਥ ਦੇ ਆਲੇ-ਦੁਆਲੇ ਜਿਓਮੈਟ੍ਰਿਕ ਆਉਟਲਾਈਨ ਬਣਾਓ, ਫਿਰ ਉਸ ਆਉਟਲਾਈਨ ਨੂੰ ਇੱਕ ਵਾਰ ਅਰਧ-ਪਾਰਦਰਸ਼ੀ ਰੰਗ ਨਾਲ ਭਰੋ। ਇੱਕੋ ਭਰਾਈ ਰੱਖਣ ਨਾਲ ਉਹ ਗੂੜ੍ਹੀਆਂ ਪੱਟੀਆਂ ਨਹੀਂ ਬਣਦੀਆਂ ਜੋ ਅਰਧ-ਪਾਰਦਰਸ਼ੀ ਸੈਗਮੈਂਟਾਂ ਦੇ ਓਵਰਲੈਪ ਹੋਣ ਵਾਲੀ ਥਾਂ ਉੱਤੇ ਦਿਖਦੀਆਂ ਹਨ। ਇਸ ਨਾਲ ਹਰ ਜੋੜ, ਸਵੈ-ਛੇਦ, ਕੈਪ ਅਤੇ ਛੋਟਾ ਸਟ੍ਰੋਕ ਇੱਕੋ ਜਿਓਮੈਟਰੀ ਸਮੱਸਿਆ ਦੇ ਅੰਦਰ ਆ ਜਾਂਦਾ ਹੈ।
ਕਸਟਮ ਜਿਓਮੈਟਰੀ ਦੀਆਂ ਤਿੰਨ ਪੀੜ੍ਹੀਆਂ ਨੇ ਹਰ ਇੱਕ ਖਾਮੀ ਦੀ ਇੱਕ ਸ਼੍ਰੇਣੀ ਹਟਾਈ ਤੇ ਦੂਜੀ ਸਾਹਮਣੇ ਲਿਆਈ। ਹੁਣ ਅਸੀਂ MaLiang ਉੱਤੇ ਆਧਾਰਿਤ ਨਰਮ ਗੋਲ ਸਟੈਂਪ ਵਰਤਦੇ ਹਾਂ, ਜੋ Harley-xk ਵੱਲੋਂ ਬਣਾਇਆ ਗਿਆ MIT-ਲਾਇਸੰਸਸ਼ੁਦਾ ਓਪਨ-ਸੋਰਸ ਡਰਾਇੰਗ ਫਰੇਮਵਰਕ ਹੈ। ਆਉਟਲਾਈਨ ਦੀਆਂ ਨਾਕਾਮੀਆਂ ਦੀ ਪੂਰੀ ਸ਼੍ਰੇਣੀ ਹਟਾਉਣ ਦੇ ਬਦਲੇ ਅਸੀਂ ਗੂੜ੍ਹੇ ਸਵੈ-ਛੇਦ ਅਤੇ ਦਬਾਅ ਨਾਲ ਪਤਲੇ ਹੁੰਦੇ ਸਿਰੇ ਸਵੀਕਾਰ ਕੀਤੇ।

228% zoom ਉੱਤੇ ਮੂਲ ਡਿਵਾਈਸ ਸਕ੍ਰੀਨਸ਼ਾਟ। ਕਈ ਸਟ੍ਰੋਕਾਂ ਦੇ ਦੋਵੇਂ ਸਿਰਿਆਂ ਉੱਤੇ ਛੋਟੇ ਹੁੱਕ ਦਿਖਦੇ ਹਨ।
ਅਸਲ ਹੱਥ-ਲਿਖਤ ਨੇ ਉਹ ਹੁੱਕ ਬਣਾਏ ਜੋ ਸਿੰਥੈਟਿਕ ਦ੍ਰਿਸ਼ਾਂ ਵਿੱਚ ਨਹੀਂ ਬਣੇ
ਸਾਡੇ ਸਿੰਥੈਟਿਕ ਦ੍ਰਿਸ਼ਾਂ ਵਿੱਚ ਸਿੱਧੀਆਂ ਲਾਈਨਾਂ, ਆਰਕ, ਛੋਟੀਆਂ ਟੈਪਾਂ, ਪਿੱਛੇ ਮੁੜਦੇ ਪਾਥ, ਦਬਾਅ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਅਤੇ ਤਿੱਖੇ ਮੋੜ ਸ਼ਾਮਲ ਸਨ, ਅਤੇ ਸਾਰੇ ਸਾਫ਼ ਰੈਂਡਰ ਹੋਏ। ਅਸਲ ਚੀਨੀ ਹੱਥ-ਲਿਖਤ ਨੇ ਫਿਰ ਵੀ ਕਈ ਸਟ੍ਰੋਕਾਂ ਦੀ ਸ਼ੁਰੂਆਤ ਅਤੇ ਅੰਤ ਉੱਤੇ ਲਗਭਗ 1–3 ਪੌਇੰਟ ਲੰਬੇ ਹੁੱਕ ਬਣਾਏ।
ਇਸ ਲਈ ਅਸੀਂ ਐਪ ਵਿੱਚ ਇੱਕ ਸੇਵ ਬਟਨ ਜੋੜਿਆ ਅਤੇ 29 ਪੂਰੇ ਸਟ੍ਰੋਕ ਦਰਜ ਕੀਤੇ। ਹਰ ਨਮੂਨੇ ਦੀ ਸਥਿਤੀ, ਤ੍ਰਿਜਿਆ, ਦਬਾਅ, ਅਜ਼ਿਮੁਥ, ਐਲਟੀਟਿਊਡ, ਟਾਈਮਸਟੈਂਪ ਅਤੇ UIKit ਦੇ ਅਨੁਮਾਨ ਫਲੈਗ ਸੰਭਾਲੇ ਗਏ। ਇੱਕ ਆਫ਼ਲਾਈਨ ਪ੍ਰੋਗਰਾਮ ਨੇ ਉਸ JSON ਨੂੰ ਡੀਕੋਡ ਕੀਤਾ ਅਤੇ ਉਹੀ Stroke.swift, StrokeRenderer.swift ਅਤੇ HighlighterStrokeBuilder.swift ਫ਼ਾਈਲਾਂ ਕੰਪਾਇਲ ਕੀਤੀਆਂ ਜੋ ਐਪ ਵਰਤਦੀ ਹੈ। ਇਸ ਦਾ ਆਉਟਪੁੱਟ ਸਟ੍ਰੋਕ-ਦਰ-ਸਟ੍ਰੋਕ ਡਿਵਾਈਸ ਸਕ੍ਰੀਨਸ਼ਾਟ ਨਾਲ ਮਿਲਿਆ, ਹੁੱਕਾਂ ਸਮੇਤ।
ਕਿਉਂਕਿ ਆਫ਼ਲਾਈਨ ਰੈਂਡਰਰ ਨੇ ਸਿਰਫ਼ ਦਰਜ ਕੀਤੇ ਇਨਪੁੱਟ ਤੋਂ ਖਾਮੀ ਦੁਬਾਰਾ ਬਣਾਈ, ਇਸ ਦਾ ਕਾਰਨ ਡਿਸਪਲੇ ਦੇ ਵਿਹਾਰ ਦੀ ਬਜਾਏ ਨਮੂਨਿਆਂ ਅਤੇ ਜਿਓਮੈਟਰੀ ਵਿੱਚ ਸੀ। ਹੁਣ ਅਸੀਂ ਉਹ ਸਹੀ ਨਮੂਨੇ ਪੜ੍ਹ ਸਕਦੇ ਸਾਂ ਜੋ ਰੈਂਡਰਰ ਵਿੱਚ ਦਾਖ਼ਲ ਹੋਏ ਸਨ।
ਸਾਡੀ ਪਹਿਲੀ ਧਾਰਨਾ ਨੇ ਟਚਡਾਊਨ ਅਤੇ ਲਿਫ਼ਟ-ਆਫ਼ ਵੇਲੇ ਅਨੁਮਾਨਿਤ Pencil orientation ਨੂੰ ਦੋਸ਼ ਦਿੱਤਾ। ਡੇਟਾ ਨੇ ਇਸ ਨੂੰ ਰੱਦ ਕਰ ਦਿੱਤਾ। ਸਾਰੇ 29 ਸਟ੍ਰੋਕਾਂ ਵਿੱਚ ਪਹਿਲੇ ਅਤੇ ਆਖ਼ਰੀ ਅੱਠ ਨਮੂਨਿਆਂ ਦੌਰਾਨ ਅਜ਼ਿਮੁਥ ਵੱਧ ਤੋਂ ਵੱਧ 0.09 radians ਅਤੇ ਐਲਟੀਟਿਊਡ ਵੱਧ ਤੋਂ ਵੱਧ 0.02 radians ਬਦਲੇ, ਅਤੇ ਉਸ iPad ਉੱਤੇ ਹਰ estimation flag false ਸੀ। Orientation ਸਥਿਰ ਰਹੀ, ਜਦਕਿ ਦਬਾਅ ਅਤੇ ਦਿਸ਼ਾ ਤੇਜ਼ੀ ਨਾਲ ਬਦਲੇ।
ਦਬਾਅ ਦੀ ਹੇਠਲੀ ਹੱਦ ਡੇਟਾ ਵਿੱਚਲੀ ਸਾਫ਼ ਖਾਲੀ ਥਾਂ ਤੋਂ ਮਿਲੀ
ਦਰਜ ਕੀਤੇ ਹਰ ਸਟ੍ਰੋਕ ਦੇ ਆਖ਼ਰੀ ਨਮੂਨੇ ਵਿੱਚ ਦਬਾਅ 0.000 ਸੀ। ਲਿਖਦੇ ਸਮੇਂ ਦੇ ਨਮੂਨੇ 0.01 ਜਾਂ ਇਸ ਤੋਂ ਉੱਪਰ ਸਨ, ਜਦਕਿ Pencil ਦੇ ਸਤ੍ਹਾ ਛੱਡਣ ਤੋਂ ਬਾਅਦ ਦਰਜ ਨਮੂਨੇ 0.002 ਜਾਂ ਇਸ ਤੋਂ ਹੇਠਾਂ ਸਨ। ਉਹ ਹਵਾ ਵਿੱਚਲੇ ਨਮੂਨੇ ਅਕਸਰ 2–7 ਪੌਇੰਟ ਤੱਕ ਜਾਰੀ ਰਹੇ ਅਤੇ 0.8–9.0 ਪੌਇੰਟ ਤੱਕ ਚਲੇ, ਅਤੇ ਉਨ੍ਹਾਂ ਦੀ ਦਿਸ਼ਾ ਲਿਖੇ ਹੋਏ ਸਟ੍ਰੋਕ ਤੋਂ ਲਗਭਗ 90 degrees ਦੂਰ ਮੁੜ ਸਕਦੀ ਸੀ।
ਸਟ੍ਰੋਕ 2 ਇਹ ਤਰੀਕਾ ਦਿਖਾਉਂਦਾ ਹੈ। ਇਸ ਦਾ ਮੁੱਖ ਹਿੱਸਾ 143 ਅਤੇ 180 degrees ਦੇ ਵਿਚਕਾਰ ਖ਼ਤਮ ਹੋਇਆ। ਫਿਰ ਘੱਟ-ਦਬਾਅ ਵਾਲੀ ਪੂਛ −90 ਤੋਂ −67 degrees ਵੱਲ ਮੁੜੀ ਅਤੇ ਹੋਰ 8.5 ਪੌਇੰਟ ਚੱਲੀ। ਆਉਟਲਾਈਨ ਰੈਂਡਰਰ ਨੇ ਆਖ਼ਰੀ ਹਵਾ ਵਿੱਚਲੇ ਨਮੂਨੇ ਨੂੰ ਅਧਿਕਾਰਤ endpoint ਮੰਨਿਆ, ਇਸ ਲਈ ਉਸ ਨੇ ਉਸ ਬਿੰਦੂ ਵੱਲ ਜਿਓਮੈਟਰੀ ਦਾ ਇੱਕ ਤੰਗ ਟੁਕੜਾ ਖਿੱਚ ਦਿੱਤਾ।
ਦਬਾਅ ਦੇ ਮਾਪਾਂ ਵਿੱਚ ਲਿਖਣ ਅਤੇ ਹਵਾ ਵਿੱਚਲੀ ਗਤੀ ਵਿਚਕਾਰ ਲਗਭਗ ਇੱਕ order of magnitude ਦੀ ਦੂਰੀ ਹੈ, ਇਸ ਲਈ ਅਸੀਂ cutoff ਉਸ ਖਾਲੀ ਥਾਂ ਦੇ ਅੰਦਰ ਰੱਖਿਆ:
private static let pressureFloor: CGFloat = 0.005
ਸਿਰਫ਼ ਦੋਵੇਂ ਸਿਰਿਆਂ ਉੱਤੇ ਮੌਜੂਦ ਘੱਟ-ਦਬਾਅ ਵਾਲੇ ਨਮੂਨੇ ਹਟਾਏ ਜਾਂਦੇ ਹਨ। ਸਟ੍ਰੋਕ ਦੇ ਵਿਚਕਾਰਲਾ ਘੱਟ-ਦਬਾਅ ਵਾਲਾ ਨਮੂਨਾ ਉਸ ਦਾ ਹਿੱਸਾ ਬਣਿਆ ਰਹਿੰਦਾ ਹੈ। ਇਹ ਨਿਯਮ ਮਾਪੀ ਗਈ event boundary ਦੀ ਪਾਲਣਾ ਕਰਦਾ ਹੈ ਅਤੇ ਲਿਖੇ ਹੋਏ ਪਾਥ ਨੂੰ ਬਿਨਾਂ ਸੋਧੇ ਛੱਡਦਾ ਹੈ।

ਟ੍ਰਿਮ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਰੈਂਡਰਰ ਕੈਪ ਨੂੰ ਹਵਾ ਵਿੱਚਲੇ ਨਮੂਨਿਆਂ ਨਾਲ anchor ਕਰਦਾ ਹੈ। ਹਰੇ ਬਿੰਦੂ raw samples ਹਨ; ਲਾਲ ਲਾਈਨ ਬਣਾਈ ਗਈ ਆਉਟਲਾਈਨ ਹੈ।

0.005 ਤੋਂ ਹੇਠਾਂ ਵਾਲੇ ਨਮੂਨੇ ਟ੍ਰਿਮ ਕਰਨ ਤੋਂ ਬਾਅਦ ਕੈਪ ਆਖ਼ਰੀ ਲਿਖੇ ਬਿੰਦੂ ਉੱਤੇ ਖ਼ਤਮ ਹੁੰਦੀ ਹੈ। ਇਹ pressure floor ਮੌਜੂਦਾ stamp renderer ਵਿੱਚ ਵੀ ਕਾਇਮ ਹੈ।
ਇਸ ਹੱਦ ਨੇ ਲੰਮੇ ਹਵਾ ਵਿੱਚਲੇ ਹੁੱਕ ਹਟਾ ਦਿੱਤੇ। ਜਿਨ੍ਹਾਂ ਛੋਟੀਆਂ ਟਚਡਾਊਨ ਡ੍ਰੈਗਾਂ ਅਤੇ ਲਿਫ਼ਟ-ਆਫ਼ ਆਰਕਾਂ ਦਾ ਦਬਾਅ 0.005 ਤੋਂ ਉੱਪਰ ਰਿਹਾ, ਉਹ ਬਚ ਗਈਆਂ, ਕਿਉਂਕਿ ਉਹ ਲਿਖੀ ਹੋਈ ਗਤੀ ਹਨ। ਉਨ੍ਹਾਂ ਗਤੀਆਂ ਨੂੰ ਆਉਟਲਾਈਨ ਮਾਡਲ ਦੇ ਅੰਦਰ ਸੰਭਾਲਣ ਨਾਲ ਜਿਓਮੈਟਰੀ ਦੇ ਅਗਲੇ ਦੌਰ ਆਏ।
ਤਿੰਨ ਜਿਓਮੈਟਰੀ ਇੰਜਨਾਂ ਨੇ ਖਾਮੀਆਂ ਨੂੰ ਸਿਰਫ਼ ਇੱਧਰ-ਉੱਧਰ ਕੀਤਾ
ਪੀੜ੍ਹੀ ਇੱਕ: ਇੱਕ ਆਉਟਲਾਈਨ, ਇੱਕ ਭਰਾਈ
ਪਹਿਲੇ pressure-sensitive ਇੰਜਨ ਨੇ ਇੱਕ ਜਾਣ-ਪਛਾਣ ਵਾਲੀ ਪਾਈਪਲਾਈਨ ਅਪਣਾਈ। ਇਸ ਨੇ ਇੱਕ spine ਨੂੰ smooth ਕੀਤਾ, ਖੱਬੇ ਅਤੇ ਸੱਜੇ offsets ਕੱਢੇ, ਉਨ੍ਹਾਂ ਨੂੰ ਇੱਕ polygon ਵਿੱਚ ਜੋੜਿਆ ਅਤੇ ਉਸ polygon ਨੂੰ ਇੱਕ ਵਾਰ ਭਰਿਆ। ਨਿਬ Apple Pencil ਦੇ ਅਜ਼ਿਮੁਥ ਅਤੇ ਐਲਟੀਟਿਊਡ ਨਾਲ ਚੱਲਣ ਵਾਲਾ ਇੱਕ ellipse ਸੀ, ਇਸ ਲਈ ਲਿਖਣ ਦੀ ਦਿਸ਼ਾ ਨਾਲ ਇਸ ਦਾ cross-section ਬਦਲਦਾ ਸੀ। ਛੋਟੀਆਂ ਟੈਪਾਂ ਲਈ ਵੱਖਰਾ ਆਕਾਰ ਸੀ, ਅਤੇ flat caps ਵਿੱਚ zero-winding pockets ਤੋਂ ਬਚਣ ਲਈ ਛੋਟੀਆਂ asymmetries ਵਰਤੀਆਂ ਜਾਂਦੀਆਂ ਸਨ।
ਇੱਕੋ ਭਰਾਈ ਨੇ ਸਟ੍ਰੋਕ ਦੇ ਅੰਦਰ opacity accumulation ਦੀ ਸਮੱਸਿਆ ਹੱਲ ਕੀਤੀ, ਅਤੇ ਇਸ ਲਈ ਹਰ ਮੋੜ ਉੱਤੇ ਇੱਕ valid polygon ਲੋੜੀਂਦਾ ਸੀ। ਟਚਡਾਊਨ ਡ੍ਰੈਗਾਂ ਨੇ ਕੈਪ ਅਤੇ body ਵਿਚਕਾਰ wedges ਬਣਾਏ। ਪਿੱਛੇ ਮੁੜਨ ਨਾਲ ਚਿੱਟੇ crescent pockets ਬਣ ਸਕਦੇ ਸਨ। ਤਿੱਖੇ ਮੋੜ inner outline ਨੂੰ self-intersect ਕਰਵਾ ਸਕਦੇ ਸਨ ਅਤੇ unfilled notch ਛੱਡ ਸਕਦੇ ਸਨ।
ਪੀੜ੍ਹੀ ਦੋ: ਸਿਰਿਆਂ ਕੋਲ ਆਉਟਲਾਈਨ ਦੀ ਮੁਰੰਮਤ
ਦੂਜੇ ਇੰਜਨ ਨੇ ਆਉਟਲਾਈਨ ਰੱਖੀ ਅਤੇ ਸਥਾਨਕ ਮੁਰੰਮਤਾਂ ਜੋੜੀਆਂ: backtrack trimming, ਸ਼ੁਰੂਆਤੀ estimated properties ਲਈ damping, endpoint straightening, transient-direction trimming ਅਤੇ ਇੱਕ ਛੋਟਾ cap extension। ਹਰ patch ਨੇ ਦੁਬਾਰਾ ਬਣਾਈ ਗਈ ਇੱਕ ਖਾਮੀ ਨੂੰ ਨਿਸ਼ਾਨਾ ਬਣਾਇਆ। ਇਕੱਠੇ ਹੋ ਕੇ ਉਨ੍ਹਾਂ ਨੇ endpoint ਦੇ ਵਿਹਾਰ ਨੂੰ ਕਈ thresholds ਅਤੇ windows ਉੱਤੇ ਨਿਰਭਰ ਕਰ ਦਿੱਤਾ।
ਅਸਲ ਲਿਖਤ ਨੇ ਫਿਰ ਅਜਿਹੇ ਮਾਮਲੇ ਪੈਦਾ ਕੀਤੇ ਜੋ ਇਨ੍ਹਾਂ windows ਤੋਂ ਬਾਹਰ ਸਨ। ਇੱਕ ਨਿਸ਼ਚਿਤ 24-point straightening window ਨੇ ਛੋਟੇ ਸਟ੍ਰੋਕਾਂ ਵਿੱਚ ਜਾਣ-ਬੁੱਝ ਕੇ ਬਣਾਏ ਹੁੱਕ ਮਿਟਾ ਦਿੱਤੇ। ਇੱਕ adaptive window ਨੇ ਉਹ ਹੁੱਕ ਬਚਾ ਲਏ, ਪਰ lift-off arcs ਫਿਰ ਵੀ ਦਿਖਾਈ ਦੇਣ ਵਾਲੇ corners ਬਣ ਸਕਦੇ ਸਨ। Direction-aware trimming ਨੇ ਹੋਰ transient motion ਹਟਾ ਦਿੱਤੀ, ਜਿਸ ਦੀ ਕੀਮਤ ਇੱਕ ਦਰਜ ਕੀਤੇ ਸਟ੍ਰੋਕ ਦੀ ਸੱਚਮੁੱਚ ਮੁੜੀ ਹੋਈ ਸ਼ੁਰੂਆਤ ਵਿੱਚੋਂ ਲਗਭਗ 2.5 ਪੌਇੰਟ ਮਿਟਾਉਣਾ ਸੀ।
ਹਰ patch ਨੇ ਆਪਣੇ ਨਿਸ਼ਾਨੇ ਵਾਲੇ ਮਾਮਲੇ ਨੂੰ ਠੀਕ ਕੀਤਾ। ਪਰ ਉਨ੍ਹਾਂ ਦੇ ਹੇਠਾਂਲਾ ਮਾਡਲ ਹਾਲੇ ਵੀ ਇੱਕ ਅਜਿਹੀ ਕਠੋਰ ਆਉਟਲਾਈਨ ਮੰਗਦਾ ਸੀ ਜੋ ਸ਼ੋਰ ਵਾਲੇ, ਮੁੜੇ ਹੋਏ ਇਨਪੁੱਟ ਹੇਠ valid ਰਹੇ।
ਪੀੜ੍ਹੀ ਤਿੰਨ: clipped square caps ਨਾਲ coverage union
ਤੀਜੇ ਇੰਜਨ ਨੇ ਇੱਕ single contour ਬਣਾਉਣਾ ਬੰਦ ਕਰ ਦਿੱਤਾ। ਇਸ ਨੇ ਹਰ segment ਲਈ ਇੱਕ trapezoid ਅਤੇ ਹਰ ਅੰਦਰਲੇ ਨਮੂਨੇ ਉੱਤੇ ਇੱਕ disc grayscale mask ਵਿੱਚ ਬਣਾਇਆ, ਉਨ੍ਹਾਂ ਦਾ coverage union ਲਿਆ, ਫਿਰ ਹਾਈਲਾਈਟਰ ਰੰਗ ਇੱਕ ਵਾਰ ਲਗਾਇਆ। Backtrack crescents, self-intersection darkening ਅਤੇ zero-winding holes ਗਾਇਬ ਹੋ ਗਏ, ਕਿਉਂਕਿ ਰੈਂਡਰਰ ਹੁਣ polygon winding ਉੱਤੇ ਨਿਰਭਰ ਨਹੀਂ ਸੀ।
Union ਨੇ ਸਿਰਿਆਂ ਨੂੰ ਗੋਲ ਕਰ ਦਿੱਤਾ, ਇਸ ਲਈ ਅਸੀਂ coverage ਨੂੰ ਦੋ endpoint half-planes ਦੇ ਵਿਰੁੱਧ clip ਕਰਕੇ square caps ਵਾਪਸ ਲਿਆਂਦੀਆਂ। ਇਸ clip ਨੇ constant-pressure ਵਾਲੀਆਂ ਸਿੱਧੀਆਂ ਲਾਈਨਾਂ ਠੀਕ ਕੀਤੀਆਂ ਅਤੇ ਇੱਕ ਹੋਰ ਗੰਭੀਰ ਖਾਮੀ ਪੈਦਾ ਕੀਤੀ: ਮੁੜੇ ਹੋਏ ਸਟ੍ਰੋਕ ਦਾ body ਜਾਇਜ਼ ਤੌਰ ਉੱਤੇ endpoint half-plane ਨੂੰ ਪਾਰ ਕਰ ਸਕਦਾ ਹੈ, ਅਤੇ cap clip ਫਿਰ ਸਟ੍ਰੋਕ ਦੇ ਵਿਚਕਾਰਲੇ ਹਿੱਸੇ ਦਾ ਕੁਝ ਭਾਗ ਹਟਾ ਦਿੰਦੀ ਹੈ। Live input ਦੌਰਾਨ endpoint ਦੀ ਦਿਸ਼ਾ ਬਦਲਦੀ ਰਹੀ, ਇਸ ਲਈ clipped ਖੇਤਰ ਹਿਲਦਾ ਰਿਹਾ ਅਤੇ ਸਟ੍ਰੋਕ flicker ਕਰਦਾ ਰਿਹਾ।

Global cap constraint ਮੁੜੇ ਹੋਏ ਸਟ੍ਰੋਕ ਦੇ body ਵਿੱਚੋਂ ਕੱਟ ਜਾਂਦੀ ਹੈ।

Cap clipping ਨੂੰ endpoint ਦੀ ਇੱਕ half-width ਦੇ ਅੰਦਰਲੇ primitives ਤੱਕ ਸੀਮਿਤ ਕਰਨ ਨਾਲ ਇਹ ਸਟ੍ਰੋਕ ਠੀਕ ਹੋ ਜਾਂਦਾ ਹੈ।
ਇੱਕ arc-length gate ਨੇ cap clipping ਨੂੰ local ਬਣਾ ਦਿੱਤਾ ਅਤੇ ਦਰਜ ਕੀਤੇ ਹਰ ਮਾਮਲੇ ਨੂੰ ਠੀਕ ਕਰ ਦਿੱਤਾ। ਇੱਕ extreme synthetic hook ਨੇ ਫਿਰ ਵੀ ਇੱਕ ਛੋਟਾ ਚਿੱਟਾ notch ਦਿਖਾਇਆ, ਜਿੱਥੇ low-pressure tip clipped cap ਨਾਲ ਮਿਲਦੀ ਸੀ। ਤੀਜੇ ਇੰਜਨ ਨੇ ਫਿਰ ਇੱਕ ਜਿਓਮੈਟਰੀ ਖਾਮੀ ਨੂੰ ਦੂਜੀ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਸੀ।
MaLiang ਨੇ ਕਠੋਰ ਹੱਦ ਹਟਾ ਦਿੱਤੀ
MaLiang ਇੱਕ ਬੰਦ ਆਉਟਲਾਈਨ ਦੀ ਬਜਾਏ ਵਾਰ-ਵਾਰ ਲਗਾਏ texture stamps ਨਾਲ ਸਟ੍ਰੋਕ ਬਣਾਉਂਦਾ ਹੈ। ਇਸ ਦਾ path generator quadratic Bézier segments ਵਰਤਦਾ ਹੈ ਜੋ ਨਾਲ ਲੱਗਦੇ sample midpoints ਵਿੱਚੋਂ ਲੰਘਦੇ ਹਨ, ਅਤੇ ਇਸ ਦਾ line renderer ਉਸ ਪਾਥ ਉੱਤੇ ਨਿਯਮਤ ਕਦਮ ਨਾਲ stamps ਰੱਖਦਾ ਹੈ। Stamp ਦਾ ਆਕਾਰ, rotation, ਰੰਗ ਅਤੇ opacity ਸਾਰੇ ਸਟ੍ਰੋਕ ਦੇ ਨਾਲ-ਨਾਲ ਬਦਲ ਸਕਦੇ ਹਨ।
ਇੱਕ soft stamp ਵਿੱਚ ਕੋਈ ਵੱਖਰੀ cap, join ਜਾਂ winding rule ਨਹੀਂ ਹੁੰਦੀ। ਦਿਸ਼ਾ ਵਿੱਚ ਤਿੱਖੀ ਤਬਦੀਲੀ overlapping marks ਦੀ ਇੱਕ ਲੜੀ ਬਣੀ ਰਹਿੰਦੀ ਹੈ। Backtracks ਕੋਈ ਖਾਲੀ polygon pocket ਨਹੀਂ ਬਣਾ ਸਕਦੇ, ਅਤੇ endpoint half-plane ਸਟ੍ਰੋਕ ਦੇ ਵਿਚਕਾਰਲੇ ਹਿੱਸੇ ਨੂੰ ਨਹੀਂ ਕੱਟ ਸਕਦੀ, ਕਿਉਂਕਿ ਮਾਡਲ ਵਿੱਚ ਕੋਈ endpoint clip ਹੈ ਹੀ ਨਹੀਂ।
ਅਸੀਂ code ਦੀ ਬਜਾਏ ਮਾਡਲ ਅਪਣਾਇਆ। ਮੌਜੂਦਾ HighlighterStrokeBuilder ਚਾਰ ਕੰਮ ਕਰਦਾ ਹੈ:
- ਸਿਰਫ਼ ਉਹ endpoint samples ਹਟਾਓ ਜਿਨ੍ਹਾਂ ਦਾ pressure
0.005ਤੋਂ ਘੱਟ ਹੈ। - Midpoint quadratic Bézier segments ਨਾਲ positions ਨੂੰ smooth ਕਰੋ।
- Arc length ਦੇ ਹਰ point ਉੱਤੇ ਇੱਕ circular stamp ਰੱਖੋ।
- Normalized pressure ਤੋਂ stamp diameter ਤੈਅ ਕਰੋ ਅਤੇ stamps ਨੂੰ source-over alpha ਨਾਲ composite ਕਰੋ।
Builder 686 lines ਤੋਂ ਘਟ ਕੇ 190 ਰਹਿ ਗਿਆ। ਅਜ਼ਿਮੁਥ, ਐਲਟੀਟਿਊਡ, outline construction, union masks, endpoint direction windows, cap extension ਅਤੇ cap clipping ਸਾਰੇ ਹਾਈਲਾਈਟਰ ਪਾਥ ਤੋਂ ਹਟ ਗਏ। ਅਸੀਂ ਹਾਲੇ ਵੀ Pencil orientation ਦਰਜ ਕਰਦੇ ਹਾਂ, ਕਿਉਂਕਿ input model ਇਸ ਨੂੰ ਸਮਰਥਨ ਦਿੰਦਾ ਹੈ, ਪਰ ਹਾਈਲਾਈਟਰ ਖੁਦ ਹੁਣ ਉਨ੍ਹਾਂ fields ਨੂੰ ਨਹੀਂ ਪੜ੍ਹਦਾ।
MaLiang ਦੇ pressure formula ਲਈ device calibration ਲੋੜੀਂਦੀ ਸੀ
MaLiang ਇੱਕ ਅਜਿਹੇ formula ਨਾਲ stamp ਦਾ ਆਕਾਰ ਤੈਅ ਕਰਦਾ ਹੈ ਜੋ ਇਸ ਦੇ ਬਰਾਬਰ ਹੈ
ਇਹ ਮੰਨਦਾ ਹੈ ਕਿ force 0 ਤੋਂ 1 ਤੱਕ ਦੀ ਰੇਂਜ ਦਾ ਇੱਕ ਲਾਭਦਾਇਕ ਹਿੱਸਾ ਵਰਤਦਾ ਹੈ। ਸਾਡੇ device data ਨੇ ਅਜਿਹਾ ਨਹੀਂ ਦਿਖਾਇਆ। ਲਗਭਗ 3,400 Apple Pencil samples ਵਿੱਚ median pressure 0.047 ਅਤੇ maximum 0.178 ਸੀ। ਉਨ੍ਹਾਂ ਮੁੱਲਾਂ ਨੂੰ formula ਵਿੱਚ ਸਿੱਧਾ ਪਾਉਣ ਨਾਲ ਆਮ ਲਿਖਤ nominal brush size ਨਾਲੋਂ ਕਾਫ਼ੀ ਪਤਲੀ ਹੋ ਗਈ।
ਇਸ ਲਈ ਅਸੀਂ observed median ਦੇ ਆਲੇ-ਦੁਆਲੇ normalize ਕਰਦੇ ਹਾਂ, ਫਿਰ exponent ਲਗਾ ਕੇ ਨਤੀਜੇ ਨੂੰ clamp ਕਰਦੇ ਹਾਂ:
ਹੁਣ median written pressure nominal 12-point diameter ਵਿੱਚ ਬਦਲਦਾ ਹੈ। ਬਹੁਤ ਹਲਕਾ ਸੰਪਰਕ nominal size ਦੇ 35% ਉੱਤੇ ਦਿਖਾਈ ਦਿੰਦਾ ਰਹਿੰਦਾ ਹੈ, ਜਦਕਿ ਭਾਰੀ ਦਬਾਅ 120% ਉੱਤੇ ਵਧਣਾ ਰੋਕ ਦਿੰਦਾ ਹੈ।
ਇਹ calibration input device ਅਤੇ brush behavior ਨਾਲ ਸਬੰਧਤ ਹੈ, MaLiang ਨਾਲ ਨਹੀਂ। ਆਪਣੀ pressure distribution ਨੂੰ ਮਾਪੇ ਬਿਨਾਂ ਮੂਲ formula ਦੀ ਨਕਲ ਕਰਨਾ architecture ਨੂੰ ਤਾਂ ਕਾਇਮ ਰੱਖਦਾ, ਪਰ ਗਲਤ brush ਪੈਦਾ ਕਰਦਾ।
ਜਾਣੀ overlap count ਤੋਂ per-stamp alpha ਮਿਲੀ
MaLiang overlapping translucent stamps ਲਈ empirical expression alpha ÷ overlapping × 2.5 ਨਾਲ ਮੁਆਵਜ਼ਾ ਕਰਦਾ ਹੈ। ਸਾਡੇ brush ਦਾ fixed 12-point nominal diameter ਅਤੇ 1-point stamp step ਹੈ, ਇਸ ਲਈ ਇਸ ਦੀ centerline ਨੂੰ ਲਗਭਗ 12 layers ਮਿਲਦੀਆਂ ਹਨ। ਸਾਡੇ ਮਾਮਲੇ ਵਿੱਚ overlap count ਪਤਾ ਹੈ, ਇਸ ਲਈ ਮੁਆਵਜ਼ਾ ਅਨੁਮਾਨ ਲਗਾਉਣ ਦੀ ਬਜਾਏ ਹੱਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।
ਕਿਸੇ target stroke opacity
ਇਸ ਲਈ ਇੱਕ stamp ਲਈ ਲੋੜ ਹੈ
0.0353 ਦੀ opacity ਵਰਤਦਾ ਹੈ। ਵਾਰ-ਵਾਰ composition ਤੋਂ ਬਾਅਦ center ਇੱਛਿਤ ਰੰਗ ਤੱਕ ਪਹੁੰਚਦਾ ਹੈ, ਜਦਕਿ ਕਿਨਾਰੇ ਨੂੰ ਘੱਟ stamps ਮਿਲਦੇ ਹਨ ਅਤੇ ਇੱਕ ਜਾਂ ਦੋ-ਪੌਇੰਟ ਦੀ feathered transition ਬਣੀ ਰਹਿੰਦੀ ਹੈ।

ਅੰਤਿਮ ਰੈਂਡਰਰ ਦਰਜ ਕੀਤੇ device paths ਨੂੰ ਦੁਬਾਰਾ ਚਲਾ ਰਿਹਾ ਹੈ। Hooks, diagonal cuts ਅਤੇ white pockets ਗਾਇਬ ਹਨ।
ਉਹ ਦੋ ਕੀਮਤਾਂ ਜੋ ਅਸੀਂ ਸਵੀਕਾਰ ਕੀਤੀਆਂ
Self-intersections ਹੋਰ ਗੂੜ੍ਹੇ ਹੋ ਜਾਂਦੇ ਹਨ। Source-over composition ਹਰ stamp ਨੂੰ ਗਿਣਦੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਉਸੇ ਖੇਤਰ ਵਿੱਚ ਪਹਿਲਾਂ ਕੀਤੇ pass ਦੇ stamps ਵੀ ਸ਼ਾਮਲ ਹਨ, ਅਤੇ coverage-union ਇੰਜਨ ਇਸ ਤੋਂ ਬਚ ਜਾਂਦਾ ਸੀ। ਅਸੀਂ ਇਸ ਗੂੜ੍ਹੇ overlap ਨੂੰ ਸਵੀਕਾਰ ਕੀਤਾ ਕਿਉਂਕਿ ਇਹ ਅਨੁਮਾਨਯੋਗ ਹੈ ਅਤੇ ਸਟ੍ਰੋਕ ਦਾ ਆਕਾਰ ਸਹੀ ਰੱਖਦਾ ਹੈ।
ਦਬਾਅ ਨਾਲ endpoints ਪਤਲੇ ਹੋ ਜਾਂਦੇ ਹਨ। ਅਸਲ lift-off ਦਬਾਅ ਘਟਾਉਂਦਾ ਹੈ, ਜਿਸ ਨਾਲ stamp ਦਾ diameter ਘਟਦਾ ਹੈ, ਇਸ ਲਈ ਸਟ੍ਰੋਕ ਪੂਰੀ ਚੌੜਾਈ ਵਾਲੀ square cap ਉੱਤੇ ਖ਼ਤਮ ਹੋਣ ਦੀ ਬਜਾਏ taper ਹੁੰਦਾ ਹੈ। ਤਿੰਨਾਂ ਜਿਓਮੈਟਰੀ ਇੰਜਨਾਂ ਦੌਰਾਨ ਅਸੀਂ ਉਸ square cap ਨੂੰ ਲੋੜ ਮੰਨਿਆ ਸੀ। ਇਸ ਨੂੰ ਛੱਡਣ ਨਾਲ ਉੱਪਰ ਦੱਸੀਆਂ ਕਈ ਖਾਮੀਆਂ ਦੇ ਪਿੱਛੇ ਵਾਲੀ clipping ਅਤੇ endpoint machinery ਹਟ ਗਈ, ਇਸ ਲਈ ਅਸੀਂ tapered end ਸਵੀਕਾਰ ਕੀਤਾ।
ਇਸ ਲਈ ਜੋ ਮਾਡਲ ਅਸੀਂ ਭੇਜਦੇ ਹਾਂ, ਉਹ ਪਹਿਲਾਂ ਵਾਲਿਆਂ ਨਾਲੋਂ ਘੱਟ ਕੰਮ ਕਰਦਾ ਹੈ। ਇਹ ਮਾਪੀ ਗਈ writing event ਨੂੰ ਕਾਇਮ ਰੱਖਦਾ ਹੈ, device calibration ਤੋਂ ਬਾਅਦ pressure ਉੱਤੇ ਪ੍ਰਤੀਕਿਰਿਆ ਕਰਦਾ ਹੈ ਅਤੇ globally valid outline ਦੀ ਲੋੜ ਤੋਂ ਬਿਨਾਂ ਮੁੜੇ ਅਤੇ ਆਪਣੇ ਆਪ ਨੂੰ ਕੱਟਦੇ ਪਾਥ ਰੈਂਡਰ ਕਰਦਾ ਹੈ। Chisel-shaped nib, ਪੂਰੀ ਤਰ੍ਹਾਂ square cap ਅਤੇ raw samples ਵਿਚਕਾਰ exact polyline ਉਹ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਅਸੀਂ ਇਸ ਦੇ ਬਦਲੇ ਛੱਡ ਦਿੱਤਾ।
pressure floor ਹੋਰ ਪ੍ਰੋਜੈਕਟਾਂ ਵਿੱਚ ਸਭ ਤੋਂ ਸਿੱਧੇ ਤੌਰ ਉੱਤੇ ਲਿਜਾਇਆ ਜਾ ਸਕਦਾ ਹੈ। 0.005 ਦੀ ਕੀਮਤ ਅਸਲ ਇਨਪੁੱਟ ਦੇ ਦੋ ਗੁੱਛਿਆਂ ਵਿਚਕਾਰਲੀ ਖਾਲੀ ਥਾਂ ਤੋਂ ਆਈ: 0.01 ਅਤੇ ਇਸ ਤੋਂ ਉੱਪਰ ਲਿਖਣਾ, ਅਤੇ 0.002 ਅਤੇ ਇਸ ਤੋਂ ਹੇਠਾਂ ਹਵਾ ਵਿੱਚਲੀ tracking। ਉਹੀ ਦਰਜ ਕੀਤੇ ਸਟ੍ਰੋਕ ਦਿਖਾਉਂਦੇ ਹਨ ਕਿ ਹਰ ਜਿਓਮੈਟਰੀ ਮੁਰੰਮਤ ਕਿੱਥੇ ਨਾਕਾਮ ਹੋਈ। ਇਨ੍ਹਾਂ ਨਾਕਾਮੀਆਂ ਨੇ ਸਟੈਂਪ ਮਾਡਲ ਤੱਕ ਪਹੁੰਚਾਇਆ ਅਤੇ ਉਸ ਦੀਆਂ ਦੋ ਕੀਮਤਾਂ ਨਿਰਧਾਰਤ ਕੀਤੀਆਂ।