fix(study): 압력 일관성 + dot 제거 — thinning 0.18, window 12, cap false

사용자 보고: 필압이 너무 차이남 (stroke 마다 굵기 들쭉날쭉) + stroke 끝에 dot 점.
종이 만년필 reference 와 비교 시 우리 앱이 작은 압력 변동에 너무 민감.

Fix:
- thinning 0.28 → 0.18. 폭 변동 ±18%. 작은 압력 차이가 큰 굵기로 변환되지 않음.
- PRESSURE_WINDOW 8 → 12. 평균 더 안정 → stroke 간 일관성.
- cap: true → false. round cap 이 짧은 stroke 에서 dot 처럼 보이던 회귀 제거.
  taper 가 끝을 자연스럽게 마무리하므로 cap 불필요.
- start.taper size*0.15 → 0.2. end.taper size*0.3 → 0.4. cap 없으니 taper 가 직접
  마무리 — 살짝 더 길게 두어 만년필 nib felt 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-04-27 15:26:37 +09:00
parent 580f3ab728
commit 9af928b7d7
@@ -214,18 +214,18 @@
if (!path) {
const outline = getStroke(pts, {
size,
thinning: 0.28,
// thinning 0.18 — 압력 차이에 stroke 폭 ±18% 반응. 사용자 보고 "필압 너무
// 차이나" = 작은 압력 변동이 큰 굵기 차이로 변환되어 일관성 없음. 0.28 →
// 0.18 로 줄여 stroke 간 일관성 강화. PRESSURE_WINDOW 12 평균으로 보정.
thinning: 0.18,
smoothing: 0.99,
// streamline 0.75 — 0.86 은 짧은 stroke (작은 글자) 에서 lag 누적으로 펜
// 위치를 따라오지 못해 stroke 가 부서져 보임. 0.75 가 부드러움 + 짧은
// stroke 정확성 균형.
streamline: 0.75,
simulatePressure: false,
last: !isInflight,
// taper 짧게 — 작은 글자 stroke (size × 1~2 길이) 에서 taper 영역이 전체를
// 차지하지 않도록. nib felt 는 유지하되 짧은 stroke 도 명확히.
start: { cap: true, taper: size * 0.15, easing: (t) => t * (2 - t) },
end: { cap: true, taper: size * 0.3, easing: (t) => t * (2 - t) },
// cap: false — stroke 끝의 round cap 이 짧은 stroke 에선 dot 처럼 보이는
// 회귀. taper 가 stroke 끝을 자연스럽게 마무리하므로 cap 불필요.
start: { cap: false, taper: size * 0.2, easing: (t) => t * (2 - t) },
end: { cap: false, taper: size * 0.4, easing: (t) => t * (2 - t) },
});
if (outline.length < 2) return;
path = new Path2D(getSvgPathFromStroke(outline));
@@ -350,7 +350,7 @@
// 살짝 변동시켜 thinning 적용 시 *점 간 micro 폭 변동 = 마디* 일으키던 회귀를
// 차단. window 평균은 큰 흐름만 반영, 매 점 변동은 1/N 수준. 사용자 보고 "선
// 사이사이 애매한 끊어짐" 의 원인이었음.
const PRESSURE_WINDOW = 8;
const PRESSURE_WINDOW = 12;
function smoothPressureWindow(pts: Point[], current: number): number {
let sum = current;
let count = 1;