-
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
// d ์์ฑ ๋ฌธ์์ด ์์: "์ด๋(M) โ ์ง์ (L) โ ๋ซ๊ธฐ(Z)"-
๊ธฐ๋ณธ ๊ตฌ์กฐ SVG
<path>ํ๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ต๋๋ค.-
d์์ฑ ๋ด๋ถ๊ฐ ๊ณง path ๋ฐ์ดํฐ - path ๋ฌธ์์ด์ ๋ช ๋ น์ด + ์ซ์ ์ขํ์ ๋ฐ๋ณต์ผ๋ก ๊ตฌ์ฑ ์์
<path d="M 100 100 L 200 100 L 200 200 Z" />- ์ฃผ์ PATH ๋ช
๋ น์ด
๋ช ๋ น์ด ์๋ฏธ ์ขํ ๊ฐ์ ์์ MMove to (์ด๋) 2 M 100 100LLine to (์ง์ ) 2 L 200 100HHorizontal line 1 H 250VVertical line 1 V 250CCubic Bezier curve 6 C 200 200 300 300 400 400QQuadratic Bezier curve 4 Q 150 150 200 200SCubic ๊ณก์ ์ฐ์ํ (์ด์ ์ ์ด์ ๋ฐ์ฌ) 4 S 300 300 400 400TQuadratic ๊ณก์ ์ฐ์ํ (์ด์ ์ ์ด์ ๋ฐ์ฌ) 2 T 200 200AArc (์ํธ) 7 A 50 50 0 0 1 200 200ZClose path (๋ซ๊ธฐ) 0 Z - ๋๋ฌธ์ ๋ช ๋ น์ด๋ ์ ๋์ขํ(absolute), ์๋ฌธ์๋ ์๋์ขํ(relative)๋ฅผ ์๋ฏธํฉ๋๋ค.
์:
l 10 0โ ํ์ฌ ์์น ๊ธฐ์ค์ผ๋ก ์ค๋ฅธ์ชฝ์ผ๋ก 10 ์ด๋ -
-
ํ์ฑ ์๋ฆฌ (๊ฐ๋ )
d๋ฌธ์์ด์ ์ขํ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๊พธ๋ ๊ธฐ๋ณธ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.-
d๋ฌธ์์ด์ ํ ํฐํ(tokenize)- ๋ช ๋ น์ด ๋ฌธ์(M/L/C/..) ์ ์ซ์๋ฅผ ๋ถ๋ฆฌ
- ๋ช ๋ น์ด๋ฅผ ๋ง๋๋ฉด, ๊ทธ ๋ช ๋ น์ด๊ฐ ์๊ตฌํ๋ ์ขํ ๊ฐฏ์๋งํผ ์ซ์๋ฅผ ์ฝ์
- ์ธ๊ทธ๋จผํธ๋ฅผ ๊ตฌ์กฐํํ์ฌ ์ ์ฅ
์:
{ cmd: 'L', args: [200, 100] } - ๋ค์ ๋ช ๋ น์ด๋ก ๋์ด๊ฐ๋ฉด์ ๋ฐ๋ณต
-
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 ๋ช ๋ น์ด ์์ ๊ฒฝ์ฐ ๋ถ๋ฆฌํฉ๋๋ค.
- ์์งํ ๊ฐ ๋ํ์ SVG
-
๊ฒฝ๋ก ์ํ๋ง
- ๊ฐ ๊ฒฝ๋ก์ ๋ํด ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉฐ
getPointAtLength๋ฅผ ์ด์ฉํด ์ขํ๋ฅผ ์ํ๋งํฉ๋๋ค. ์ฒซ ์ ์ ํ์ ๋ค์ด์ ์ด๋(pen = 0)ํ๋ฉฐ, ์ํ ์ ์ ํ์ ๋๊ณ ๊ทธ๋ฆฌ๋(pen = 1)์ํ๋ก ์ํ๋งํ์ฌlocalPoints๋ฆฌ์คํธ๋ฅผ ์ป์ต๋๋ค.
- ๊ฐ ๊ฒฝ๋ก์ ๋ํด ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉฐ
-
path ์ฌ์ด ๋ณด๊ฐ
- ์ด์ ๊ฒฝ๋ก์ ๋ง์ง๋ง ์ ๊ณผ ๋ค์ ๊ฒฝ๋ก ์ฒซ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ์๋ค๋ฉด, ํ์ ๋ ์ํ๋ก ํด๋น ๊ฐ๊ฒฉ์ ์ด๋ํ๋ ์ค๊ฐ ์ ์ ์ฝ์ ํฉ๋๋ค.
-
ํฌ์ธํธ ๋ฐํ
- ๋ชจ๋ ๊ฒฝ๋ก ์กฐ๊ฐ๋ค์ ๋ํด ์ํ๋ง์ด ๋๋๋ฉด, ์ด๋ค์ ์์๋๋ก
points๋ฐฐ์ด์ ์ด์ด๋ถ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋กpoints์๋ SVG์ ๋ชจ๋ ๋ํ์ ์ํํ๋ ์ขํ ์ ๋ค์ด ์ฐจ๋ก๋๋ก ๋ด๊ธฐ๋ฉฐ, ๊ฐ ์ ์ ํ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ธ์ ์ ์ ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ด๋ํ๋์ง ๊ตฌ๋ถ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ด points ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
- ๋ชจ๋ ๊ฒฝ๋ก ์กฐ๊ฐ๋ค์ ๋ํด ์ํ๋ง์ด ๋๋๋ฉด, ์ด๋ค์ ์์๋๋ก
-
SVG ํ์ฑ ๋ฐ ์ค๋น
-
์คํ ๋์
-
SVG ํ์ฑ ๋ฐ ์ด๊ธฐ ์ค์
DOM ๊ฐ์ฒด ์์ฑ
- ํจ์๋ ์ฃผ์ด์ง SVG ํ ์คํธ๋ฅผ ํ์ฑํ์ฌ DOM ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด ๋, DOM ํ์๋ฅผ์ด์ฉํ์ฌ ์ค์ SVG DOM ๊ฐ์ฒด๋ก(doc)๋ณํํฉ๋๋ค.
-
์์ SVG ์๋ฆฌ๋จผํธ ์์ฑ
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ SVG ๊ฒฝ๋ก ๊ธธ์ด ๋ฐ ์ขํ ๊ณ์ฐ API๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์์
<svg>์์๋ฅผ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ์ด์ ๋, SVG DOM์getTotalLength()๋ฐgetPointAtLength()๋ฉ์๋๋ SVG ์์๊ฐ DOM์ ์์ด์ผ ์ ์ ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ SVG ๊ฒฝ๋ก ๊ธธ์ด ๋ฐ ์ขํ ๊ณ์ฐ API๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์์
-
๋ณ์ ์ด๊ธฐํ
- ์ต์ข
์ผ๋ก ๋ฐํํ ๋ฐฐ์ด์ธ
points๋ฅผ ์ด๊ธฐํํฉ๋๋ค.(point์๋{x, y, pen}๊ฐ์ฒด๊ฐ ์์๋๋ก ์์ ๋๋ค.) ๋ํ, ์ด์ ๋ํ์ ๋ง์ง๋ง์ ์ ์ฅํ๋lastGlobalPt๋ ์ด๊ธฐํํฉ๋๋ค.(์ฒซ ๋ํ ํ์ ๊ฐ์ ์ฑ์๋๋ค.) - ์ด ๊ฐ์ path ๊ฐ ์ด๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ต์ข
์ผ๋ก ๋ฐํํ ๋ฐฐ์ด์ธ
-
-
๋ณํ ํ๋ ฌ ์ ํธ๋ฆฌํฐ
SVG ์์๋ค์ transfrom ์์ฑ์ ํตํด ํํ์ด๋, ํ์ , ์ค์ผ์ผ, ๊ธฐ์ธ์ด๊ธฐ(skew)๋ฑ์ ๋ณํ์ ๊ฐ์ง๋ฉฐ,
<g>๊ทธ๋ฃน์ ์ด์ฉํด์ ์์ ๊ทธ๋ฃน๋ค์ ๋ณํ์ด ๋์ ์ ์ฉ ๋ ์ ์์ต๋๋ค. spine ์ฝ๋์์ ์ด๋ฌํ ๋ณํ์ ์ ์ฉํ๊ธฐ ์ํด ๋ณํ affine ํ๋ ฌ์ ์ด์ฉํด์ ์ขํ๊ณ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ฉฐ, ์ด ํ๋ ฌ ์ ํธ๋ฆฌํฐ ํจ์์ ๋ํด ์๊ฐํ๊ณ ์ ํฉ๋๋ค.-
I()
- ํญ๋ฑ ํ๋ ฌ{a:1, b:0, c:0, d:1, e:0, f:0}์ ๋ฐํํฉ๋๋ค(a=1, d=1์ด๊ณ ๋๋จธ์ง 0์ธ ๋จ์ํ๋ ฌ)
-
T(tx, ty)
- ์ด๋ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. x๋ฐฉํฅ tx, y ๋ฐฉํฅ ty๋งํผ ํํ์ด๋ ์ํค๋ ํ๋ ฌ์ ๋๋ค.
-
S(sx, sy)
- ์ค์ผ์ผ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. x์ถ ๋ฐฉํฅ sx๋ฐฐ y์ถ ๋ฐฉํฅ sy๋ฐฐ ํ๋/์ถ์ ํฉ๋๋ค.
-
R(deg)
- ํ์ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ๊ฐ๋ ๋งํผ ์์ ์ ์ค์ฌ์ผ๋ก ํ์ ํ๋ ํ๋ ฌ์ ๋๋ค.
-
KX(deg)
- X์ถ ๊ธฐ์ค ๊ธฐ์ธ์ด๊ธฐ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ๊ฐ๋ ๋งํผ x์ถ ๋ฐฉํฅ์ผ๋ก ๊ธฐ์ธ์ด๋ ๋ณํ์ ๋๋ค.
-
KY(deg)
- Y์ถ ๊ธฐ์ค ๊ธฐ์ธ์ด๊ธฐ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค. ์ฃผ์ด์ง ๊ฐ๋ ๋งํผ y์ถ ๋ฐฉํฅ์ผ๋ก ๊ธฐ์ธ์ด๋ ๋ณํ์ ๋๋ค.
-
multiplyMatrices(m1, m2)
- ๋๊ฐ์ ํ๋ ฌ m1,m2๋ฅผ ๋ฐ์ ์์๋๋ก ํฉ์ฑํ ๊ฒฐ๊ณผ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค.
-
parseTransform(transformStr)
- "translate(...)", "rotate(...)"์ ๊ฐ์ SVG transform ์์ฑ ๋ฌธ์์ด์ ์ฝ์ด๋ค์ด๊ณ , ๊ทธ ๋ณํ๋ค์ ํฉ์ฑ ๊ฒฐ๊ณผ๋ฅผ ํ๋์ ํ๋ ฌ๋ก ๋ณํํ๋ ํจ์์ ๋๋ค.
์๋ฅผ ๋ค์ด, transform="translate(10, 5) rotate(30)"์ ๊ฐ์ ๋ฌธ์์ด์ ํ์ฑํ์ฌ ํ๋์ ํ๋ ฌ ๊ฐ์ฒด๋ก ๋ฐํํฉ๋๋ค.
- ์ ๊ท์์ผ๋ก "์ด๋ฆ" ํจํด์ ์ฐพ์์ ๊ฐ ๋ณํ๋ช ๋ น์ ์์๋๋ก ํด์ํ๋ฉฐ, ์์ ์ ์ํ ํ๋ ฌ ํจ์๋ค์ ์ด์ฉํฉ๋๋ค.
- ๊ฐ ๋ณํ ํ๋ ฌ m์ ์ด์ ๊น์ง์ ๋์ ํ๋ ฌ M์ ๊ณฑ์ ํ๋ฉฐ ํฉ์ฑํด ๋๊ฐ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด transform ๋ฌธ์์ด์ ๋์ด๋ ๋ณํ์ด ์์ฐจ ์ ์ฉ๋ ์ต์ข ํ๋ ฌ M์ ์ป๊ฒ ๋ฉ๋๋ค.
-
getAccumulatedTransformInclusive(el)
-
<g>๊ทธ๋ฃน์ ์ํ svg๋ ์์ ์ transform์ ํฌํจํ์ฌ ๋ถ๋ชจ๋ฅผ ๋ฐ๋ผ ์ต์์ svg๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ๋ชจ๋ ๋ณํ์ ํฉ์ฑํด์ผ ํฉ๋๋ค.
์ด ํจ์๋ ์์ ์์ฒด -> ๋ถ๋ชจ์ ๋ณํ .. ์์ผ๋ก ๋ชจ๋ ๊ณฑํ ์ ์ฒด ๋ณํ ํ๋ ฌ์ ๋ฐํํฉ๋๋ค.
-
-
getAccumulatedTransformParentsOnly(el)
-
<use>์์๋ฅผ ๊ตฌํ ๋, ์๊ธฐ ์์ ์ transform์ ์ ์ฉํ๊ธฐ ์ ์์ ์์์ transform์ ์ ์ฉํด์ผ ํฉ๋๋ค.
์ด ํจ์๋ ์์ ์์ฒด์ ๋ณํ์ ์ ์ธํ๊ณ ๋ถ๋ชจ๋ค์ ๋์ ๋ณํ์ ๊ตฌํ์ฌ ๋ฐํํฉ๋๋ค.
-
-
shouldRender(el)
- ์ค์ ๋ก ๊ทธ๋ ค์ง์ง ์๋ ์์๋ฅผ ์ ์ธํ๋ ํํฐ ํจ์์
๋๋ค.
์๋ฅผ ๋ค์ด,
<defs>, display="none"์ ๊ฐ์ ์์๋ ๊ทธ๋ ค์ง์ง ์๋ ์์์ธ๋ฐ, ์ด์ ๊ฐ์ ๊ฒ์ ์ ์ธํฉ๋๋ค. - ์ค์ ๋ก ๊ทธ๋ ค์ง์ง ์๋ ์์๋ฅผ ์ ์ธํ๋ ํํฐ ํจ์์
๋๋ค.
-
-
๋ํ์ ๊ฒฝ๋ก ๋ฐ์ดํฐ(path)๋ก ๋ณํ
SVG๋ด์๋ path ์์ ์ธ์๋
<circle>,<rect>๋ฑ ๋ค์ํ ๊ธฐ๋ณธ ๋ํ์ด ์์ต๋๋ค. ์ด ํจ์์์๋ ๋ชจ๋ ๋ํ์ path ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ๋ํ, ํ๋์<path>์์์๋ moveTo(M)์ผ๋ก pen์ด 0์ด ๋๋ ๋ถ๋ถ์ด ์๋๋ฐ,๊ทธ path๋ ๊ฐ๊ฐ ๋ฐ๋ก ๋ณํํฉ๋๋ค.- splitSubpathsFixed(dAttr)
-
์ด ํจ์๋ svg
<path>์ d ์์ฑ ๊ฐ์ ํ์ฑํ์ฌ ์ฌ๋ฌ๊ฐ์ ์๋ธ ํจ์ค๋ก ๋ถ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ๋ด๋นํฉ๋๋ค.-
์ ๋ ฅ ๋ฌธ์์ด ํ ํฐํ
-
dAttr๋ฌธ์์ด์ ์ ๊ทํํ์์ ์ฌ์ฉํ์ฌ ํ ํฐํ ํด ํ๊ธ์์ ๋ช ๋ น ๋ฌธ์(M,I,C)์ ์ซ์ ํ ํฐ์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฅผ ๋ค์ด "M10 10 L20 20"๋ผ๋ ๋ฌธ์์ด์ ["M", "10", "10", "L", "20", "20"]์ฒ๋ผ ๋ถํด๋ฉ๋๋ค.
- ๋ช ๋ น์ด ๋ณ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ ์ : PARAMS ๋งต์ ๊ฐ ๋ช ๋ น๋ง๋ค ์๊ตฌ๋๋ ์ขํ ๊ฐ์ ๊ฐฏ์๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํด ๋ก๋๋ค. ์ด ๋งต์ ๋ฐํ์ผ๋ก ๊ฐ ๋ช ๋ น์์ ๋ช๊ฐ์ ํ ํฐ์ ์ฝ์ด์ผ ํ๋์ง ํ๋จํฉ๋๋ค.
-
-
์ํ ๋ณ์ ์ด๊ธฐํ
- ๊ฒฝ๋ก์ ํ์ฌ ์ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ช๊ฐ์ง ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
cx, cy๋ ํ์ฌ์ ์ ์ขํ๋ก, ์ด๊ธฐ๊ฐ์ (0,0)์ ๋๋ค.sx,sy๋ ์๋ธํจ์ค์ ์์์ ์ผ๋ก, ์๋ก์ด ์๋ธ ํจ์ค๊ฐ ์์๋ ๋ ๊ฐฑ์ ๋์ด Z ๋ช ๋ น ์ฒ๋ฆฌ์ ์ฌ์ฉ๋ฉ๋๋ค.out๋ฐฐ์ด์ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ผ ์๋ธํจ์ค ๋ฌธ์์ด์ ๋ด๋ ๋ฆฌ์คํธ์ด๋ฉฐ,buf๋ฐฐ์ด์ ์๋ธํจ์ค์ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์์๋ก ๋์ ํ๋ ๋ฒํผ์ ๋๋ค.hasSubPath๋ ํ์ฌ ๋์ ์ค์ธ ์๋ธํจ์ค๊ฐ ์๋์ง ๋ํ๋ด๋ฉฐ,lastCmd๋ณ์์์๋ ์ง์ ์ ์ฒ๋ฆฌํ ๋ช ๋ น์ ์ ์ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
- ๊ฒฝ๋ก์ ํ์ฌ ์ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ช๊ฐ์ง ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
ํฌํผ ํจ์ ์ ์
- isCmd(token) : ์ฃผ์ด์ง ํ ํฐ์ด ๋ช ๋ น ๋ฌธ์์ธ์ง(a ~ z ๋๋ A ~ Z) ํ์ธํ๋ ํจ์์ ๋๋ค.
-
flush() : ํ์ฌ
buf์ ๋์ ๋ ์๋ธํจ์ค ๋ฐ์ดํฐ๋ฅผout๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค. ์ถ๊ฐ ํ์๋ buf๋ฅผ ๋น ๋ฌธ์์ด๋ก ์ด๊ธฐํํ๊ณhasSubpath๋ฅผ false๋ก ๋ฆฌ์ ํ์ฌ ์๋ก์ด ์๋ธํจ์ค๋ฅผ ์์ํ ์ค๋น๋ฅผ ํฉ๋๋ค. - readNums(n) : ํ์ฌ ํ ํฐ ์์น๋ก๋ถํฐ ์ซ์ n๊ฐ๋ฅผ ์ฝ์ด ๋ฐฐ์ด๋ก ๋ฐํํฉ๋๋ค. ์ด ํจ์์์ ํ ํฐ์ ์ฝ์ ์ ์ ์ญ๋ณ์ i๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- emit(cmd, nums) : ํ๋์ SVG ๋ช ๋ น๊ณผ ํด๋น ์ขํ ์ซ์๋ค์ buf์ ์ถ๊ฐํ๋ ํจ์์ ๋๋ค.
-
๋ฉ์ธ ํ์ฑ ๋ฃจํ
-
ํ ํฐํ ๋ ๋ช ๋ น ๋ชฉ๋ก์ ์ํํ๋ฉฐ ์ค์ ํ์ฑ์ ์งํํฉ๋๋ค.
isCmd(cmd)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ํ ํฐ์ด ๋ช ๋ น ๋ฌธ์์ธ์ง ํ์ธํ๊ณ , ๋ง๋ค๋ฉด ์ด๋ฅผlastCmd๋ก ์ค์ ํ๊ณi๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ๋ง์ฝ ํ์ฌ ํ ํฐ์ด ์ซ์์ด๊ณlastCmd๊ฐ ์กด์ฌํ๋ค๋ฉด ๋ช ๋ น์ด ๋ฐ๋ณต๋๋ ์ค ์ด๋ฏ๋ก,cmd = lastCmd๋ก ๊ฐ์ฃผํฉ๋๋ค. -
๋ช ๋ น ์ข ๋ฅ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ
-
์๋ณ๋ cmd์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
- (Z)์ ๊ฒฝ์ฐ : ์ด ๋ช
๋ น์ ๊ฒฝ์ฐ ์๋ธํจ์ค๋ฅผ ์ข
๋ฃํ๊ณ ๋ซ๋ ์ญํ ์ ํฉ๋๋ค.
haSubpath = false๋ผ๋ฉด ๋ซ์ ์๋ธํจ์ค๊ฐ ์๋ ๊ฒ ์ด๋ฏ๋ก ๋ฌด์ํ๊ณ ๋์ด๊ฐ๋ฉฐ, ์๋ธํจ์ค๊ฐ ์งํ์ค์ธ ์ค์ด๋ผ๋ฉด, emit("Z")๋ฅผ ํธ์ถํ์ฌ buf์ "Z"๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ์ ์ ํด๋น ์๋ธํจ์ค์ ์์์ ์ผ๋ก ๋๋๋ฆฝ๋๋ค(cx = sx; cy = sy;). - (M/m)์ ๊ฒฝ์ฐ : moveto ๋ช
๋ น์ ๋ง๋๋ฉด ์๋ก์ด ์๋ธํจ์ค๋ฅผ ์์ํฉ๋๋ค.
hasSubpath = true๋ผ๋ฉดflush()๋ฅผ ํธ์ถํด ์ด์ ์๋ธํจ์ค๋ฅผ ๋๋ธ ํ, ์ ์๋ธํจ์ค๋ฅผ ์์ํฉ๋๋ค. ์ดํreadNums(2)์ ํตํด ๋ ์ซ์๋ฅผ ์ฝ์ด ์๋ก์ด ์ด๋ ์ขํ(x,y)๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- (Z)์ ๊ฒฝ์ฐ : ์ด ๋ช
๋ น์ ๊ฒฝ์ฐ ์๋ธํจ์ค๋ฅผ ์ข
๋ฃํ๊ณ ๋ซ๋ ์ญํ ์ ํฉ๋๋ค.
-
์ขํ๋ฅผ ์ป์๋ค๋ฉด, M(์ ๋ ์ขํ ์ด๋)๊ณผ m(์๋ ์ขํ ์ด๋)์ ๋ฐ๋ผ ์ฒ๋ฆฌํฉ๋๋ค.
- m์ ๊ฒฝ์ฐ : ํ์ฌ์ (cx, cy)๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ์
์ ์ ์ฉํด ์ ๋ ์ขํ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
mx = cx + x; my = cy + y๋ก ์ ์ ๋ ์์น๋ฅผ ๊ตฌํ ๋ค, ์ด๋ฅผ ์ค์ ์ด๋ ๋ช ๋ น์ผ๋ก ๋ณํํฉ๋๋ค. - M์ ๊ฒฝ์ฐ : ์ฝ์ ์ขํ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
- m์ ๊ฒฝ์ฐ : ํ์ฌ์ (cx, cy)๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ์
์ ์ ์ฉํด ์ ๋ ์ขํ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
์ดํ
emit("M", [mx, my])๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ์๋ธ ํจ์ค ์์์ M ๋ช ๋ น์ผ๋ก buf์ ๊ธฐ๋กํฉ๋๋ค. ๋ํ, ์๋ก์ด ์๋ธํจ์ค๊ฐ ์์๋์์ผ๋ฏ๋กhasSubpath๋ฅผ true๋ก ์ค์ ํ๊ณ , ํ์ฌ์ cx, cy๋ฅผ(mx, my)๋ก ๊ฐฑ์ ํฉ๋๋ค. ๋ํsx, sy์ ์ด ์ขํ๋ฅผ ์ ์ฅํ์ฌ ์๋ธํจ์ค ์์์ ์ ๊ธฐ๋กํฉ๋๋ค.-
LineTo ์ฒ๋ฆฌ
- moveto ๋ช ๋ น ๋ค์ ์ถ๊ฐ ์ขํ ์๋ค์ด ๋์ด๋๋ฉด ์๋์ผ๋ก ์ฐ์๋ ์ง์ ๊ทธ๋ฆฌ๊ธฐ(line-to) ๋ช ๋ น๋ค๋ก ํด์๋ฉ๋๋ค.
- ์ด๋ฅผ ์ฝ๋์์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฒซ ์ขํ ์ ์ฒ๋ฆฌ ์ดํ ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ค์ ๋ํฐ์ ํ์ธํ์ฌ ์ซ์๋ผ๋ฉด ๋์ผ ์๋ธํจ์ค ๋ด์ ์ถ๊ฐ ์ ๊ทธ๋ฆฌ๊ธฐ๋ก ํ๋จํฉ๋๋ค.
- ์ฒซ ์ขํ ์ ์ฒ๋ฆฌ์์ ์๋ณธ ๋ช ๋ น์ด m(์๋)์๋ค๋ฉด, ์ ๋ช ๋ น์ l๋ก ํ๋จํ๊ณ , M(์ ๋)์๋ค๋ฉด ์ ๋ช ๋ น์ L๋ก ํ๋จํฉ๋๋ค.
- moveto ๋ฐ LineTo ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด continue๋ฅผ ํตํด M/m ๋ถ๊ธฐ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
-
๊ทธ์ธ์ ๋ช
๋ น(L,H,V,C ๋ฑ)
- ๋๋จธ์ง ๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น์ ๋ํด์ ํด๋น ๋ช
๋ น์ด ํ์๋ก ํ๋ ์ซ์ ํ๋ผ๋ฏธํฐ๋ฅผ
PARAMS์์ ๊ตฌํ ๋ค, ๋ด๋ถ ๋ฐ๋ณต๋ฌธ์ ํตํด ๋ช ๋ น๊ณผ ๊ด๋ จ๋ ์ซ์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ดํ ํ๋์ ์ขํ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ ํ์(cx,cy)๋ฅผ ์ ๋ฐ์ดํธ ํฉ๋๋ค. - ๊ฐ ์ธํธ ์ฒ๋ฆฌ ํ์๋
hasSubpath = true๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฒ ๋ฉ์ธ ๋ฃจํ๋ฅผ ์คํํ๊ณ , ์ข ๋ฃ ํ์๋ buf์ ๋จ์์๋ ์๋ธ ํจ์ค ๋ฐ์ดํฐ๋ฅผflush()๋ฅผ ํตํด ํธ์ถํ์ฌout์ ์ถ๊ฐํฉ๋๋ค.
- ๋๋จธ์ง ๊ทธ๋ฆฌ๊ธฐ ๋ช
๋ น์ ๋ํด์ ํด๋น ๋ช
๋ น์ด ํ์๋ก ํ๋ ์ซ์ ํ๋ผ๋ฏธํฐ๋ฅผ
-
-
-
-
์ต์ข ์ ์ผ๋ก ๊ฐ ์์๊ฐ ๋ ๋ฆฝ๋ ์๋ธํจ์ค ๊ฒฝ๋ก ๋ฌธ์์ด์ธ
out๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๋ ฅ dAttr๊ฐ "M0 0 L10 0 L10 10 Z M20 20 L30 30" ์๋ค๋ฉด, ์ด ํจ์๋ ๋ ๊ฐ์ ์๋ธํจ์ค๋ก ๋ถ๋ฆฌํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค: - ["M 0 0 L 10 0 L 10 10 Z", "M 20 20 L 30 30"]
-
circleToPathLocal(cx,cr,y)
- ์์ path๋ก ๋ณํํ๊ธฐ ์ํด ๋๊ฐ์ ํธ๋ก ํํํฉ๋๋ค. svg path์ A(์ํธ) ๋ช
๋ น์ ์ด์ฉํ์ฌ ๋๊ฐ์ ํธ๋ก ์์ ๊ตฌ์ฑํฉ๋๋ค.
<circle>์์์ cx, cy, r ์์ฑ์ ์ฝ์ด ์ค์ฌ ์ขํ์ ๋ฐ์ง๋ฆ์ ์ป์ต๋๋ค. - ์์ ๊ฐ์ฅ ์ผ์ชฝ์ ์์ ์์(M x0,y ํ์, x0 = cx - r)ํ์ฌ ์ฐ์ธก์ผ๋ก ๋ฐ์์ ๊ทธ๋ฆฌ๋ ์ํฌ ๋ช ๋ น A๋ฅผ ์ฌ์ฉํ๊ณ , ๋ค์ ์ข์ธก์ผ๋ก ๋์์ค๋ ๋ ๋ฒ์งธ ์ํฌ ๋ช ๋ น์ ์ถ๊ฐํ์ฌ ๋ซ๋ ์์ ๋๋ค. ๋ง์ง๋ง์ Z๋ก ๊ฒฝ๋ก๋ฅผ ๋ซ์ ์์ ํ ์์ ํํํฉ๋๋ค.
- ์ด ๋ฐฉ์์ผ๋ก ์์ SVG path์ A ๋ช ๋ น์ผ๋ก ํํํ ์ ์์ต๋๋ค.
- ์์ path๋ก ๋ณํํ๊ธฐ ์ํด ๋๊ฐ์ ํธ๋ก ํํํฉ๋๋ค. svg path์ A(์ํธ) ๋ช
๋ น์ ์ด์ฉํ์ฌ ๋๊ฐ์ ํธ๋ก ์์ ๊ตฌ์ฑํฉ๋๋ค.
-
ellipseToPathLocal(cx, cy, rx, ry)
-
ํ์์ 4๊ฐ์ ๋ฒ ์ง์ด ๊ณก์ ์ผ๋ก ๊ทผ์ฌํ์ฌ ๊ฒฝ๋ก๋ก ๋ณํํฉ๋๋ค.
-
๊ตฌํ์์ ์ฌ์ฉ๋
K = 0.5522...๋ ์์ด๋ ํ์์ 4๊ฐ์ ๊ณก์ ์ผ๋ก ๊ทผ์ฌํ ๋ ์ฌ์ฉ๋๋ ์นดํ(kappa) ์์๋ก, ์ด ์์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฒ ์ง์ด ๊ณก์ ์ ์ค์ ์ด ์ค์ ์์ ๊ฑฐ์ ๊ทผ์ ํ๋๋ก ์ ์ด์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. -
์ด ํจ์๋ ์ฐ์ ์ฃผ์ด์ง rotation ๊ฐ์ ๊ณ ๋ คํด ๋ฏธ๋ฆฌ ํ์ ๋ณํ์ ์ ์ฉํฉ๋๋ค. ์ดํ ํ์์ 4๊ฐ์ ์ฃผ์ ์ ๊ณผ ๋ฒ ์ง์ด ์ ์ด ์ ๋ ํ์ ํ์ฌ ๊ตฌํฉ๋๋ค.
-
๊ทธ๋ฐ ๋ค์, ๊ฒฝ๋ก ๋ฌธ์์ด์ ๊ตฌ์ฑํฉ๋๋ค. M ๋ช ๋ น์ผ๋ก ์์ํ์ฌ left ์ ์ผ๋ก ์ด๋ํ๊ณ , ์ด์ด์ C ํ๋น ๋ฒ ์ง์ด ๋ช ๋ น์ ์ฌ์ฉํ์ฌ top ์ ๊น์ง ๊ณก์ ์ ๊ทธ๋ฆฌ๋๋ก ์ ์ด์ c1, c2๋ฅผ ์ง์ ํฉ๋๋ค.
-
๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฐ์๋ 3๊ฐ์ C ๋ช ๋ น์ ์ฌ์ฉํ์ฌ top->right, right->bottom, bottom->left๋ก ์ด์ด์ง๋ ๊ณก์ ๋ค์ ์ถ๊ฐํฉ๋๋ค. ๋ง์ง๋ง์ Z๋ก ๋ซ์์ ํ๋์ ์ฐ์๋ ํจ์ค๋ก ํ์์ ๊ทผ์ฌํฉ๋๋ค.
-
-
rectToPathLocal(x, y, width, height, rx, ry)
- ์ฌ๊ฐํ์ 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๋ฅผ ์์ฑํฉ๋๋ค.
-
lineToPathLocal(x1, y1, x2, y2)
-
<line>์์๋ ์์์ (x1, y1)๊ณผ ๋์ (x2, y2)์ ๊ฐ์ง๋ ๋จ์ ์ ๋ถ์ ๋๋ค.
M x1,y1 โ L x2,y2 ํํ์ path๋ก ๋ณํํฉ๋๋ค.
-
-
polyToPathLocal(pointsStr, close)
-
<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)๊ฐ ๊ทธ ์ฒ๋ฆฌ์ ๋ด๋นํฉ๋๋.
-
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์์๋
-
๊ทธ๋ํฝ ์์
- 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์ ์ค์ ๊ทธ๋ ค์ง ๋ชจ๋ ๋ํ ์์๋ค์ด ์ถ๊ฐ๋๊ฒ ๋ฉ๋๋ค. - SVG ๋ด๋ถ์ ๊ฐ ๋ํ ์์๋ค์ ์์งํ๊ณ , ๊ฐ ์์ ๋ณ๋ก ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ค๋นํฉ๋๋ค. ์ด ๋, ํฌ๊ฒ ๋๊ฐ์ง ์์๋ฅผ ๋ค๋ฃจ๋๋ฐ, ์ง์ ์ ์ธ ๊ทธ๋ํฝ ์์(path์ ๊ธฐ๋ณธ ๋ํ)์
-
๊ฒฝ๋ก ๊ธธ์ด ๊ณ์ฐ
- ๋ํ๋ณ๋ก ์ป์ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ๊ณ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋จ๊ณ์
๋๋ค.
allElements๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํฉ๋๋ค.
๊ฐ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ์ด์ ๋, ์ ์ํ๋ง ๊ฐ๊ฒฉ์ ๊ฒฐ์ ํ๊ณ ์ต์ ํ ํ๊ธฐ ์ํด์์ ๋๋ค.
-
๊ฐ์ฒด ๊ฐ ๊บผ๋ด๊ธฐ ๋ฐ ๋ฐฐ์ด ์ด๊ฐํ
- ๊ฐ์ฒด์์ element, tagName, transform์ ๊บผ๋
๋๋ค. ์ดํ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด์
dList๋ฐฐ์ด๋ ์ด๊ธฐํํฉ๋๋ค. ๋ํ, ์ต์ข ๊ฒฝ๋ก ๊ฐ์ฒด๋ฅผ ๋ด์prepared๋ฐฐ์ด๋ ์ด๊ธฐํํฉ๋๋ค.
์ดํ ์์์ ์ข ๋ฅ๋ณ๋ก ๋ถ๊ธฐํ์ฌ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ป์ต๋๋ค.
- ๊ฐ์ฒด์์ element, tagName, transform์ ๊บผ๋
๋๋ค. ์ดํ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด์
-
์์ ๋ณ ๋ถ๊ธฐ
-
path ์ผ ๊ฒฝ์ฐ : ์ด๋ฏธ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์์๋ก, ๋ฌธ์์ด์ ๊ฐ์ ธ ์จ ๋ค,
splitSubpathsFixed()๋ฅผ ํธ์ถํ์ฌ ํ์ ์์ ์ฌ๋ฌ ํ์ ๊ฒฝ๋ก๋ก ๋ถํ ํฉ๋๋ค.splitSubpathsFixed()์ ๊ฒฐ๊ณผ๋ฅผ 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 ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๋๋ค.
-
path ์ผ ๊ฒฝ์ฐ : ์ด๋ฏธ ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์์๋ก, ๋ฌธ์์ด์ ๊ฐ์ ธ ์จ ๋ค,
-
๊ฒฝ๋ก ๊ธธ์ด ์ธก์
- dList๋ฅผ ์ํํ๋ฉฐ ํ๋์ ์์
<path>์์pathEl๋ฅผ ์์ฑํ๊ณpathEl.setAttribute("d", dAttr);๋ก ๊ฒฝ๋ก ๋ฐ์ดํฐ๋ฅผ ์ค์ ํฉ๋๋ค. - ๋ง์ฝ ํด๋น ์์์
transformMatrix๊ฐ ์๋ค๋ฉด ์ ์ฉํฉ๋๋ค. ์ดํpathEl.getTotalLength()๋ฅผ ํตํด ์ ์ฒด ๊ธธ์ด๋ฅผ ๊ตฌํฉ๋๋ค. ๊ธธ์ด๋ฅผ ์ป์๋ค๋ฉดpathEl.getTotalLength()๋ก ์์ path๋ฅผ ์ ๊ฑฐํ๊ณ ,prepared๋ฆฌ์คํธ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํฉ๋๋ค.prepared.push({ dAttr, transformMatrix, length: L });
- dList๋ฅผ ์ํํ๋ฉฐ ํ๋์ ์์
์ด์
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 ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ผ๋ฉด ์ ๊ฐ์๊ฐ
-
๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ ์ฐ๊ธฐ
- ์ด์ ๋ฃจํ๋ฅผ ๋๋ฉฐ, ๊ฒฝ๋ก๋ฅผ ์์๋ถํฐ ๋๊น์ง 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์ผ๋ก ๊ธฐ๋กํฉ๋๋ค.
- ํ ๋ํ์ ์ ์ points์ ์ถ๊ฐํ๊ธฐ ์ ์, ๋ง์ฝ ์ด์ ๋ํ์ ๋ง์ง๋ง ์์น๊ฐ ์์ ๊ฒฝ์ฐ(lastGlobalPt๊ฐ null์ด ์๋ ๊ฒฝ์ฐ)
-
์ ๋์ ๋ฐ 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