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

affine inverse & decompose

002에서 matrix(a,b,c,d,e,f)로 도형을 움직였다면, 편집기는 반대로 클릭 좌표를 path 로컬로 되돌리는 역행렬이 필요합니다. 또한 UI에 “회전 25°, X 스케일 1.0”을 보여 주려면 matrix를 분해(decompose) 해야 합니다.

SVG affine 한 장

2D affine은 3×3 행렬의 위 2행만 씁니다 (마지막 행 [0,0,1]).

| x' |   | a  c  e | | x |
| y' | = | b  d  f | | y |
| 1  |   | 0  0  1 | | 1 |
import { applyAffineMatrix } from "svg-matrix-core";

const world = applyAffineMatrix(matrix, { x: 10, y: 20 });

002의 applySvgMatrix / parseSvgMatrix와 같은 6수입니다. 누적은 multiplySvgMatrix(left, right) — 오른쪽 transform이 먼저 적용됩니다.

역행렬 — pointer unproject

부모 <g>까지 포함한 world matrix M이 있을 때, path 로컬 점은:

p_local = M⁻¹ · p_world
import { invertAffineMatrix, applyAffineMatrix } from "svg-matrix-core";

const worldMatrix = parseSvgMatrix(g.getAttribute("transform"));
// 또는 svg.getScreenCTM() → { a,b,c,d,e,f } (브라우저)

const inv = invertAffineMatrix(worldMatrix);
const local = applyAffineMatrix(inv, pointerInUserSpace);

특이(singular) matrix

det = a·d − b·c

det ≈ 0이면 역행렬이 없습니다 — scale 0, 잘못된 collapse. core는 Singular affine matrix를 던집니다.

상황대응
scale → 0편집 UI에서 최소 스케일 클램프
degenerate skewdecompose 값만 표시, hit test 스킵

분해 — UI 슬라이더와 맞추기

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

const parts = decomposeAffineMatrix(matrix);
// {
//   translate: { x: e, y: f },
//   rotation,    // atan2(b, a) 라디안
//   scaleX,      // hypot(a, b)
//   scaleY,      // det / scaleX (부호 포함)
//   shear,
//   matrix       // 원본 그대로
// }

데모 슬라이더 rotate°, scaleX를 움직이면 readout의 rotate=…° scaleX=…가 갱신됩니다. 내부적으로는

const matrix = {
  a: Math.cos(rad) * sc,
  b: Math.sin(rad) * sc,
  c: -Math.sin(rad),
  d: Math.cos(rad),
  e: 80,
  f: 40
};

처럼 합성한 뒤 decomposeAffineMatrix로 다시 읽습니다.

분해의 한계

  • 순서가 다른 translate·rotate·scale 조합은 같은 matrix라도 “의도한” Euler 각이 여러 개일 수 있음
  • 음수 scaleY (뒤집기)는 rotation + reflection으로 겹쳐 보임
  • 편집기는 보통 translate → rotate → scale 고정 순서로 UI를 설계하고, 그 순서에 맞춰 matrix를 재합성합니다

좌표 스택과 연결

056 흐름:

client (px) → SVG user space (getScreenCTM⁻¹) → layer local (g⁻¹) → path local

handle hit(022)은 path local에서 거리를 재고, frame 이동은 g matrix만 바꿉니다 (080).

데모에서 볼 것

  1. rotate° — decomposeAffineMatrix의 rotation이 슬라이더와 같이 변하는지
  2. scaleX — scaleX만 변하고 rect가 찌그러지지 않는지 (데모는 균일 scale에 가깝게 구성)
  3. readout의 invertAffineMatrix · e=… f=… — 역행렬의 이동 성분 (unproject 시 origin이 어디로 가는지)

Core API

함수역할
applyAffineMatrixmatrix × 점
invertAffineMatrixM⁻¹ (singular 시 throw)
decomposeAffineMatrixUI용 translate / rotation / scale / shear
parseSvgMatrix, multiplySvgMatrix002 — index.js

geometry.js에 affine 전용 구현, index.js에 SVG attribute 파서.

관련 강의

  • 002 transform · 056 좌표 스택
  • 080 transform path vs group
  • css-matrix — 동일 matrix algebra

오늘의 핵심

브라우저 getScreenCTM()은 world matrix를 줍니다. 편집기는 invertAffineMatrix로 로컬로 내린 뒤 stroke/fill/handle hit을 합니다. 분해는 표시용이고, 저장은 matrix 곱 하나가 안전합니다.

최근 수정: 26. 5. 17. PM 4:35
Contributors: jinho.park.s3, Cursor
Next
transform path vs group