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

point at length와 tangent

총 길이 017 L이 있으면, **거리 s ∈ [0, L]**에서의 점과 접선을 묻습니다. textPath 글자 배치, 화살표 방향, motion path 위치가 같은 sampling입니다.

API

import { pointAtPathLength, pathLength, parsePathD } from "svg-matrix-core";

const segments = parsePathD("M 60 300 C 160 80, 480 340, 580 120");
const total = pathLength(segments, { stepsPerCurve: 24 });

const sample = pointAtPathLength(segments, total * 0.35, {
  stepsPerCurve: 24
});
// {
//   point: { x, y },
//   tangent: { x, y }   // 단위 벡터 — flatten edge 방향
// }

내부: flattenPathSegments → pointAtPolylineLength(polyline, s).

polyline 위 보간

s가 edge i 안이면:
  point = lerp(pᵢ₋₁, pᵢ, t)
  tangent = normalize(pᵢ − pᵢ₋₁)

데모 (path-length / path-point 공용)

  • distance along path 슬라이더 — s 변경
  • 주황 marker — sample.point
  • readout: tangent=(tx, ty) — 다음 점 방향

stepsPerCurve가 작으면 tangent가 들쭉 — 016과 같이 step↑ 또는 adaptive.

회전에 쓰기

const angle = Math.atan2(sample.tangent.y, sample.tangent.x);
// SVG: transform={`rotate(${deg} ${sample.point.x} ${sample.point.y})`}

090 SMIL rotate="auto" — 브라우저가 동일 질문을 내부 처리.

textPath · motion

용도선언수학
텍스트沿 path<textPath startOffset="40"> 또는 50%s → point, tangent → glyph rotate (063)
SMIL<animateMotion>s(t) — 시간은 css-matrix
CSSoffset-path + offset-distance (092)동일
JS preview094 sampleMotionAlongPathprogress↔s + LUT 095

균일 속도 — parameter t≠균일 s. 095 sampleMotionAlongPathUniform.

flatten tangent vs 해석적 법선

pointAtPathLength tangent070 cubicNormalAt
출처polyline edgeBézier 미분
용도textPath, coarse motionoffset, curvature, 정밀 법선

textPath·화살표는 보통 flatten tangent로 충분. inside stroke offset은 070.

native 비교 (097)

pathEl.getPointAtLength(s);  // DOM, flatten 내부
// vs
pointAtPathLength(segments, s, opts);  // segment graph, 편집 중

Core API

  • pointAtPathLength, pointAtPolylineLength
  • pathLength, flattenPathSegments
  • sampleMotionAlongPath, buildArcLengthLookup — 094, 095
  • cubicNormalAt — 070

관련

  • 017 L · 016 flatten 품질 · Part 23–24 motion

오늘의 핵심

motion·textPath = path grammar + length sampling. s→(point,tangent)까지 svg-matrix, 언제 s가 시간에 매핑되느냐는 animation 레이어(094, css-matrix).

최근 수정: 26. 5. 17. PM 4:35
Contributors: jinho.park.s3, Cursor
Prev
path length