diff --git a/frontend/src/lib/components/HandwriteCanvas.svelte b/frontend/src/lib/components/HandwriteCanvas.svelte index cf58d1d..49aa600 100644 --- a/frontend/src/lib/components/HandwriteCanvas.svelte +++ b/frontend/src/lib/components/HandwriteCanvas.svelte @@ -214,10 +214,10 @@ if (!path) { const outline = getStroke(pts, { size, - // thinning 0.4 — pressure 변동에 stroke 폭 ±40% 반응. 만년필 nib 처럼 약한 - // 압력 = 가는 선, 강한 압력 = 굵은 선. PRESSURE_WINDOW 8 의 적당한 평균이 - // 마디 차단 + 명확한 굵기 변화 균형. - thinning: 0.4, + // thinning 0.28 — pressure 변동에 stroke 폭 ±28% 반응. MIN_PRESSURE 0.4 + // floor 와 조합하면 약한 pressure 에서도 stroke 가 충분히 보이고, 강한 + // pressure 에선 만년필 nib 같은 굵기 차이. + thinning: 0.28, // smoothing 0.99 — 점 간 보간 사실상 최대. smoothing: 0.99, // streamline 0.86 — input lazy 강하게. 손떨림 보정 + 부드러움. 0.9 이상은 lag. @@ -330,9 +330,14 @@ return e.pointerType === 'pen' || e.pointerType === 'mouse'; } + // 약한 pressure 에서도 stroke 가 너무 가늘어져 *점선* 처럼 보이지 않도록 floor. + // 사용자 보고: 쓰다보면 pressure 가 줄어 "학" 의 ㅡ 같은 부분이 거의 안 보임. + // 0.4 floor + thinning 0.28 = pressure 변동 폭 ±17% 정도, 만년필 변화 명확하면서 + // 너무 가늘어지지 않음. + const MIN_PRESSURE = 0.4; function normalizePressure(p: number | undefined): number { - if (typeof p !== 'number' || !Number.isFinite(p) || p <= 0.05) return 0.5; - return Math.min(1, p); + if (typeof p !== 'number' || !Number.isFinite(p)) return 0.5; + return Math.max(MIN_PRESSURE, Math.min(1, p)); } // 점 사이 거리가 너무 멀면 중간 점 보간 — 빠른 stroke 의 sparse point 점선 방지.