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

transform path vs group

같은 화면 결과도 저장 방식이 두 가지입니다: <g transform="…">에 matrix를 두거나, matrix를 path 좌표에 bake합니다. 편집기는 거의 항상 전자, export·일부 파이프라인은 후자를 씁니다.

방식 비교

<g transform>path에 bake
d 문자열로컬 그대로모든 점·제어점 변환됨
frame 이동g matrix만 수정d 전체 재계산
pointer hitM⁻¹ unproject (079)좌표가 이미 world면 그대로
중첩 그룹트리 유지flatten 시 계층 소실
Figma 느낌layer transform“flatten transforms” export

데모: 회색 = 원본 d, 파란색 = transformPathSegments 후 bake된 path.

group transform (편집 권장)

<g transform="matrix(1.2 0.1 -0.1 1.1 40 20)">
  <path d="M 120 280 C 200 80 440 320 520 120"/>
</g>
  • path grammar·handle index가 안정적 (021–024)
  • 여러 path가 같은 g 아래면 한 번에 이동
  • multiplySvgMatrix(parent, child)로 누적 (002)

bake — transformPathSegments

import {
  parsePathD,
  pathDFromSegments,
  transformPathSegments,
  parseSvgMatrix
} from "svg-matrix-core";

const segments = parsePathD(pathD);
const matrix = parseSvgMatrix("matrix(1.2 0.1 -0.1 1.1 40 20)");
const baked = transformPathSegments(segments, matrix);
const bakedD = pathDFromSegments(baked);

segment 타입별로 모든 점에 applyAffineMatrix가 들어갑니다:

type변환되는 점
Mpoint
Lfrom, to
Cfrom, cp1, cp2, to
Qfrom, cp, to

곡선 형태는 affine 하에서 동일 Bézier입니다 (제어점만 이동). 비균일 scale + strong skew에서는 시각적으로 “다른” handle 배치처럼 보일 수 있어 UI는 group 쪽이 낫습니다.

언제 bake하나

  • SVG export “flatten transforms” 옵션
  • boolean·offset 전에 한 좌표계로 맞출 때 (028)
  • Canvas 2D에 path를 그릴 때 CTM 없이 d만 넘기는 경우
  • GPU mesh: world space vertex buffer (100)

편집 세션 중에는 bake하지 않고, export 버튼에서만 bake하는 제품이 많습니다.

pointer unproject (group 편집 시)

import { invertAffineMatrix, applyAffineMatrix } from "svg-matrix-core";

const world = multiplySvgMatrix(parentMatrix, nodeMatrix);
const local = applyAffineMatrix(invertAffineMatrix(world), pointerUser);
// local에서 closestPointOnCubic / classifyPointInPath

079 decomposeAffineMatrix는 Inspector “회전/스케일” 표시용입니다.

bake 후 편집하면?

bake된 d만 남으면 “원래 로컬 path + transform” 정보가 사라집니다. 되돌리려면 역행렬을 다시 곱해 unbake하거나, 편집기 history에 pre-bake snapshot을 둡니다.

데모에서 볼 것

  1. 회색·파란 path가 같은 실루엣인지 (같은 matrix 결과)
  2. readout — “bake matrix into coordinates vs g leaves d in local space”
  3. 파란 path만 있으면 transform 없이도 그려지는 이유

Core API

  • transformPathSegments, applyAffineMatrix — geometry.js
  • parseSvgMatrix, multiplySvgMatrix, pathDFromSegments — index.js / engine.js

관련 강의

  • 002 matrix · 079 inverse · 056 좌표 스택
  • 024 path editor — round-trip은 local d + layer transform

오늘의 핵심

편집 = local geometry + group matrix. export = 필요 시 bake. 두 path를 혼동하면 hit test와 handle index가 어긋납니다.

최근 수정: 26. 5. 17. PM 4:35
Contributors: jinho.park.s3, Cursor
Prev
affine inverse & decompose