SVG Graphics Geometry
Guide
css-matrix
Guide
css-matrix
  • Part 0. SVG 기초

    • SVG란 무엇인가
    • viewBox와 user space
    • transform attribute와 matrix
    • SVG 문서 구조와 기본 도형
  • Part 1. Path grammar

    • path d 명령어 — M, L, Z
    • H, V — 축 정렬 직선
    • C — cubic Bézier
    • Q — quadratic Bézier
    • S, T — smooth continuation
    • A — elliptical arc
    • path bounding box
  • Part 2. Stroke geometry

    • 점에서 stroke까지의 거리
    • join, cap, miter limit
    • stroke align과 outline 개념
    • miter length 공식
  • Part 3. Fill rules

    • nonzero vs evenodd
    • fill hit testing
  • Part 4. Path sampling

    • flatten tolerance
    • path length
    • point at length와 tangent
  • Part 5. Paint servers

    • linearGradient 좌표
    • clipPath와 mask 개념
  • Part 6. Path editor capstone

    • path handle 모델
    • handle hit testing
    • handle drag로 segment 갱신
    • mini path editor — SVG round-trip
  • Part 7. Fill & winding deep dive

    • winding vs ray casting
    • compound path — 여러 subpath
    • self-intersection
    • path boolean
    • fill vs stroke hit 우선순위
    • scanline parity
  • Part 8. Pattern & gradient

    • radialGradient
    • pattern tile
    • gradientUnits와 spreadMethod
  • Part 9. SVG filter & Figma effects

    • Figma DROP_SHADOW → SVG filter
    • filter chain 개요
    • blur · offset · merge
    • inner shadow
    • layer blur vs background blur
    • Figma effect 매핑표 전체
  • Part 10. Figma ↔ SVG bridge

    • vector network vs path d
    • fill · stroke export
    • boolean operations export
    • mask · clip export
  • Part 11. Icon design

    • pixel grid · optical alignment
    • fill vs stroke icons
    • symbol · sprite · currentColor
    • path simplification
  • Appendix A. SVG in CSS

    • currentColor · CSS theming
    • sprite data URI
    • SVG optimization pipeline
  • Appendix B. Engine extras

    • dash offset animation
    • adaptive flatten
    • arc → cubic 변환
    • multi-subpath editing
  • Part 12. Foundations primer

    • capability map
    • coordinate stack
  • Part 13. Figma ↔ SVG (deep)

    • Figma paint gap map
    • radial · angular gradient export
    • image · pattern fill
    • stroke align export
    • blend mode · layer opacity
  • Part 14. SVG spec breadth

    • markers — 화살표와 dash 끝
    • text · textPath
    • paint-order · opacity · filters
    • arc flatten 통합
  • Part 15. Curve calculus

    • de Casteljau subdivision
    • flatness와 chord error
    • 곡률 κ와 법선
    • arc center parameterization
    • G¹ smooth — S와 T
    • shoelace signed area
  • Part 16. Intersection & proximity

    • segment intersection
    • line ∩ cubic · curve ∩ curve
    • closest point on curve
  • Part 17. Offset curves

    • normal offset sampling
    • offset cusps
  • Part 18. Transform algebra

    • affine inverse & decompose
    • transform path vs group
  • Part 19. Rational curves

    • circle as cubic — κ constant
    • rational curves & exact arcs
  • Part 20. Tessellation & pixels

    • convex triangulation · ear clipping
    • evenodd parity → pixels
  • Part 21. Compositing math

    • Gaussian blur kernel
    • Porter–Duff & premultiplied α
  • Part 22. Math topic map

    • SVG 수학 주제 지도
  • Part 23. SVG animation

    • SMIL — animate 속성
    • SMIL — animateTransform
    • SMIL — animateMotion
    • stroke dash draw-on
    • CSS offset-path motion
    • path morph
    • JS motion along path
  • Part 24. Motion precision

    • uniform speed along path
    • cubic–cubic intersection
    • SVGPathElement length API
    • SMIL keyTimes & keySplines
    • degree elevation Q→C
  • Part 25. GPU mesh & WAAPI

    • triangulation with holes
    • WAAPI + SVG attributes
    • evenodd fill + triangle mesh

adaptive flatten

016 uniform flatten은 곡선마다 t = k/n을 항상 찍습니다. Adaptive flatten은 chord error가 ε 이하가 될 때까지 068 subdivide 후 재귀합니다 — 직선 구간은 점이 거의 없고, 휜 구간만 촘촘합니다.

데모에서 볼 것

path:

M 40 320 C 120 40, 520 380, 600 120
  • 회색 stroke — 원본 cubic
  • 회색 점 — flattenPathSegments (uniform, uniform steps 슬라이더)
  • 파란 점 — flattenPathSegmentsAdaptive (tolerance 슬라이더)

readout 예:

uniform 17 pts (gray)  length=…
adaptive 9 pts (blue)  length=…

tolerance를 줄이면 파란 점이 늘고, uniform steps를 키우면 회색 점이 늘어납니다. 같은 시각 품질에서 adaptive가 점 수를 줄이는 경우가 많습니다 (069 flatness와 같은 멈춤 기하).

API

path 전체

import { flattenPathSegmentsAdaptive, compareFlattenMethods } from "svg-matrix-core";

const poly = flattenPathSegmentsAdaptive(segments, { tolerance: 0.5 });
// M/L: 끝점만 · C/Q: adaptive · A: arcSegmentToCubics → C adaptive

cubic 하나

import { flattenCubicAdaptive } from "svg-matrix-core";

const points = [{ ...p0 }];
flattenCubicAdaptive(p0, p1, p2, p3, 0.5, points);
// points 배열에 in-out 누적 — 반환값 없음

flattenQuadraticAdaptive — 009 Q segment 동일 패턴 (engine.js).

알고리즘 (cubic)

mid = B(½)
if distance(mid, chord P0→P3) ≤ ε:
  push P3; return
else:
  splitCubic (de Casteljau ½) → 왼쪽·오른쪽 재귀

069 cubicFlatnessError와 동일한 중점–현 수직 거리 검사입니다 (distancePointToSegment).

uniform vs adaptive

016 uniform052 adaptive
멈춤고정 stepsPerCurve / stepsPerArcε (tolerance)
직선 L끝점 + 중간 샘플 없음끝점만 (2점)
점 개수예측 가능곡률·ε에 따라 변동
구현index.js flattenPathSegmentsengine.js
import { compareFlattenMethods, flattenPathSegments } from "svg-matrix-core";

const stats = compareFlattenMethods(segments, {
  tolerance: 0.5,
  stepsPerCurve: 16
});
// {
//   uniformCount, adaptiveCount,
//   uniformLength, adaptiveLength   // polylineLength
// }

compareFlattenMethods — 데모 readout의 숫자 출처. length는 둘 다 polyline 근사이므로 ε·step에 따라 약간 다릅니다 (017).

언제 쓰나

용도이유
fill hit · boolean015 — 곡선 구간만 촘촘히
path length / motion017, 018 — 같은 ε로 L 수렴
offset · intersection077, 075 — flatten 품질
export / GPU meshpolygon 전처리 — 점 수↓

편집 live preview는 coarse uniform이 더 단순할 수 있고, commit·export에 adaptive를 쓰는 팀이 많습니다.

ε 스케일

tolerance는 world / user space px (viewBox 단위)입니다. zoom·devicePixelRatio와 맞추려면 screen px → world 변환 후 ε를 넣습니다.

Core API (engine.js)

함수역할
flattenCubicAdaptivecubic → points 배열 누적
flattenQuadraticAdaptivequadratic
flattenPathSegmentsAdaptivefull segment graph
compareFlattenMethodsuniform vs adaptive 통계

re-export: svg-matrix-core index.js에서 import 가능.

관련

  • 016 · 068 · 069 · 065 arc flatten 비교

오늘의 핵심

Adaptive = 같은 chord-error ε, 더 적은 점. uniform step만 키우는 것과 달리 직선은 거의 샘플하지 않습니다. compareFlattenMethods로 데모처럼 점 수·length trade-off를 확인한 뒤 fill·length·boolean에 같은 tolerance를 고정하세요.

최근 수정: 26. 5. 17. PM 4:35
Contributors: jinho.park.s3, Cursor
Prev
dash offset animation
Next
arc → cubic 변환