-
Notifications
You must be signed in to change notification settings - Fork 0
Parsing
// (ํ์๋ง ์ฐธ๊ณ ํด์ ๋ด์ฉ์ ํธํ๊ฒ)
๋ณธ ๋ฌธ์๋ ๋ก๋ดํ ์๋ฎฌ๋ ์ดํฐ ํ๋ก์ ํธ plotto์์
SVG ํ์ผ์ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๋ก๋ด ๋์ ์์ฑ์ ํ์ํ
๊ฒฝ๋ก ๋ฐ์ดํฐ๋ก ๋ณํํ๋ SVG ํ์ฑ ๊ณผ์ ์ ์ค๋ช
ํฉ๋๋ค.
SVG ํ์ฑ์ ์์คํ
์ ์ฒด ๋์ ํ์ดํ๋ผ์ธ์ ์ฒซ ๋จ๊ณ๋ก,
์ด ๋จ๊ณ์์ ์ถ์ถ๋ ๊ฒฝ๋ก ์ ๋ณด๋ ์ดํ ์ขํ ๋ณํ,
๊ธฐ๊ตฌํ ๊ณ์ฐ ๋ฐ plotto Path ์์ฑ์ ์
๋ ฅ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
SVG๋ XML ๊ธฐ๋ฐ์ ๋ฒกํฐ ์ด๋ฏธ์ง ํฌ๋งท์ผ๋ก,
๋ค์ํ ์์์ ์์ฑ์ ํฌํจํ๊ณ ์์ผ๋
plotto ์์คํ
์์๋ ๊ฒฝ๋ก(Path) ์ ๋ณด๋ง์ ์ ํ์ ์ผ๋ก ํ์ฉํฉ๋๋ค.
SVG ํ์ฑ ๋จ๊ณ์ ์ฃผ์ ๋ชฉ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- SVG ํ์ผ ๊ตฌ์กฐ ํด์
- ๊ฒฝ๋ก(Path) ์์ ์ถ์ถ
- ๊ฒฝ๋ก ๋ช ๋ น์ด๋ฅผ ์ขํ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ก ๋ณํ
- ํ ์ /๋ค์ด ์ํ๋ฅผ ๋ช ํํ ๊ตฌ๋ถ
- ์
๋ ฅ ํ์:
.svg - ํ์ฑ ๋ฐฉ์: XML ๊ธฐ๋ฐ ๊ตฌ์กฐ ๋ถ์
- ์ฃผ์ ๋์ ์์:
<path>ํ๊ทธ
SVG์ ๊ฒฝ๋ก๋ d ์์ฑ์ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋๋ฉฐ,
๋ณต์์ ๋ช
๋ น์ด์ ์ขํ ์ ๋ณด๊ฐ ์์ฐจ์ ์ผ๋ก ํฌํจ๋ฉ๋๋ค.
M 10 10 L 50 50 Z
// ์ด๊ฑฐ ๋์
๋ถ์ ์ธ์ด (```) javscript๋ก ๋ช
์ํ๋ ๊ฒ ์ ์ผ ๊น๋ํฉ๋๋extractPathPointsFromSvg(svgText, opts={}) ํจ์๋ SVG ์ด๋ฏธ์ง ์์ค (svgText)๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์, ๊ทธ ์์ ํฌํจ๋ ๋ชจ๋ ๋ํ(graphic element)๋ค์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ผ์ ๊ฐ๊ฒฉ์ ์ ๋ค์ ์ถ์ถํ๊ณ ์ด๋ฅผ ์ขํ ๋ฆฌ์คํธ๋ก ๋ฐํํ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
-
๋งค๊ฐ ๋ณ์
-
์ด ํจ์๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
-
svgText: SVG ํ์ผ์ ์๋ณธ ํ ์คํธ ์ ๋๋ค. SVG๋ฅผ ๋ฌธ์์ด ํํ๋ก ์ ๊ณตํ๋ฉด, ํจ์๊ฐ ์ด๋ฅผ ํ์ฑํ์ฌ DOM ๊ตฌ์กฐ๋ก ๋ณํํฉ๋๋ค. -
opts: ๊ฒฝ๋ก ์ถ์ถ๊ณผ ์ํ๋ง ์ต์ ์ ๋ด์ ๊ฐ์ฒด์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ {}์ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ ์ง์ ํ ์ ์์ต๋๋ค.
-
-
opts ์ต์
์ต์ ์ด๋ฆ ํ์ / ๊ธฐ๋ณธ๊ฐ ์ค๋ช sampleStep number / null์ํ๋ง ๊ฐ๊ฒฉ๋ฅผ ์ง์ ์ง์ ํฉ๋๋ค. ์ด ๊ฐ์ด ์ฃผ์ด์ง๋ฉด ๊ฐ ๊ฒฝ๋ก๋ฅผ
๊ณ ์ ๋ ๊ฐ๊ฒฉ์ผ๋ก ์ํ๋งํ๋ฉฐ, samplesPerPath์ค์ ์ ๋ฌด์๋ฉ๋๋ค.samplesPerPath number / 200๊ฐ ๋ํ์ ๊ฒฝ๋ก๋ฅผ ๋ช ๋ฑ๋ถ์ผ๋ก ๋๋์ง์ ๋ํ ๋๋ต์ ์ธ ๊ธฐ์ค์ ๋๋ค.
๊ฒฝ๋ก ์ ์ฒด๋ฅผ ์ด ๊ฐ์ผ๋ก ๋๋์ด ํ๊ท ๊ฐ๊ฒฉ์ ๊ณ์ฐํฉ๋๋ค.maxStepClamp number / 2์ํ ๊ฐ๊ฒฉ์ ์ํ๊ฐ์ ์ง์ ํฉ๋๋ค. ๋๋ฌด ๊ธด ๊ฒฝ๋ก์ ๊ฒฝ์ฐ ๊ฐ๊ฒฉ์ด
์ง๋์น๊ฒ ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฐ์ผ๋ก, ๊ฐ๊ฒฉ์ด ์ด๋ณด๋ค ํฌ๋ค๋ฉด
์ด ๊ฐ์ผ๋ก ๊ณ ์ ๋ฉ๋๋ค.maxSamplesPerPath number / 3000๊ฐ ๊ฒฝ๋ก๋น ์์ฑ๋ ์ ์๋ ์ต๋ ์ํ ์ ๊ฐฏ์์ ๋๋ค. bridgeScale number / 1.0path ๊ฐ ์ด๋ ๊ฒฝ๋ก์ ๋ฐ๋๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ผ์ผ ๋ณ์์ ๋๋ค.
opts๋ฅผ ํตํด ๊ฒฝ๋ก ์ํ๋ง ๊ฐ๊ฒฉ๊ณผ ๋ฐ๋๋ฅผ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
-
์ ๋ฐ์ ์ธ ์คํ ํ๋ฆ
-
SVG ํ์ฑ ๋ฐ ์ค๋น
- ์ฃผ์ด์ง svgText ๋ฌธ์์ด์ DOM Parser๋ฅผ ์ด์ฉํด SVG DOM ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ๊ฐ์์ผ๋ก ์ฌ์ฉํ
<svg>์๋ฆฌ๋จผํธ๋ฅผ ์ถ๊ฐํ์ฌ SVG์ ๊ธธ์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ฃผ์ด์ง svgText ๋ฌธ์์ด์ DOM Parser๋ฅผ ์ด์ฉํด SVG DOM ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ๊ฐ์์ผ๋ก ์ฌ์ฉํ
-
๋ํ ์์ ์์ง
- SVG ๋ด์ ๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ ์์(
<path>, <circle>, <rect>, <line>, <polygon>, <polyline>๋ฑ)์ ์ฐพ๊ณ , ํ์ ์์ฑ์ด ์จ๊น ์ฒ๋ฆฌ๋์ง ์์ ๊ฒ๋ง ์ ๋ณํฉ๋๋ค. - ์ด๋ ๊ฐ ์์๋ง๋ค ํด๋น ์์์ ์ ์ฉ๋ ๋ณํ ํ๋ ฌ(Transform)์ ๊ณ์ฐํ์ฌ ํจ๊ป ๋ณด๊ดํฉ๋๋ค.
- SVG ๋ด์ ๋ชจ๋ ๊ทธ๋ฆฌ๊ธฐ ์์(
-
๋ํ๋ณ ๊ฒฝ๋ก ๋ณํ : ์์งํ ๊ฐ ๋ํ์ SVG
<path>์ ๊ฐ์ ํํ์ธ ๊ฒฝ๋ก ๋ฐ์ดํฐ(d)๋ก ๋ณํํฉ๋๋ค. ๊ธฐ๋ณธ ๋ํ(<rect>, <circle>๋ฑ)์ธ ๊ฒฝ์ฐ์ ๊ฒฝ๋ก ๋ช ๋ น์ผ๋ก ๋ฐ๊พธ๊ณ , ์ด๋ฏธ<path>์ธ ๊ฒฝ์ฐ์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๋, ๋ด๋ถ์ MOVE ๋ช ๋ น์ด ์์ ๊ฒฝ์ฐ ๋ถ๋ฆฌํฉ๋๋ค. -
๊ฒฝ๋ก ์ํ๋ง : ๊ฐ ๊ฒฝ๋ก์ ๋ํด ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉฐ
getPointAtLength๋ฅผ ์ด์ฉํด ์ขํ๋ฅผ ์ํ๋งํฉ๋๋ค. ์ฒซ ์ ์ ํ์ ๋ค์ด์ ์ด๋(pen = 0)ํ๋ฉฐ, ์ํ ์ ์ ํ์ ๋๊ณ ๊ทธ๋ฆฌ๋(pen = 1)์ํ๋ก ์ํ๋งํ์ฌ localPoints ๋ฆฌ์คํธ๋ฅผ ์ป์ต๋๋ค. - path ์ฌ์ด ๋ณด๊ฐ : ์ด์ ๊ฒฝ๋ก์ ๋ง์ง๋ง ์ ๊ณผ ๋ค์ ๊ฒฝ๋ก ์ฒซ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ค๋ฉด, ํ์ ๋ ์ํ๋ก ํด๋น ๊ฐ๊ฒฉ์ ์ด๋ํ๋ ์ค๊ฐ ์ ์ ์ฝ์ ํฉ๋๋ค.
- ํฌ์ธํธ ๋ฐํ : ๋ชจ๋ ๊ฒฝ๋ก ์กฐ๊ฐ๋ค์ ๋ํด ์ํ๋ง์ด ๋๋๋ฉด, ์ด๋ค์ ์์๋๋ก points ๋ฐฐ์ด์ ์ด์ด๋ถ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก points์๋ SVG์ ๋ชจ๋ ๋ํ์ ์ํํ๋ ์ขํ ์ ๋ค์ด ์ฐจ๋ก๋๋ก ๋ด๊ธฐ๋ฉฐ, ๊ฐ ์ ์ ํ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ธ์ ์ ์ ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ด๋ํ๋์ง ๊ตฌ๋ถ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ด points ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
-
SVG ํ์ฑ ๋ฐ ์ค๋น
-
์คํ ๋์
1. **SVG ํ์ฑ ๋ฐ ์ด๊ธฐ ์ค์ ** (1) **_DOM ๊ฐ์ฒด ์์ฑ_** - ํจ์๋ ์ฃผ์ด์ง SVG ํ ์คํธ๋ฅผ ํ์ฑํ์ฌ DOM ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. - ์ด ๋, DOM ํ์๋ฅผ์ด์ฉํ์ฌ ์ค์ SVG DOM ๊ฐ์ฒด๋ก(doc)๋ณํํฉ๋๋ค.(2) ์์ SVG ์๋ฆฌ๋จผํธ ์์ฑ : ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ SVG ๊ฒฝ๋ก ๊ธธ์ด ๋ฐ ์ขํ ๊ณ์ฐ API๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์์
<svg>์์๋ฅผ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋, SVG DOM์getTotalLength()๋ฐgetPointAtLength()๋ฉ์๋๋ SVG ์์๊ฐ DOM์ ์์ด์ผ ์ ์ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ณ์ ์ด๊ธฐํ : ์ต์ข ์ผ๋ก ๋ฐํํ ๋ฐฐ์ด์ธ points๋ฅผ ์ด๊ธฐํํฉ๋๋ค.(point์๋ {x, y, pen} ๊ฐ์ฒด๊ฐ ์์๋๋ก ์์ ๋๋ค.) ๋ํ, ์ด์ ๋ํ์ ๋ง์ง๋ง์ ์ ์ฅํ๋ lastGlobalPt๋ ์ด๊ธฐํํฉ๋๋ค.(์ฒซ ๋ํ ํ์ ๊ฐ์ ์ฑ์๋๋ค.), ์ด ๊ฐ์ path ๊ฐ ์ด๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
SVG ์์๋ค์ transfrom ์์ฑ์ ํตํด ํํ์ด๋, ํ์ , ์ค์ผ์ผ, ๊ธฐ์ธ์ด๊ธฐ(skew)๋ฑ์ ๋ณํ์ ๊ฐ์ง๋ฉฐ, <g> ๊ทธ๋ฃน์ ์ด์ฉํด์ ์์ ๊ทธ๋ฃน๋ค์ ๋ณํ์ด ๋์ ์ ์ฉ ๋ ์ ์์ต๋๋ค. spine ์ฝ๋์์ ์ด๋ฌํ ๋ณํ์ ์ ์ฉํ๊ธฐ ์ํด ๋ณํ affine ํ๋ ฌ์ ์ด์ฉํด์ ์ขํ๊ณ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ฉฐ, ์ด ํ๋ ฌ ์ ํธ๋ฆฌํฐ ํจ์์ ๋ํด ์๊ฐํ๊ณ ์ ํฉ๋๋ค.
ํญ๋ฑ ํ๋ ฌ{a:1, b:0, c:0, d:1, e:0, f:0}์ ๋ฐํํฉ๋๋ค(a=1, d=1์ด๊ณ ๋๋จธ์ง 0์ธ ๋จ์ํ๋ ฌ)
์ด๋ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. x๋ฐฉํฅ tx, y ๋ฐฉํฅ ty๋งํผ ํํ์ด๋ ์ํค๋ ํ๋ ฌ์ ๋๋ค.
์ค์ผ์ผ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. x์ถ ๋ฐฉํฅ sx๋ฐฐ y์ถ ๋ฐฉํฅ sy๋ฐฐ ํ๋/์ถ์ ํฉ๋๋ค.
ํ์ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ๊ฐ๋ ๋งํผ ์์ ์ ์ค์ฌ์ผ๋ก ํ์ ํ๋ ํ๋ ฌ์ ๋๋ค.
X์ถ ๊ธฐ์ค ๊ธฐ์ธ์ด๊ธฐ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ๊ฐ๋ ๋งํผ x์ถ ๋ฐฉํฅ์ผ๋ก ๊ธฐ์ธ์ด๋ ๋ณํ์ ๋๋ค.
Y์ถ ๊ธฐ์ค ๊ธฐ์ธ์ด๊ธฐ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ๊ฐ๋ ๋งํผ y์ถ ๋ฐฉํฅ์ผ๋ก ๊ธฐ์ธ์ด๋ ๋ณํ์ ๋๋ค.
๋๊ฐ์ ํ๋ ฌ m1,m2๋ฅผ ๋ฐ์ ์์๋๋ก ํฉ์ฑํ ๊ฒฐ๊ณผ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค.
"translate(...)", "rotate(...)"์ ๊ฐ์ SVG transform ์์ฑ ๋ฌธ์์ด์ ์ฝ์ด๋ค์ด๊ณ , ๊ทธ ๋ณํ๋ค์ ํฉ์ฑ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ํ๋ ฌ๋ก ๋ณํํ๋ ํจ์์
๋๋ค.
์๋ฅผ ๋ค์ด, transform="translate(10, 5) rotate(30)"์ ๊ฐ์ ๋ฌธ์์ด์ ํ์ฑํ์ฌ ํ๋์ ํ๋ ฌ ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค.
์ ๊ท์์ผ๋ก "์ด๋ฆ" ํจํด์ ์ฐพ์์ ๊ฐ ๋ณํ๋ช
๋ น์ ์์๋๋ก ํด์ํ๋ฉฐ, ์์ ์ ์ํ ํ๋ ฌ ํจ์๋ค์ ์ด์ฉํฉ๋๋ค.
๊ฐ ๋ณํ ํ๋ ฌ m์ ์ด์ ๊น์ง์ ๋์ ํ๋ ฌ M์ ๊ณฑ์ ํ๋ฉฐ ํฉ์ฑํด ๋๊ฐ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด transform ๋ฌธ์์ด์ ๋์ด๋ ๋ณํ์ด ์์ฐจ ์ ์ฉ๋ ์ต์ข ํ๋ ฌ M์ ์ป๊ฒ ๋ฉ๋๋ค.
<g>๊ทธ๋ฃน์ ์ํ svg๋ ์์ ์ transform์ ํฌํจํ์ฌ ๋ถ๋ชจ๋ฅผ ๋ฐ๋ผ ์ต์์ svg๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๋ชจ๋ ๋ณํ์ ํฉ์ฑํด์ผ ํฉ๋๋ค.
์ด ํจ์๋ ์์ ์์ฒด -> ๋ถ๋ชจ์ ๋ณํ .. ์์ผ๋ก ๋ชจ๋ ๊ณฑํ ์ ์ฒด ๋ณํ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค.
<use> ์์๋ฅผ ๊ตฌํ ๋, ์๊ธฐ ์์ ์ transform์ ์ ์ฉํ๊ธฐ ์ ์์ ์์์ transform์ ์ ์ฉํด์ผ ํฉ๋๋ค.
์ด ํจ์๋ ์์ ์์ฒด์ ๋ณํ์ ์ ์ธํ๊ณ ๋ถ๋ชจ๋ค์ ๋์ ๋ณํ์ ๊ตฌํ์ฌ ๋ฐํํฉ๋๋ค.
์ค์ ๋ก ๊ทธ๋ ค์ง์ง ์๋ ์์๋ฅผ ์ ์ธํ๋ ํํฐ ํจ์์
๋๋ค.
์๋ฅผ ๋ค์ด, <defs>, display="none"์ ๊ฐ์ ์์๋ ๊ทธ๋ ค์ง์ง ์๋ ์์์ธ๋ฐ, ์ด์ ๊ฐ์ ๊ฒ์ ์ ์ธํฉ๋๋ค.
SVG๋ด์๋ path ์์ ์ธ์๋ <circle>,<rect> ๋ฑ ๋ค์ํ ๊ธฐ๋ณธ ๋ํ์ด ์์ต๋๋ค. ์ด ํจ์์์๋ ๋ชจ๋ ๋ํ์ path ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ๋ํ, ํ๋์ <path>์์์๋ moveTo(M)์ผ๋ก pen์ด 0์ด ๋๋ ๋ถ๋ถ์ด ์๋๋ฐ,๊ทธ path๋ ๊ฐ๊ฐ ๋ฐ๋ก ๋ณํํฉ๋๋ค.
์ฃผ์ด์ง path ๋ฐ์ดํฐ ๋ฌธ์์ด dAttr๋ฅผ ๋ฐ์ ์ฌ๋ฌ ํ์ ๊ฒฝ๋ก๋ก ๋ถ๋ฆฌํ๋ ํจ์์
๋๋ค. splitSubpaths ํจ์๋ ์ ๊ท์์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๋ด์์ M ๋๋ m์ผ๋ก ์์ํ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฐพ์ ๋ถ๋ฆฌ๋ ๋ฌธ์์ด๋ค์ ๋ฐฐ์ด๋ก ๋ฐํํฉ๋๋ค.
์ด๋ ๊ฒ ๋ถ๋ฆฌํจ์ผ๋ก์จ <path> ํ๋์ ์ฌ๋ฌ ๋
๋ฆฝ ๋ํ์ด ๊ทธ๋ ค์ ธ ์๋ ๊ฒฝ์ฐ๋ผ๋ ๊ฐ MoveTo๋ก ์์ํ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ณ ๋ํ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ฉ๋๋ค. ์ดํ ๋จ๊ณ์์ ์ด๋ค์ ๊ฐ๊ฐ ๋ฐ๋ก ์ํ๋งํ๊ณ , ๋ํ ์ฌ์ด๋ฅผ ํ ์
์ผ๋ก ์ด๋ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋๋ค.
์์ path๋ก ๋ณํํ๊ธฐ ์ํด ๋๊ฐ์ ํธ๋ก ํํํฉ๋๋ค. svg path์ A(์ํธ) ๋ช
๋ น์ ์ด์ฉํ์ฌ ๋๊ฐ์ ํธ๋ก ์์ ๊ตฌ์ฑํฉ๋๋ค.
<circle>์์์ cx, cy, r ์์ฑ์ ์ฝ์ด ์ค์ฌ ์ขํ์ ๋ฐ์ง๋ฆ์ ์ป์ต๋๋ค.
์์ ๊ฐ์ฅ ์ผ์ชฝ์ ์์ ์์(M x0,y ํ์, x0 = cx - r)ํ์ฌ ์ฐ์ธก์ผ๋ก ๋ฐ์์ ๊ทธ๋ฆฌ๋ ์ํฌ ๋ช
๋ น A๋ฅผ ์ฌ์ฉํ๊ณ , ๋ค์ ์ข์ธก์ผ๋ก ๋์์ค๋ ๋ ๋ฒ์งธ ์ํฌ ๋ช
๋ น์ ์ถ๊ฐํ์ฌ ๋ซ๋ ์์
๋๋ค. ๋ง์ง๋ง์ Z๋ก ๊ฒฝ๋ก๋ฅผ ๋ซ์ ์์ ํ ์์ ํํํฉ๋๋ค.
์ด ๋ฐฉ์์ผ๋ก ์์ SVG path์ A ๋ช
๋ น์ผ๋ก ํํํ ์ ์์ต๋๋ค.
ํ์์ 4๊ฐ์ ๋ฒ ์ง์ด ๊ณก์ ์ผ๋ก ๊ทผ์ฌํ์ฌ ๊ฒฝ๋ก๋ก ๋ณํํฉ๋๋ค.
๊ตฌํ์์ ์ฌ์ฉ๋ K = 0.5522...๋ ์์ด๋ ํ์์ 4๊ฐ์ ๊ณก์ ์ผ๋ก ๊ทผ์ฌํ ๋ ์ฌ์ฉ๋๋ ์นดํ(kappa) ์์๋ก, ์ด ์์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ ์ง์ด ๊ณก์ ์ ์ค์ ์ด ์ค์ ์์ ๊ฑฐ์ ๊ทผ์ ํ๋๋ก ์ ์ด์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์ด ํจ์๋ ์ฐ์ ์ฃผ์ด์ง rotation ๊ฐ์ ๊ณ ๋ คํด ๋ฏธ๋ฆฌ ํ์ ๋ณํ์ ์ ์ฉํฉ๋๋ค. ์ดํ ํ์์ 4๊ฐ์ ์ฃผ์ ์ ๊ณผ ๋ฒ ์ง์ด ์ ์ด ์ ๋ ํ์ ํ์ฌ ๊ตฌํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, ๊ฒฝ๋ก ๋ฌธ์์ด์ ๊ตฌ์ฑํฉ๋๋ค. M ๋ช ๋ น์ผ๋ก ์์ํ์ฌ left ์ ์ผ๋ก ์ด๋ํ๊ณ , ์ด์ด์ C ํ๋น ๋ฒ ์ง์ด ๋ช ๋ น์ ์ฌ์ฉํ์ฌ top ์ ๊น์ง ๊ณก์ ์ ๊ทธ๋ฆฌ๋๋ก ์ ์ด์ c1, c2๋ฅผ ์ง์ ํฉ๋๋ค. ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐ์๋ 3๊ฐ์ C ๋ช ๋ น์ ์ฌ์ฉํ์ฌ top->right, right->bottom, bottom->left๋ก ์ด์ด์ง๋ ๊ณก์ ๋ค์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ Z๋ก ๋ซ์์ ํ๋์ ์ฐ์๋ ํจ์ค๋ก ํ์์ ๊ทผ์ฌํฉ๋๋ค.
์ฌ๊ฐํ์ rx, ry(๋ชจ์๋ฆฌ ๋ฐ๊ฒฝ)์ ๋ฐ๋ผ ๋๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
๊ณตํต ์ฒ๋ฆฌ x, y, width, height, rx, ry ์์ฑ์ ์ฝ์ต๋๋ค. ์ฌ๊ธฐ์ rx, ry๊ฐ ์์ผ๋ฉด 0์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ํ๋๋ง ์ง์ ๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ ๋์ผํ๊ฒ ๋ง์ถฅ๋๋ค. ๋ํ, rx > width / 2 ์ด๋ฉด width / 2๋ก ์ ํํ๊ณ , ry > height / 2 ์ด๋ฉด height / 2๋ก ์ ํํฉ๋๋ค.
๋ชจ์๋ฆฌ๊ฐ ๋ฅ๊ทผ ์ฌ๊ฐํ(rx > 0 && ry > 0)
rx > 0 ์ด๊ณ ry > 0 ์ธ ๊ฒฝ์ฐ, ๊ฐ ๋ชจ์๋ฆฌ๋ฅผ ํ์ 1/4 ํธ์ ๊ทผ์ฌํ ๋ฒ ์ง์ด ๊ณก์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
์์ 1/4์ ํ๋น
๋ฒ ์ง์ด๋ก ๊ทผ์ฌํ๊ธฐ ์ํด K = 0.5522... ์์(์นดํ ์์)๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ฐ ๋ชจ์๋ฆฌ์ ๋ํด
ox = rx _ K, oy = ry _ K ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
์ง์ (L)๊ณผ ํ๋น
๋ฒ ์ง์ด(C) ๋ช
๋ น์ ์กฐํฉํ์ฌ ๋ค ๋ชจ์๋ฆฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ฐ๊ฒฐํฉ๋๋ค. ์ดํ ๋ค ๋ชจ์๋ฆฌ๋ฅผ ๋ชจ๋ ์ฐ๊ฒฐํ ํ Z ๋ช
๋ น์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ซ์ต๋๋ค.
์ด ๊ฒฐ๊ณผ, ์๋ rect์ ๋ฅ๊ทผ ๋ชจ์๋ฆฌ๋ฅผ rx, ry ๋ฐ์ง๋ฆ์ ํ์ ํธ์ ๊ทผ์ ํ path๋ก ๋ณํํฉ๋๋ค.
๋ชจ์๋ฆฌ๊ฐ ์ง๊ฐ์ธ ์ฌ๊ฐํ(rx <=1e-9 && ry <=1e-9) M x,y๋ก ์์ํ ๋ค, ์๊ณ ๋ฐฉํฅ์ผ๋ก ๋ค ๊ฐ์ L ๋ช ๋ น์ ์ฌ์ฉํด ๊ผญ์ง์ ์ ์ฐ๊ฒฐํฉ๋๋ค. ๋ง์ง๋ง์ Z ๋ช ๋ น์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๋ซ์ ๋จ์ ์ฌ๊ฐํ path๋ฅผ ์์ฑํฉ๋๋ค.
<line> ์์๋ ์์์ (x1, y1)๊ณผ ๋์ (x2, y2)์ ๊ฐ์ง๋ ๋จ์ ์ ๋ถ์
๋๋ค.
M x1,y1 โ L x2,y2 ํํ์ path๋ก ๋ณํํฉ๋๋ค.
<polygon>, <polyline> ์์์ points ์์ฑ์ ํ์ฑํ์ฌ ์ขํ ๋ฐฐ์ด์ ์ป์ต๋๋ค.
์ฒซ๋ฒ์งธ ์ ์ M ๋ช
๋ น์ผ๋ก ์ค์ ํ๋ฉฐ, ์ดํ ๊ฐ ์ ๋ง๋ค L ๋ช
๋ น์ ์ถ๊ฐํ์ฌ ์ง์ ์ ๊ทธ๋ฆฝ๋๋ค.
๋ง์ง๋ง์ close๊ฐ true์ด๋ฉด(<polygon>์ ๊ฒฝ์ฐ) Z๋ฅผ ๋ถ์ฌ ๋ซ๊ณ , false ์ด๋ฉด(<polyline>์ ๊ฒฝ์ฐ) ์ด๋ฆฐ ์ฑ๋ก ๋ก๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก polygon / polyline๋ path ๋ฐ์ดํฐ๋ก ๋ณํ๋ฉ๋๋ค.
์์ ๊ฐ ๋ํ ๋ณํ ํจ์๋ฅผ ํตํด SVG ๊ธฐ๋ณธ ๋ํ ์์๋ค์ด ๋ชจ๋ ๊ฒฝ๋ก ๋ฌธ์์ด(path)๋ก ๋ณํ๋ฉ๋๋ค. ์ด ๋, ์๋ณธ์ด path์ธ ๊ฒฝ์ฐ์๋ splitSubpathsํจ์๋ฅผ ํตํด ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋์ด ์ง ์ ์์ต๋๋ค.(path ์์ M์ด ๋๋ฒ ์ด์ ์๋ ๊ฒฝ์ฐ.)
<use> ์์ ์ฒ๋ฆฌ
svg์์๋ <use xlink:href="#id">์ ๊ฐ์ ํํ๋ก ์ฌ์ ์ ์ ์๋ ๋ํ์ ๋ณต์ฌํ์ฌ ์ธ ์ ์์ต๋๋ค.
<use>๋ xlink:href ๋๋ ์ต๊ทผ href ์์ฑ์ผ๋ก ์ฐธ์กฐ ๋์์ id๋ฅผ ๊ฐ๋ฆฌํค๋ฉฐ x, y ๋ฑ์ ์์ฑ์ผ๋ก ์์น๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ์์ฒด์ ์ผ๋ก transform์ ๊ฐ์ง ์๋ ์์ต๋๋ค.
extractPathPointsFromSvg() ํจ์์์ resolveUseElement(useEl)๊ฐ ๊ทธ ์ฒ๋ฆฌ์ ๋ด๋นํฉ๋๋.
์ด ํจ์๋ <use> ์์์ ์๋ณธ ๋ํ + ์ฌ๋ฌ ๋จ๊ณ์ ๋ณํ์ ๋ชจ๋ ํด์ํด ํ๋์ ์ค์ ๋ํ์ผ๋ก ๋ณํํ ๋ค ๋ ๋๋ง ๋์์ ํฌํจ์ํค๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
<use>์ href ์์ฑ์์ ์ฐธ์กฐ ๋์ ์ถ์ถ : <use> ์์์ href ๋๋ xlink:href ๊ฐ์ ์ฝ์ด #id ํํ์ ์ฐธ์กฐ ๋์ id๋ฅผ ์ถ์ถํ๊ณ , svgRoot.querySelector('#id')๋ก ์๋ณธ ๊ทธ๋ํฝ ์์๋ฅผ ์ฐพ์ต๋๋ค.
์๋ณธ ์์ ์กด์ฌ ํ์ธ : ๋ง์ฝ ์ฐธ์กฐ๋ id์ ํด๋น ์๋ณธ ์์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด, ๊ฑด๋๋๋๋ค.
<use>์์์ x, y ์์ฑ์ ํํ์ด๋ ํ๋ ฌ๋ก ๋ณํ : <use> ์์์ x,y ์์ฑ์ ์ฝ์ด (x,y)๋ก ์ด๋์ํค๋ ํํ์ด๋ ํ๋ ฌ T๋ก ๋ณํํฉ๋๋ค.
๋ณํ ํ๋ ฌ ์์ง : <use>๋ก ์ธํด ์ ์ฉ๋๋ ๋ชจ๋ ๋ณํ์ ๋ค์ ๋ค๊ฐ์ง ์ข
๋ฅ๋ก ๋ถ๋ฆฌํ์ฌ ์์งํฉ๋๋ค.
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| ๋ถ๋ชจ ๊ทธ๋ฃน ๋ณํ |
<use> ์์์ ์์ <g> ์์๋ค์ ์ ์ฉ๋ transform์ ๋์ ํ ๋ณํ ํ๋ ฌ |
<use> ์์ฒด ๋ณํ |
<use> ์์์ ์ง์ ์ง์ ๋ transform ์์ฑ์ผ๋ก๋ถํฐ ์์ฑ๋ ๋ณํ ํ๋ ฌ |
<use> ์์น ์ด๋ |
<use> ์์์ x, y ์์ฑ์ผ๋ก๋ถํฐ ์์ฑ๋ ํํ์ด๋(translate) ํ๋ ฌ |
| ์๋ณธ ์์ ๋ณํ |
<use>๊ฐ ์ฐธ์กฐํ๋ ์๋ณธ ๊ทธ๋ํฝ ์์(ref)์ ์ ์ฉ๋ transform ์์ฑ์ผ๋ก๋ถํฐ ์์ฑ๋ ๋ณํ ํ๋ ฌ |
์ต์ข
๋ณํ ํ๋ ฌ ํฉ์ฑ : ์์ง๋ ๋ณํ ํ๋ ฌ์ ๋ถ๋ชจ -> <use> ์์ฒด ๋ณํ -> <use> ์์น ์ด๋ -> ์๋ณธ ์์ ๋ณํ ์์ผ๋ก ์ ์ฉํ์ฌ ํ๋์ ํ๋ ฌ๋ก ํฉ์ฑํฉ๋๋ค.
<use> ํด์ ๊ฒฐ๊ณผ ๊ฐ์ฒด ์์ฑ : ํด์๋ <use> ์์์ ๋ํด ๋ค์ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐํ๊ฐ์ผ๋ก๋ { element: ref, transform: M, tagName: ref.tagName.toLowerCase() } ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฆฌํดํฉ๋๋ค.
์์ฝํ๋ฉด, <use> ์์๋ ๋ด๋ถ์์ ์ฐธ์กฐ๋ ๋ํ์ ์ฐพ์ ๋ณต์ ํ ๋ค ์์น/๋ณํ์ ์ ์ฉํด์ฃผ๋ ํํ๋ก ๋ค๋ฃจ๋ฉฐ, ๊ทธ๋ ๊ฒ ๋ณํ๋ ๋ํ์ ์ค์ <path>๋ <circle> ๋ฑ๊ณผ ๋์ผํ๊ฒ ์ดํ ๊ณผ์ (๊ฒฝ๋ก ๋ณํ, ์ํ๋ง ๋ฑ)์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
SVG ๋ด๋ถ์ ๊ฐ ๋ํ ์์๋ค์ ์์งํ๊ณ , ๊ฐ ์์ ๋ณ๋ก ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ค๋นํฉ๋๋ค. ์ด ๋, ํฌ๊ฒ ๋๊ฐ์ง ์์๋ฅผ ๋ค๋ฃจ๋๋ฐ, ์ง์ ์ ์ธ ๊ทธ๋ํฝ ์์(path์ ๊ธฐ๋ณธ ๋ํ)์ <use>์ฐธ๊ณ ์์ ์
๋๋ค.
๊ธฐ๋ณธ ๊ทธ๋ํฝ ์์ ์ฒ๋ฆฌ
svgRoot.querySelectorAll("path, circle, rect, ellipse, line, polygon, polyline")๋ฅผ ์ด์ฉํ์ฌ svg ๋ด ๋ชจ๋ ๊ธฐ๋ณธ ๊ทธ๋ํฝ ์์๋ฅผ ์ ํํฉ๋๋ค.
์ด ๋, shouldRender(el)๋ฅผ ํตํด ๋ ๋๋ง ๋์์ธ์ง ํ์ธํ๊ณ , ๋ง๋ค๋ฉด allElements ๋ฐฐ์ด์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋, ์ถ๊ฐ ์์ ์์์ ์ ๋ณด๋ ๊ฐ์ด ์ ์ฅํฉ๋๋ค.
allElements.push({
element: el, // ์์
transform: getAccumulatedTransformInclusive(el), // ๋์ ๋ณํ ํ๋ ฌ
tagName: el.tagName.toLowerCase(), // ํ๊ทธ ๋ช
});<use> ์์ ์ถ๊ฐ : svgRoot.querySelectorAll("use")๋ฅผ ํตํด ๋ชจ๋ <use>์์๋ฅผ ์ํํ๋ฉฐ
shouldRender๋ก ํ์ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ ๋ค, ํ์ ๋์์ด๋ฉด ์์์ ์ค๋ช
ํ resolveUseElement(useEl)๋ฅผ ํธ์ถํฉ๋๋ค. resolveUseElement๊ฐ ์ ํจํ ๊ฐ์ฒด(์ฐธ์กฐ ์ฑ๊ณต)๋ฅผ ๋ฐํํ๋ฉด, ์ด๋ฅผ allElements์ ์ถ๊ฐํฉ๋๋ค.
์ด ๊ณผ์ ๋ค์ ๊ฑฐ์น๋ฉด allElements ๋ฐฐ์ด์๋ SVG์ ์ค์ ๊ทธ๋ ค์ง ๋ชจ๋ ๋ํ ์์๋ค์ด ์ถ๊ฐ๋๊ฒ ๋ฉ๋๋ค.
๋ํ๋ณ๋ก ์ป์ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๊ณ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋จ๊ณ์ ๋๋ค. allElements ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํฉ๋๋ค.
๊ฐ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ์ด์ ๋, ์ ์ํ๋ง ๊ฐ๊ฒฉ์ ๊ฒฐ์ ํ๊ณ ์ต์ ํ ํ๊ธฐ ์ํด์์ ๋๋ค.
๊ฐ์ฒด ๊ฐ ๊บผ๋ด๊ธฐ ๋ฐ ๋ฐฐ์ด ์ด๊ฐํ : ๊ฐ์ฒด์์ element, tagName, transform์ ๊บผ๋ ๋๋ค. ์ดํ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด์ dList ๋ฐฐ์ด๋ ์ด๊ธฐํํฉ๋๋ค. ๋ํ, ์ต์ข ๊ฒฝ๋ก ๊ฐ์ฒด๋ฅผ ๋ด์ prepared ๋ฐฐ์ด๋ ์ด๊ธฐํํฉ๋๋ค.
์ดํ ์์์ ์ข
๋ฅ๋ณ๋ก ๋ถ๊ธฐํ์ฌ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ป์ต๋๋ค.
์์ ๋ณ ๋ถ๊ธฐ :
path ์ผ ๊ฒฝ์ฐ : ์ด๋ฏธ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์์๋ก, ๋ฌธ์์ด์ ๊ฐ์ ธ ์จ ๋ค, splitSubpaths()๋ฅผ ํธ์ถํ์ฌ ํ์ ์์ ์ฌ๋ฌ ํ์ ๊ฒฝ๋ก๋ก ๋ถํ ํฉ๋๋ค. splitSubpaths()์ ๊ฒฐ๊ณผ๋ฅผ dList ๋ฐฐ์ด์ ๋ด์ต๋๋ค.
circle์ธ ๊ฒฝ์ฐ : circleToPathLocal(cx, cy, r)์ ํธ์ถํ์ฌ ๊ฒฝ๋ก ๋ฌธ์์ด์ ์์ฑํ๊ณ , ์ด๋ฅผ dList์ ์ถ๊ฐํฉ๋๋ค.
ellipse์ธ ๊ฒฝ์ฐ : ellipseToPathLocal(cx, cy, rx, ry, rotation)์ ํธ์ถํฉ๋๋ค. ์ฌ๊ธฐ์ rotation ๊ฐ๋๋ ํน๋ณํ ๊ณ์ฐํ๋๋ฐ, transformMatrix๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ํ๋ ฌ๋ก๋ถํฐ ํ์ ์ฑ๋ถ์ ์ถ์ถํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ฝ๋์์๋ ํ๋ ฌ m์ a,b ๊ฐ์ ์ด์ฉํด rotation = atan2(m.b, m.a) * (180/Math.PI)๋ก ๊ฐ๋๋ฅผ ์ป๋๋ฐ, ์ด๋ ํ๋ ฌ์ ๋ณํ์ด ์์ ํ์ /์ค์ผ์ผ ์กฐํฉ์ผ ๋ ๊ทธ ํ์ ๊ฐ๋๋ฅผ ๊ทผ์ฌํฉ๋๋ค.
rect์ธ ๊ฒฝ์ฐ : rectToPathLocal(x, y, width, height, rx, ry) ํธ์ถ ๊ฒฐ๊ณผ ๊ฒฝ๋ก ๋ฌธ์์ด์ dList์ ์ถ๊ฐํฉ๋๋ค.
line์ธ ๊ฒฝ์ฐ : lineToPathLocal(x1, y1, x2, y2) ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ๋ฃ์ต๋๋ค.
polygon / polyline ์ธ ๊ฒฝ์ฐ : polyToPathLocal(points, true) / polyToPathLocal(points, false) ํธ์ถํ์ฌ ๊ฒฝ๋ก ๋ฌธ์์ด์ dList์ ์ถ๊ฐํฉ๋๋ค.
์ด๋ ๊ฒ ํด์ dList์ ํ ์์๋ก๋ถํฐ ์ ๋๋ ํ๋ ์ด์์ d ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๋๋ค.
๊ฒฝ๋ก ๊ธธ์ด ์ธก์ : dList๋ฅผ ์ํํ๋ฉฐ ํ๋์ ์์ <path> ์์ pathEl๋ฅผ ์์ฑํ๊ณ pathEl.setAttribute("d", dAttr);๋ก ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ค์ ํฉ๋๋ค.
๋ง์ฝ ํด๋น ์์์ transformMatrix๊ฐ ์๋ค๋ฉด ์ ์ฉํฉ๋๋ค. ์ดํ pathEl.getTotalLength()๋ฅผ ํตํด ์ ์ฒด ๊ธธ์ด๋ฅผ ๊ตฌํฉ๋๋ค. ๊ธธ์ด๋ฅผ ์ป์๋ค๋ฉด pathEl.getTotalLength()๋ก ์์ path๋ฅผ ์ ๊ฑฐํ๊ณ , prepared ๋ฆฌ์คํธ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํฉ๋๋ค.
prepared.push({ dAttr, transformMatrix, length: L });
์ด์ prepared์ ๊ฒฝ๋ก ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ๋ชจ์ด๊ฒ ๋๊ณ , ์ด ์ ๋ณด์ ๊ธฐ๋ฐํ์ฌ ์ ์ํ๋ง์ ์ํํฉ๋๋ค.
prepared์ ๋ด๊ธด ๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ ์ ์ฐ์ด points ๋ฐฐ์ด์ ๋์ ํฉ๋๋ค. ์ํ๋ง ๋จ์๋ opts์ ๊ฒฝ๋ก์ ๊ธธ์ด์ ์ํด ๊ฒฐ์ ๋๊ณ , ๊ฐ ๋ํ์ bridge ๋ถ๋ถ๋ ํจ๊ป ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ํ๋ง ๋ฃจํ ์์ : prepared ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๊ฐ ํญ๋ชฉ(item)์ ๋ํด ์ฒ๋ฆฌํฉ๋๋ค. ์ฐ์ ์์ <path>์์ pathEl๋ฅผ ์์ฑํ๊ณ dAttr๋ฅผ ์ค์ ํฉ๋๋ค. ์ดํ ์์ svg์ ๋ํด transformMatrix๊ฐ ์๋ค๋ฉด ์ ์ฉํฉ๋๋ค. ์ดํ tempSvg.appendChild(pathEl);๋ก ์์ SVG DOM์ ์ถ๊ฐํฉ๋๋ค.
์ํ๋ง ๊ฐ๊ฒฉ ์ค์ : ์ต์ ์ผ๋ก sampleStep์ด ์ฃผ์ด์ก๋ค๋ฉด, step = sampleStep์ผ๋ก ์ค์ ํฉ๋๋ค. sampleStep์ด ์๋ค๋ฉด, ์ด ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ samplePerPath๋ก ๋๋ ๊ฐ์ผ๋ก step์ ์ ํฉ๋๋ค. ์ด ๋, ์ด๋ ๊ฒ ๊ณ์ฐํ step์ด maxStepClamp๋ณด๋ค ํฐ ๊ฒฝ์ฐ, step = maxStepClamp๋ก ์ํ์ ์ ํํฉ๋๋ค.(๋๋ฌด ๊ฐ๊ฒฉ์ด ์ปค์ง๋ ๊ฒ์ ๋ฐฉ์ง)
์ต๋ ์ ์ ์ ํ : ๊ฒฝ๋ก๊ฐ ๋งค์ฐ ๊ธธ์ด์ step ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ผ๋ฉด ์ ๊ฐ์๊ฐ maxSamplePerPath๋ฅผ ์ด๊ณผํ ๊ฒฝ์ฐ, ๊ฐ๊ฒฉ์ ์กฐ๊ธ ๋๋ ค ์ ๊ฐ์๋ฅผ ์ ํํฉ๋๋ค. ์ด ๊ณผ์ ์ผ๋ก ์ต์ข step์ด ๊ฒฐ์ ๋ฉ๋๋ค.
๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ ์ฐ๊ธฐ : ์ด์ ๋ฃจํ๋ฅผ ๋๋ฉฐ, ๊ฒฝ๋ก๋ฅผ ์์๋ถํฐ ๋๊น์ง step ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ๋ผ๊ฐ๋ฉด์ ์ขํ๋ฅผ ์ํ๋งํฉ๋๋ค.
len์ step์ ๋ํด๊ฐ๋ฉด์ ๋ฃจํ๊ฐ ์งํ๋๋ฉฐ, pathEl.getPointAtLength(len)๋ฅผ ํตํด len ๊ฑฐ๋ฆฌ๋งํผ ๋จ์ด์ง ์ง์ ์ ์ขํ๋ฅผ ๊ฐ์ฒด๋ก ๋ฐํํ๊ณ , isFirst๊ฐ true์ผ์, pen์ 0, ์๋ ์ pen์ 1๋ก ์ฒ๋ฆฌํ์ฌ localPoints์ ์ ์ฅํฉ๋๋ค.์ดํ isFirst๋ฅผ false๋ก ๋ณ๊ฒฝํฉ๋๋ค(์ด๋ก์จ, path ์ฒซ ์ ์ดํ๋ ๋ชจ๋ pen 1๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.)
๋ํ, ๋ฃจํ ์ข ๋ฃ ํ, ๋ณ๋๋ก pathEl.getPointAtLength(totalLength)๋ฅผ ํธ์ถํ์ฌ ๊ฒฝ๋ก์ ๋ง์ง๋ง ์ ์ ์ป๊ณ , ์ด๋ฅผ localPoints์ ์ถ๊ฐํฉ๋๋ค.
์์ path ์ ๊ฑฐ : ์ฌ์ฉ์ด ๋๋ pathEl์ ๋ค์ tempSvg.removeChild(pathEl)๋ก ์ ๊ฑฐํฉ๋๋ค. ์ด๋ ๊ฒฝ๋ก ๊ฒน์นจ ๋ฌธ์ ๋ฅผ ํผํ๊ณ , ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ์ค์ด๊ธฐ ์ํด์ ์ ๋๋ค.
๋ํ ๊ฐ bridge ์ถ๊ฐ : ํ ๋ํ์ ์ ์ points์ ์ถ๊ฐํ๊ธฐ ์ ์, ๋ง์ฝ ์ด์ ๋ํ์ ๋ง์ง๋ง ์์น๊ฐ ์์ ๊ฒฝ์ฐ(lastGlobalPt๊ฐ null์ด ์๋ ๊ฒฝ์ฐ), ๊ทธ ์ ์์ ํ์ฌ ์ ๊ฒฝ๋ก์ ์ฒซ ์ ๊น์ง ํ์ ๋ค์ด ์ด๋ํ๋ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐ๋ก ์ํ๋งํฉ๋๋ค. bridge ์ํ๋ง ๋ฐ๋๋ ๊ธฐ๋ณธ step์ opts.bridgeScale๋ฅผ ๊ณฑํด ์กฐ์ ํฉ๋๋ค. ์์ : bridgeStep = step * bridgeScale bridge ๊ตฌ๊ฐ์ ํ์ ๋ ์ด๋์ด๋ฏ๋ก, pen์ 0์ผ๋ก ๊ธฐ๋กํฉ๋๋ค.
์ ๋์ ๋ฐ lastGlobalPt ๊ฐฑ์ : ์ด์ ๋ธ๋ฆฌ์ง ์ (๋ง์ฝ ์๋ค๋ฉด)์ด points์ ์ถ๊ฐ๋ ์ํ์์, ํ์ฌ ๋ํ์ ์ค์ ๊ฒฝ๋ก ์ ๋ค(localPoints ๋ฐฐ์ด)์ ์์๋๋ก points ๋ฐฐ์ด์ ์ด์ด๋ถ์ ๋๋ค. ์ดํ lastGlobalPt๋ฅผ localPoints์ ๋ง์ง๋ง ์ ์ผ๋ก ์ ๋ฐ์ดํธ ํฉ๋๋ค. ๋ชจ๋ prepared ํญ๋ชฉ์ ๋ํด ์ ๊ณผ์ ์ ๋ง์น๋ฉด, points ๋ฐฐ์ด์๋ SVG์ ๋ชจ๋ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์์ฑ๋ ์ ์ด ์์๋๋ก ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก tempSvg (์์๋ก ๋ง๋ค์๋ ๋ณด์กฐ SVG ์์)๋ฅผ document.body.removeChild(tempSvg)๋ก ์ ๊ฑฐํ์ฌ, ํ๋ฉด์ ๋ณด์ด์ง ์๊ฒ ์์ฑํ๋ ์์๋ฅผ ์ ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ points ๋ฐฐ์ด์ returnํ์ฌ ํจ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ ๋๋ค.
์ด ํจ์์ ๋ฐํ๊ฐ points๋ ๋ค์๊ณผ ๊ฐ์ javascript ๋ฐฐ์ด์ ๋๋ค.
[
{ x: Number, y: Number, pen: Number },
{ x: Number, y: Number, pen: Number },
...
]์ด ๊ฒฐ๊ณผ๋ฅผ ํตํด, ์ขํ -> ๋ก๋ด์ step ์ฆ๋ถ๊ฐ ์ผ๋ก ๋ฐ๊พธ๋ ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์ฒ, ๋ก๋ด์ด ์ด์ฉ ๊ฐ๋ฅํ ๋ช ๋ น์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋ฉ๋๋ค.
- โ๏ธ HW Specification
- ๐งฉ Parsing
- ๐ฃ๏ธ Plotto Path
- ๐ Terminology
- ๐ฅ๏ธ Dashboard UI
- ๐ค Ideas