Transitions - zziuni/d3 GitHub Wiki
Wiki โธ API Reference โธ Core โธ Transitions
ํธ๋์ง์ ์ ์ฐ์ฐ์๋ฅผ ์ฆ์ ์ ์ฉํ์ง ์๊ณ ๋ถ๋๋ฝ๊ฒ ์๊ฐ์ ๋๊ณ ์ ์ฉํ๋ ํน์ํ ํ์ ์ selection์ด๋ค. transition ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ์ ํ๋ฌผ์์ ํธ๋์ง์ ์ ๋์ด๋ธ๋ค. ํธ๋์ง์ ์ ์ ๋ถ๋ ์๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก attr์ style๊ฐ์ ์ ํ๋ฌผ์ ์ฐ์ฐ์๋ฅผ ์ง์ํ๋ค. ์ฌ์ฉ ์๋ฅผ ๋ค๋ฉด, ํธ๋์ง์ ์ ์์ํ๊ธฐ์ ์๋ ๋ฌธ์์์๋ฅผ ์ถ๊ฐํด์ผํ๊ณ , remove ์ฐ์ฐ์๋ก ํธ๋์ง์ ์ด ๋๋ํ์ ๋ฌธ์์์๋ฅผ ์ ๊ฑฐํ ์ ์๋ค.
ํธ๋์ง์ ์ ๋ค๋ฅธ ์ฐ์ฐ์์ ๋น์ทํ๊ฒ ์ฐ์ฐ๋ ๋ฐ์ดํฐ์ ํจ์๋ค์ ์ฌ์ฉํด์ ๋ฌธ์์์ ๋ณ๋ก ์ง์ฐ(delay)๊ณผ ์ง์(duration)์ ๊ฐ๊ณ ์์ ์ ์๋ค. ์ด๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ ์์ธ๊ฐ ์ค ํ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ๋ฌธ์์์์์ ํธ๋์ง์ ์ ์ฉ์ ์์ฐจ๋ฅผ ์ฝ๊ฒ ๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์์์๋ฅผ ์ ๋ ฌํ ํ์ ํธ๋์ง์ ์ค์ ๋ฌธ์์์๊ฐ ์ฌ ์ ๋ ฌ๋๋ ๊ฑธ ์ธ์งํ๊ธฐ ์ฝ๊ฒํ๊ธฐ ์ํด์ ํธ๋์ง์ ์ ์์ฐจ๋ฅผ ๋ ์ ์๋ค.์ด ๊ธฐ๋ฒ์ ๋ณด๋ค ์์ธํ ๋ด์ฉ์ Heer์ Robertson์ "Animated Transitions in Statistical Data Graphics"๋ฅผ ์ฐธ๊ณ ํ๋ผ.
D3๋ ์์์ ๊ฐ์ ๊ฐ๋จํ ํธ๋์ง์ ๋ํ๊ธฐ ์ํ ๋นํธ์ธ interpolator๋ฅผ ๋ง์ด ๊ฐ๊ณ ์๋ค. ์๋ฅผ ๋ค์ด ํฐํธ ๋ฌธ์์ด "500 12px sans-serif"์ "300 42px sans-serif"๋ก ํธ๋์ง์ ์ ์๋ํ๋ฉด D3๋ ํฐํธ ํฌ๊ธฐ์ ๋์ด๋ฅผ ๋ณด๊ฐ(interpolate)ํ ์ซ์๋ฅผ ๋ฌธ์์ด์์ ์๋์ผ๋ก ์ฐพ๋๋ค. ์์์ ์ค์ฒฉ ๊ฐ์ฒด์ ๋ฐฐ์ด, SVG path ๋ฐ์ดํฐ๋ ๊ฐ ์ฌ์ด๋ฅผ ๋ณด๊ฐํ ์ ์๋ค. attrTween๊ณผ styleTween๋ฅผ ์ฌ์ฉํด์ ๋นํธ์ธ ๋์ด์์ง ์์ ์ปค์คํ interpolator๋ฅผ ๋ง๋ค ์ ์๋ค. D3์ interpolator๋ scales๋ฅผ ์ํ ๊ธฐ์ค์ ์ ๊ณตํ๋ฉฐ interpolator๊ฐ ์นผ๋ผ, ์ซ์, ์ด๋ค ์์์ ๊ฐ๊ณผ [0,1] ๋ฒ์๋ด์ t๋ฅผ ๋งคํํ๋ ํจ์์ด๋ฏ๋ก ํธ๋์ง์ ๊ฐ ์๋๊ณ ๋ ์ฌ์ฉํ ์ ์๋ค.
์ฃผ์ด์ง ๋ฌธ์์์์์๋ ํ ์๊ฐ์ ํ ํธ๋์ง์ ๋ง ํ์ฑํ ๋๋ค. ํ์ง๋ง, ๋์ผ ๋ฌธ์์์์์ ์ฌ๋ฌ ํธ๋์ง์ ์ด ์ค์ผ์ค๋ง ๋ ์๋ ์๋ค. ์ฃผ์ด์ง ์๊ฐ๋ด์ ์์ฐจ๋ฅผ ๋๊ณ ์ ๊ณต๋๋ ๋์ผ ๋ฌธ์์์์์ ๊ฐ ํธ๋์ง์ ์ด ์์๋๋ก ๋์ํ๋ค. ์๋ก์ด ํธ๋์ง์ ์ด ์ฃผ์ด์ง ๋ฌธ์์์์์ ์คํ๋๋ฉด ์ด์ ํธ๋์ง์ ๋ค์ ์ค์ผ์ค๋ง๋ ์์ง ์คํ๋์ง ์์ ํธ๋์ง์ ๊น์ง ๋ชจ๋ ๋ฐ๋ก ์ทจ์๋๋ค. ์ด๋ฅผ ํตํด์ ์ด์ ํธ๋์ง์ ์ด ๋์ ์ค์ด๊ฑฐ๋ ์์ฐจ๋ฅผ ๋๊ณ ์ง์ฐ ๋์ด์๋๋ผ๋ ์ฌ์ฉ์ ์ด๋ฒคํธ ์๋ต๊ฐ์ ์๋ก์ด ํธ๋์ง์ ์ผ๋ก ๋์ฒดํ ์ ์๋ค. ์ฌ๋ฌ๋จ๊ณ์ ํธ๋์ง์ (์ด์ ๋จ๊ณ์ ํธ๋์ง์ ์ "end"์ด๋ฒคํธ์์ ์์ฑ๋ ํธ๋์ง์ )๋ ๋์ผ "์ธ๋"๋ก ์ฌ๊ฒจ์ง๋ค. ์ฌ๊ธฐ์ "์ธ๋"๋ ์ฌ๋ฌ๋จ๊ณ์ ํธ๋์ง์ ์ด ์์ฑ๋ ๋ ๋ด๋ถ์ ์ผ๋ก ์์๋๋ ๋จ์์ฆ๊ฐํ ์ ์ผ ID๋ก ์ถ์ ํ๋ ์ค๋ฆฌ์ง๋ ํธ๋์ง์ ๊ณผ ๊ฐ์ "์ธ๋"์์ ์๋ฏธํ๋ค.
ํธ๋์ง์ ์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ ํํ ๋ฆฌ์ผ Working with Transitions๋ฅผ ์ฐธ๊ณ ํ๋ผ.
ํธ๋์ง์ ์ ์ ํ๋ฌผ์์ transition๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ค. ํธ๋์ง์ ์ ๊ธฐ๋ณธ๊ฐ์ด 0(zero)์ธ ์ง์ฐ๊ฐ(delay) ์ดํ์ ์๋์ผ๋ก ์์ํ๋ค. ํ์ง๋ง, ์ง์ฐ๊ฐ์ด 0์ธ ํธ๋์ง์ ์ ์ค์ ๋ก๋ ์ฒซ ํ์ด๋จธ ์ฝ๋ฐฑ ๋๊ธฐ๋ฅผ ์ํ ์ฝ๊ฐ์ ์ง์ฐ(~17ms) ํ ์์ํ๋ค. ํธ๋์ง์ ์ง์์๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ 250ms์ด๋ค.
# d3.transition([selection])
์ ๋๋ฉ์ด์
๋๋ ํธ๋์ง์
์ ์์ฑํ๋ฉฐ d3.select(document).transition()
์ ๊ฐ๋ค. ์ด ๋ฉ์๋๋ ํธ๋์ง์
์์ ์ ํ๋ฌผ์ ์ป๋๊ฒ ์๋๋ผ, ์ ํ๋ฌผ์์ ํธ๋์ง์
์ ์ป์ผ๋ฏ๋ก ์ ์ฌ์ฉํ์ง ์๋๋ค.
์ด ๋ฉ์๋์ selction ์ธ์๋ฅผ ๋๊ฒจ์ ํธ์ถํ ๋๋ ์ง์ ํ ์ ํ๋ฌผ์ ๋ฐํํ๋ค. ์ฆ, ๋ด๋ถ์์ ๋ณ๋ ์กฐ์์ด ์๋ ํจ์๋ค. ๊ทธ๋ฌ๋ transition.each์ ์ปจํ ์คํธ์์๋ ์ด ๋ฉ์๋๊ฐ ์ง์ ํ ์ ํ๋ฌผ์ ์ํ ์๋ก์ด ํธ๋์ง์ ์ ์์ฑํ๋ค. ๊ทธ ์ ํ๋ฌผ์ ๋ถ๋ชจ ํธ๋์ง์ ์ ์ง์ฐ์๊ฐ๊ณผ ์ง์์๊ฐ, ๋ค๋ฅธ ํ๋กํผํฐ๋ฅผ ์์ํ๋ค. ์ด๋ ๋์์ ์ผ์ด๋๋ ํธ๋์ง์ ์ ์ง์ํด์ผ ํ๋ ์ํฉ์์ ์ฌ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ ๋ ์ ์ฉํ๋ค. ์ฌ์ฌ์ฉํ ์ ์๋ ์ปดํฌ๋ํธ๋ ์ ํ๋ฌผ์ด๋ ํธ๋์ง์ ์์ ํธ์ถ๋ ์ ์๋ค. D3์์ axis component๊ฐ ๊ทธ ์๋ค.
# transition.delay(delay)
๋ฐ๋ฆฌ์ด๋ก ํธ๋์ง์
์ง์ฐ์๊ฐ ์ ์ง์ ํ๋ค. delay ์ธ์๊ฐ ์์๋ฉด ๋ชจ๋ ๋ฌธ์์์๋ ๊ฐ์ ์ง์ฐ์๊ฐ์ ๊ฐ์ง๋ง delay ๊ฐ ํจ์๋ฉด ๊ทธ ํจ์๋ ์ ํํ ๊ฐ ๋ฌธ์์์์์ ์์๋๋ก ๋์ํ๋ค. ์ ๋ฌ์ธ์๋ ๋ฐ์ดํ
d
, ์์ธ๊ฐ i
์ด๊ณ this
์ปจํ
์คํธ๋ ํด๋น DOM ๋ฌธ์์์๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ์ง์ฐ์๊ฐ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๊ธฐ๋ณธ์ง์ฐ๊ฐ์ 0์ด๋ค.
๋ฌธ์์์์ ํธ๋์ง์
์ ์๊ฐ์ฐจ๋ฅผ ๋๊ธฐ ์ํด์๋ ์์ธ๊ฐ i
๋ฅผ ๊ณฑํด์ ์ง์ฐ์๊ฐ์ ์ธํ
ํ๋ ๊ฐํธํ ๋ฐฉ๋ฒ์ด ์๋ค. ์๋ฅผ ๋ค๋ฉฐ, ์ง์์๊ฐ duration ์ด ๊ณ ์ ๋์ด์๊ณ ํด๋น ์ ํ๋ฌผ์ n ๊ฐ์ ๋ฌธ์์์๊ฐ ์๋ค๋ฉด, 2 * duration ๋์ ์์ฐจ์ ์ผ๋ก ํธ๋์ง์
์ ๋์ํ ์ ์๋ค.
.delay(function(d, i) { return i / n * duration; })
๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ํจ์๋ก ์ง์ฐ์๊ฐ์ ๊ณ์ฐํ ์๋ ์๋ค. ๊ทธ๋ ๊ฒ ํด์ ๋ฐ์ดํฐ ์ค์ฌ์ ์ ๋๋ฉ์ด์ ์ ์์ฑํ ์ ์๋ค.
# transition.duration(duration)
๋ฐ๋ฆฌ์ด๋ก ๋ฌธ์์์๋น ์ง์์๊ฐ์ ์ง์ ํ๋ค. duration ์ด ์์ฐ์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๋ ๊ฐ์ ์ง์์๊ฐ์ ๊ฐ์ง๋ง duration ์ด ํจ์๋ฉด ์ ํํ ๊ฐ ๋ฌธ์์์์์ ์์๋๋ก ๋์ํ๋ค. ์ ๋ฌ์ธ์๋ ๋ฐ์ดํ
d
, ์์ธ๊ฐ i
์ด๊ณ this
์ปจํ
์คํธ๋ ํด๋น DOM ๋ฌธ์์์๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ์ง์์๊ฐ์ ์ง์ ํ๋๋ฐ ์ฌ์ฉ๋๋ค. ๊ธฐ๋ณธ ์ง์์๊ฐ ๊ฐ์ 250ms์ด๋ค.
# transition.ease(value[, arguments])
ํธ๋์ง์ ์ด์ง(easing) ํจ์๋ฅผ ์ง์ ํ๋ค. ์ธ์ value ๊ฐ ํจ์์ด๋ฉด ๊ทธ ํจ์๋ฅผ ๋ฒ์ [0,1]์์ ํด๋น ํ๋ผ๋ฏธํฐ ํ์ด๋ฐ ๊ฐ t ๋ฅผ ์ด์งํ๋๋ฐ ์ฌ์ฉํ๋ค. ํจ์๊ฐ ์๋๋ฉด value ์ ๋ฌธ์์ด๋ก ๊ฐ์ ํ๊ณ arguments ๋ ์ด์งํจ์๋ฅผ ์์ฑํ๊ธฐ์ํด์ d3.ease ๋ฉ์๋๋ก ์ ๋ฌ๋๋ค. ๊ธฐ๋ณธ ์ด์ง ํจ์๋ "cubic-in-out"์ด๋ค. ์ด ๋ฉ์๋๋ก ๋ฌธ์์์๋ ์์ฑ ๋ณ๋ก ์ปค์คํ ์ด์ง ํจ์๋ฅผ ๋ง๋๋๊ฑด ๋ถ๊ฐ๋ฅํ๋ค. ํ์ง๋ง "์ ํ(linear)" ์ด์ง ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด attrTween๋ styleTween๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์ interpolator์์ ์ปค์คํ ์ด์ง์ ์ ์ฉํ ์ ์๋ค.
# transition.attr(name, value)
์์ฑ๋ช
์ด name ์ธ ์์ฑ์ ๊ฐ value ์ผ๋ก ๋ณํ(transition)ํ๋ค. ์์ฑ์ ํ์ฌ๊ฐ์ด value ๋ก ๋ณํ๋๋ฉฐ, value ๊ฐ ์์๋ฉด ๋ชจ๋ selector๋ค์ด ๋์ผ ๊ฐ์ผ๋ก ๋ณํํ๊ณ ํจ์์ด๋ฉด ๊ฐ๋ณ์ ์ผ๋ก ํ๋จํ๋ค. ํจ์์ผ ๋๋ ์ ๋ฌ์ธ์ d
, i
๋ฅผ ๊ฐ์ง๋ค. ๊ฐ๊ฐ ํ์ฌ datum๊ณผ index์ด๋ฉฐ, ํจ์ ์์์ this
๋ ํด๋น DOM Elmenet์ด๋ค. ํจ์์ ๋ฐํ๊ฐ์ด ์์ฑ์ ํธ๋์ง์
๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ค. null์ ๋ฐํ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ํธ๋์ง์
์ข
๋ฃํ ์์ฑ ์ญ์ ๋ฅผ ์ํ๋ฉด end์ด๋ฒคํธ์ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๋ผ.
์ฌ์ฉํ interpolator๋ ์ข
๋ฃ๊ฐ( value ) ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก ์ ํ๋๋ค. ์ข
๋ฃ๊ฐ์ด ์ซ์๋ฉด ์์๊ฐ๋ ์ซ์๋ก ์ฌ๊ธฐ๊ณ interpolateNumber๋ฅผ ์ฌ์ฉํ๋ค. ์ข
๋ฃ๊ฐ์ด ๋ฌธ์๋ฉด ์ ๊ท์ /^(#|rgb\(|hsl\()/
๋ฅผ ํตํด์ ์์ ๊ฐ์ธ์ง, CSS Name Color ์ธ์ง ํ์ธํ๋ค. ๋ง์ฝ ๋ง์ผ๋ฉด ์์๊ฐ์ RGB ์นผ๋ผ๋ก ๋ณด๊ณ interpolateRgb
๋ฅผ ์ฌ์ฉํ๋ค. ๋๋ค ์๋๋ฉด ๋ฌธ์์ด์์ ํ๋ญํ ์ซ์๋ค๋ก ๋ณด๊ฐ ์์
์ ํ๋ interpolateString
๋ฅผ ์ฌ์ฉํ๋ค.
# transition.attrTween(name, tween)
์ง์ ํ name ์์ฑ๊ฐ์ tween ํจ์๋ก ํธ๋์ง์
ํ๋ค. ํธ๋์ง์
์ ์์๊ณผ ๋ ๊ฐ์ tween ์ผ๋ก ๊ฒฐ์ ๋๋ฉฐ, tween ํจ์๋ ํธ๋์ง์
์ด ๊ฐ ์์์์ ์์๋ ๋ ํธ์ถ ๋๋ค. tween ์ ์ธ์๋ d
atum, i
ndex, a
tribute ์ด๊ณ this
๋ ํด๋น DOM element์ด๋ค. ์ด ํจ์์ ๋ฐํ๊ฐ์ ๋ฐ๋์ interpolator์ฌ์ผ ํ๋ค. interpolator๋ ์นผ๋ผ, ์ซ์ ์๋๋ฉด ์ด๋ค ์์์ ๊ฐ๊ณผ [0,1] ๋ฒ์๋ด์ t
๋ฅผ ๋งคํํ๋ ํจ์๋ค.
์๋ฅผ ๋ค๋ฉด, attr
๋ attrTween
๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ณ ,
attr ์ฐ์ฐ์๋ ์ข
๋ฃ๊ฐ์ ์์งํด์ tween ๋ฅผ ์ฌ์ฉํ๋ค. ์ข
๋ฃ๊ฐ์ ํจ์์ผ ์๋ ์๊ณ ์์์ผ ์๋ ์๋ค. ๋ค์์ ์ข
๋ฃ๊ฐ์ด ํจ์์ธ ๊ฒฝ์ฐ๋ค.
function tween(d, i, a) {
return d3.interpolate(a, String(value.call(this, d, i)));
}
๋ค์์ ์ข ๋ฃ ๊ฐ์ด ์์์ธ ๊ฒฝ์ฐ.
function tween(d, i, a) {
return d3.interpolate(a, String(value));
}
attrTween
๋ ์ฌ์ฉ์ ์ ์ interpolater๊ฐ ํ์ํ ๋ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ์ํด์๋ SVG ํจ์ค ๋ฐ์ดํฐ์ ์๋ฏธ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํ์ํ๋ค. ๋ฒ์ฉ ํ
ํฌ๋์ค dataspace interpolation(๋ฐ์ดํฐ ๋ณด๊ฐ๋ฒ) ์ด ์๋ค. interpolateObject๋ ๊ฐ ๋ ๊ฐ๋ฅผ ๋ณด๊ฐํ ๋ ์ฌ์ฉํ๋๋ฐ ๋ณด๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ ์์ฑ์ ์๋ก์ด ๊ฐ์ ์ฐ์ฐํ๋๋ฐ ์ฌ์ฉ๋๋ค(shape ๊ฐ์). ์ผ๋ฐ์ ์ผ๋ก๋ ์ด ๊ณผ์ ์ ์๋ ์ฒ๋ฆฌํด์ฃผ๋ attr
๋ฅผ ์ฌ์ฉํ๋ค.
# transition.style(name, value[, priority])
์ ๋ฌ์ธ์์ธ name ๊ณผ value ๋ก CSS ์คํ์ผ ํ๋กํผํฐ์ ๊ฐ์ ํธ๋์ง์
ํ๋ค. priority ์ธ์๋ ์ต์
์ธ์๋ก null์ด๊ฑฐ๋ "important" ๋ฌธ์์ด(๋๋ํ ์์)์ ๊ฐ๋๋ค. ํธ๋์ง์
์์๊ฐ์ ์ฐ์ฐ๋ ํด๋น ์คํ์ผ ํ๋กํผํฐ ๊ฐ์ด๊ณ , ์ข
๋ฃ ๊ฐ์ value ๋ก ์ง์ ํ ๊ฐ์ด๋ค. value ๊ฐ ์์์ผ ๋๋ ๋ชจ๋ ๋ฌธ์์์๊ฐ ๊ฐ์ ์คํ์ผ ํ๋กํผํฐ๋ก ํธ๋์ง์
๋๊ณ , ํจ์์ผ ๋๋ ์ ํ๋ ๊ฐ ๋ฌธ์์์๋ณ๋ก ํธ๋์ง์
์ ์์๋๋ก ์์ํ๊ธฐ์ํด์ ํจ์๋ฅผ ์คํํ๋ค. ์ด๋ ์ ๋ฌ์ธ์๋ ๋ฐ์ดํ
d
์ ํด๋น ์์ธ๊ฐ i
์ด๊ณ this
์ปจํ
์คํธ๋ ํด๋น DOM ๋ฌธ์์์๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ์คํ์ผ ํ๋กํผํฐ ๊ฐ์ ํธ๋์ง์
ํ๋๋ฐ ์ฌ์ฉํ๋ฉฐ null ๊ฐ์ ์ง์ํ์ง ์๋๋ค. ํธ๋์ง์
์ด ๋๋ ํ์ ์คํ์ผ ํ๋กํผํฐ๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ๋ค๋ฉด, end ์ด๋ฒคํธ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ๋ผ.
interpolator๋ ์ข
๋ฃ ๊ฐ ๊ธฐ๋ฐ์ผ๋ก ์๋์ผ๋ก ์ ํ๋๋ค. ์ข
๋ฃ ๊ฐ์ด ์ซ์๋ฉด ์์ ๊ฐ๋ ์ซ์๋ก ์ฌ๊ธฐ๊ณ interpolateNumber๋ฅผ ์ฌ์ฉํ๋ค. ์ข
๋ฃ๊ฐ์ด ๋ฌธ์๋ฉด ์ ๊ท์ /^(#|rgb\(|hsl\()/
๋ฅผ ํตํด์ ์์ ๊ฐ์ธ์ง, CSS named colors ์ธ์ง ํ์ธํ๋ค. ๋ง์ฝ ๋ง์ผ๋ฉด ์์๊ฐ์ RGB ์นผ๋ผ๋ก ๋ณด๊ณ interpolateRgb๋ฅผ ์ฌ์ฉํ๋ค. ๋๋ค ์๋๋ฉด ๋ฌธ์์ด์์ ํ๋ญํ ์ซ์๋ค๋ก ๋ณด๊ฐ ์์
์ ํ๋ interpolateString๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ฉ๋ ์์ ๊ฐ์ ์ง์ ํ๋ ๊ฐ์ด ์๋ ์๋ ์๋ค. ํนํ ์คํ์ผ ํ๋กํผํฐ๊ฐ ์ถ์ฝํ ํ๋กํผ๋ฅผ ์ฌ์ฉํด์ ์ง์ ํ๋ค๋ฉด ๋ง์ด๋ค. (์๋ฅผ ๋ค๋ฉด "font-size", "font-face"์ ์ถ์ฝํ์ "font"์ด๋ค. ) ๋๊ตฐ๋ค๋ "font-size", "line-height" ๊ฐ์ ๊ณ์ฐ๋ ๋ฉด์ ์ ํญ์ ๋จ์๊ฐ ํฝ์ ์ด๋ค. ๊ทธ๋์ ์ ์ ํ๊ฒ ํฝ์ ๋ก ์ข ๋ฃ ๊ฐ์ ์ง์ ํด์ผ ํ๋ค.
# transition.styleTween(name, tween[, priority])
์ ๋ฌ์ธ์ tween ํจ์๋ฅผ ๋ฐ๋ผ์ CSS ์คํ์ผ ํ๋กํผํฐ "name"์ ๊ฐ์ ํธ๋์ง์
ํ๋ค. priority ์ธ์๋ ์ต์
์ธ์๋ก null์ด๊ฑฐ๋ "important" ๋ฌธ์์ด(๋๋ํ ์์)์ ๊ฐ๋๋ค. ํธ๋์ง์
์ ์์๊ณผ ์ข
๋ฃ ๊ฐ์ tween ํจ์๋ก ๊ฒฐ์ ๋๋ค. tween ํจ์๋ ๊ฐ ๋ฌธ์์์์์ ํธ๋์ง์
์ด ์์๋ ๋ ํธ์ถ๋๋ค. ์ ๋ฌ์ธ์๋ ๋ฐ์ดํ
d
, ์์ธ๊ฐ i
, ํด๋น ์์ฑ ๊ฐ a
์ด๊ณ 'this
์ปจํ
์คํธ๋ ํด๋น DOM ๋ฌธ์์์๋ค. tween ํจ์์ ๋ฐํ ๊ฐ์ interpolator ์ฌ์ผ๋ง ํ๋ค. interpolator๋ ์์, ์ซ์, ์์์ ๊ฐ๊ณผ ๋ฒ์ [0,1]์ ํ๋ผ๋ฏธํฐ ๊ฐ t ๋ฅผ ๋งคํํ๋ ํจ์๋ค.
์๋ฅผ ๋ค์ด, style
์ฐ์ฐ์๋ ์ด styleTween
์ฐ์ฐ์๋ก ๋ง๋ค์ด์ ธ์๋ค. style ์ฐ์ฐ์๋ ์ข
๋ฃ๊ฐ์ ์์งํด์ tween ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ข
๋ฃ๊ฐ์ ํจ์์ผ ์๋ ์๊ณ ์์์ผ ์๋ ์๋ค. ๋ค์์ ์ข
๋ฃ๊ฐ์ด ํจ์์ธ ๊ฒฝ์ฐ๋ค.
function tween(d, i, a) {
return d3.interpolate(a, String(value.call(this, d, i)));
}
๋ค์์ ์ข ๋ฃ ๊ฐ์ด ์์์ธ ๊ฒฝ์ฐ.
function tween(d, i, a) {
return d3.interpolate(a, String(value));
}
styleTween ์ฐ์ฐ์๋ ์ฌ์ฉ์ ์ ์ interpolater๊ฐ ํ์ํ ๋ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ์ํด์๋ CSS3 ํธ๋์ง์ ์ ์๋ฏธ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ํ์ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ style ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด ์ฐ์ฐ์์๋ ๊ณ์ฐ๋ ํด๋น ์คํ์ผ ํ๋กํผํฐ ๊ฐ์ ์ํ๋ ์ข ๋ฃ ๊ฐ์ผ๋ก ์๋์ผ๋ก ๋ฐ๊พธ๋ interpolator๊ฐ ์๋ค.
# transition.text(value)
text
์ฐ์ฐ์๋ textContent ํ๋กํผํฐ ๊ธฐ๋ฐ์ผ๋ก ๋์ด์๋ค. ํ
์คํธ ์ปจํ
์ธ ๋ฅผ ์ง์ ํ๋ฉด ๊ธฐ์กด์ ์๋ ํ์ ๋ฌธ์์์๋ ๊ต์ฒด๋๋ค.
ํธ๋์ง์
์ด ์์ํ ๋ ์ ํํ ๋ชจ๋ ๋ฌธ์์์์ ์ง์ ํ value๋ก ํ
์คํธ ์ปจํ
์ธ ๋ฅผ ์ง์ ํ๋ค. value ๊ฐ ์์์ด๋ฉด ๋ชจ๋ ๋ฌธ์์์๋ ๊ฐ์ ํ
์คํธ ์ปจํ
์ธ ๋ก ์ง์ ํ๊ณ ํจ์๋ฉด ํธ๋์ง์
์ ์ ํํ ๊ฐ๋ณ ๋ฌธ์์์์์ ์์ํ ๋ ์๋ํ๋ค. ์ด ํจ์์ ์ ๋ฌํจ์๋ ๋ฐ์ดํ
d
, ์์ธ๊ฐ i
์ด๊ณ this
์ปจํ
์คํธ๋ ํด๋น DOM ๋ฌธ์์์๋ค. ํจ์์ ๋ฐํ๊ฐ์ ๊ฐ ๋ฌธ์์์์ ํ
์คํธ ์ปจํ
์ธ ๋ก ์ฌ์ฉ๋๋ค. null ๊ฐ์ ๋ชจ๋ ์ปจํ
์ธ ๋ฅผ ์ ๊ฑฐํ๋ค.
# transition.tween(name, factory)
์ ๋ฌ์ธ์ name ์ผ๋ก ์ฌ์ฉ์ tween์ ๋ฑ๋กํ๋ค. ํธ๋์ง์ ์ด ์์ํ ๋ ์ ๋ฌ์ธ์ factory ํจ์๋ tween ํจ์๋ฅผ ์ฐ์ถํ๊ธฐ์ํด์ ํธ๋์ง์ ์์ ์ ํํ ๊ฐ ๋ฌธ์์์์์ ํธ์ถ๋๋ค. factory๊ฐ null๋ฅผ ๋ฐํํ๋ฉด tween์ ์ ํํ ๋ฌธ์์์์์ ๋์ํ์ง ์๋๋ค. ์ด ๋ฉ์๋๋ attr๊ณผ style tween์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ๋ค๋ฅธ ๋ฌธ์ ์ปจํ ์ธ ๋ฅผ ๋ณด๊ฐ(interpolate)ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด, ๋ค์์ ํ ์คํธ ์ปจํ ํธ๋ฅผ ๋ณด๊ฐํ๋ค.
selection.transition().tween("text", function() {
var i = d3.interpolate(this.textContent, "yellow");
return function(t) {
this.textContent = i(t);
};
});
tween์ ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ง์ ์ "yellow"๋ก ํ๋์ฝ๋ฉํ ์์ ์์ ๊ฐ์ ๋ฐฉ์์ด ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์(ํด๋ก์ ๋ผ ๋ถ๋ฅธ๋ค.)๋ก ์์ฑ๋๋ค. ์ฐธ๊ณ ํ๋ ค๋ฉด D3๋ฅผ ์์ค๋ฅผ ์ฐธ๊ณ ํ๋ผ.
# transition.remove()
ํธ๋์ง์ ์ด ๋๋ฌ์ ๋ ์ ํํ ๋ฌธ์์์๋ฅผ ์ ๊ฑฐํ๋ค. ํ์ง๋ง ์๋ก์ด ํธ๋์ง์ ์ด ์ ํ๋ ๋ฌธ์์์์ ์ค์ผ์ค๋์ด ์์ผ๋ฉด, ๊ทธ ๋ฌธ์์์๋ ์ ๊ฑฐํ์ง ์๊ณ , "end" ์ด๋ฒคํธ๋ ์ฌ์ ํ ๋ฐ์ํ๋ค.
ํธ๋์ง์ ์ ์ด๋ฏธ ์กด์ฌํ๋ ํธ๋์ง์ ์์ ์ผ์ด๋ ์๋ ์๋ค. ํ์์ ํ๋ฌผ๊ณผ ๋น์ทํ ํํ๋ค. ํ์ํธ๋์ง์ ์ ๋ถ๋ชจ ํธ๋์ง์ ์์ ์ด์ง, ์ง์ฐ์๊ฐ, ์ง์์๊ฐ์ ์์ํ๋ค.
# transition.select(selector)
ํ์ฌ ํธ๋์ง์ ์์ ๊ฐ ๋ฌธ์์์์ ๋ํด selector ๋ฌธ์์ด์ ํด๋นํ๋ ์ฒซ๋ฒ์งธ ์์ ๋ฌธ์์์๋ฅผ ์ ํํ๋ค. ํด๋น ๋ฌธ์์์์ ํด๋นํ๋ ๋ฌธ์์์๊ฐ ์๋ค๋ฉด, ๋ฐํ๋๋ ํด๋น ์์ธ๊ฐ์ ๋ฌธ์์์๋ null์ด๋ค. data๋ฅผ ์ ์ธํ ์ฐ์ฐ์๋ค์ null ๋ฌธ์์์๋ฅผ ์๋์ผ๋ก ๋ฌด์ํ๋ค. ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ๊ธฐ์กด ์ ํ๋ฌผ์ ์์ธ๊ฐ์ ์ ์งํ ์ ์๋ค. ํด๋น ๋ฌธ์์์๊ฐ ๊ด๋ จ๋ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ ๋ฐํ๋๋ ํ์์ ํ๋ฌผ๋ก ์์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋กญ๊ฒ ์ ํ๋ ๋ฌธ์์์์ ์๋์ผ๋ก ์ฎ์ธ๋ค. ์ ๋ ํฐ์ ํด๋นํ๋ ๋ฌธ์์์๊ฐ ์ฌ๋ฌ๊ฐ๋ฉด ๋ฌธ์ ๋ฌธ์์ ์ฒซ๋ฒ์งธ ๋ฌธ์์์๋ง ์ ํ๋๋ค.
์ด ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฑฐ์ ๋น์ทํ๋ค.
selection.select(selector).transition()
selection ์ด ํ์ฌ ํธ๋์ง์ ์๋์ ์ ํ๋ฌผ์ด๊ณ ๊ทธ๋ฌ๋ฉด ๋ฐํ๋๋ ์๋ก์ด ํธ๋์ง์ ์ ํด๋น ํธ๋์ง์ ์ ์ด์ง, ์ง์ฐ์๊ฐ, ์ง์์๊ฐ์ ์์ํ๋ค.
# transition.selectAll(selector)
ํ์ฌ ํธ๋์ง์ ์ ๊ฐ ๋ฌธ์์์์์ selector ๋ฌธ์์ด์ ํด๋นํ๋ ์์ ๋ฌธ์์์๋ค์ ์ ํํ๋ค. ํด๋น ์ ํ๋ฌผ์ ์กฐ์ ๋ ธ๋๋ก ๊ทธ๋ฃนํ๋ ์ ํ๋ฌผ์ ๋ฐํํ๋ค. ํด๋น ๋ฌธ์์์์์ ์ ๋ ํฐ์ ํด๋นํ๋ ๋ฌธ์์์๊ฐ ์์ผ๋ฉด ๋ฐํ ์ ํ๋ฌผ์์ ํด๋น ์์ธ๊ฐ์ ๊ทธ๋ฃน์ ๋น ์ํ๊ฐ ๋๋ค. ํ์์ ํ๋ฌผ์ ํด๋น ์ ํ๋ฌผ์์ ๋ฐ์ดํฐ๋ฅผ ์์ํ์ง ์๋๋ค. ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ฌ์ ์ ์ ํ๋ ๋ฌธ์์์์ ์ฎ์๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ ์ ์ดํ ์ ์๋ค.
์ด ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฑฐ์ ๋น์ทํ๋ค.
selection.selectAll(selector).transition()
selection ์ ํ์ฌ ํธ๋์ง์ ์ ํ์ ์ ํ๋ฌผ์ด๊ณ ๊ทธ๋ฌ๋ฉด ๋ฐํ๋๋ ์๋ก์ด ํธ๋์ง์ ์ ํด๋น ํธ๋์ง์ ์ ์ด์ง(easing), ์ง์ฐ์๊ฐ, ์ง์์๊ฐ์ ์์ํ๋ค. ๊ฐ ํ์ ๋ฌธ์์์์ ์ง์์๊ฐ๊ณผ ์ง์ฐ์๊ฐ์ ํด๋น ํธ๋์ง์ ์์ ๋ถ๋ชจ ๋ฌธ์์์์ ์ง์์๊ฐ๊ณผ ์ง์ฐ์๊ฐ์ ์์ํ๋ค.
# transition. filter (selector)
์ ๋ฌ์ธ์๋ก ์ง์ ํ selector ์ ํด๋นํ๋ ๋ฌธ์์์๋ง ๋ด์ ์๋ก์ด ๋ณํ์ ๋ฐํํ๋ ๋ณํ์ ํํฐ๋งํ๋ค. ์ ํ์ selector ๋ ".foo"๊ฐ์ ์ ํ์ ๋ฌธ์์ด๋ง์ด ์๋๋ผ ํจ์๋ ๊ฐ๋ฅํ๋ค. ๋ค๋ฅธ ์ฐ์ฐ์๋ค ์ฒ๋ผ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ํจ์์ ์ ๋ฌ๋๋ ์ธ์๋ ๋ฐ์ดํ
d
์ ์์ธ๊ฐ i
์ด๊ณ this
์ปจํ
์คํธ๋ ํด๋น DOM ๋ฌธ์์์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ ๋ด์ฅ ๋ฉ์๋ filter ์ฒ๋ผ ๋ฐํ ์ ํ๋ฌผ์ ์๋ณธ ์ ํ๋ฌผ์ ์์ธ๊ฐ์ ์ ์งํ์ง ์๋๋ค. ๋ฌธ์์์๊ฐ ์๊ฑฐ๋ ์ฌ๋ณธ์ ๋ฐํํ๋ค. ์์ธ๊ฐ์ ์ ์งํ๊ณ ์ถ์ผ๋ฉด select ๋ฉ์๋๋ฅผ ์ฌ์ฉํด๋ผ. ์๋ฅผ ๋ค์ด ํ๋ ๊ฑด๋์ฉ ๋ฌธ์์์๋ฅผ ์ ํํ๋ ค๋ฉด
var odds = transition.select(function(d, i) { return i & 1 ? this : null; });
๋์ผํ ํจ๊ณผ๋ฅผ ํํฐ ์ธ์๋ก ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด
var odds = transition.filter(function(d, i) { return i & 1; });
ํํฐ ์ธ์๋ก ์ ํ์ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ฉด
var odds = transition.filter(":nth-child(odd)");
์ด์ฒ๋ผ, ๋ฌธ์์์์ ํ์์งํฉ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด์ select, filter ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
# transition.transition()
์ด์ ๋จ๊ณ ํธ๋์ง์ (transition)๊ณผ ๋์ผํ ์ ํ ๋ฌธ์์์์์ ๊ทธ ํธ๋์ง์ ์ ์ข ๋ฃ์ ํจ๊ป ์์ํ๋ ์ ๊ท ํธ๋์ง์ ์ ์์ฑํ๋ค. ์๋ก์ด ํธ๋์ง์ ์ ํ์ฌ ์ด์ ๋จ๊ณ ํธ๋์ง์ ์ ์ง์ฐ์๊ฐ๊ณผ ์ง์์๊ฐ์ ์์ํ๋ค. ์ด ๋ฉ์๋๋ "end" ์ด๋ฒคํธ๋ฅผ ์ํ ๋ฆฌ์ค๋ ์์ด๋ chained transitions๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค.
# transition.each([type, ]listener)
์ ๋ฌ์ธ์ type ์ ๋๊ธฐ๋ฉด ํธ๋์ง์
์ด๋ฒคํธ๋ฅผ ์ํ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํ๋ค. "start", "end"์ด๋ฒคํธ๋ ์ฌ๊ธฐ์ ํฌํจ๋๋ค. ์ด๋ ๊ฒ ์ถ๊ฐํ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํธ๋์ง์
์์์ ์ง์ฐ์๊ฐ๊ณผ ์ง์์๊ฐ์ด ๋ฐ๋ณต๋๋๋ผ๋ ๊ฐ๋ณ ๋ฌธ์์์๋ณ๋ก ํธ์ถ๋๋ค. start ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ณ ๋ฌธ์์์๊ฐ ํธ๋์ง์
์์ ๊ฐ์ ์ฆ๊ฐ์ ์ธ ๋ณํ๋ฅผ ์ผ์ผํค๊ธฐ์ํด์ ์ฌ์ฉ๋ ์ ์๋ค. end ์ด๋ฒคํธ๋ ํด๋น ๋ฌธ์์์ this
๋ฅผ ์ ํํ๊ณ ์ ํธ๋์ง์
์ ์ด๋์ด๋ ๊ณผ์ ์ ํตํด์ ๋ค๋จ๊ณ ํธ๋์ง์
์ ์ผ์ผํค๊ธฐ์ํด์ ์ฌ์ฉํ ์ ์๋ค. end ์ด๋ฒคํธ์์ ์์ฑ๋ ๋ชจ๋ ํธ๋์ง์
์ ํ์ฌ ํธ๋์ง์
ID๋ฅผ ์์ํ๋ค. ์ด๋ฅผ ํตํด์ ์ด๋ฏธ ์์ฝ๋ ์ ๊ท ํธ๋์ง์
์ ๋ฅ์ด์ฐ๋์ผ์ ๋ฐฉ์งํ๋ค.
type ์ด ์์ผ๋ฉด selection.each์ ๋์ผํ๊ฒ ๋์ํ๋ค.
# transition.call(function[, argumentsโฆ])
ํ์ฌ ํธ๋์ง์ ์์ ์ต์ ์ธ์ arguments ์ ํจ๊ป function ๋ฅผ ํ๋ฒ ํธ์ถํ๋ค. call ์ฐ์ฐ์๋ ํจ์๊ฐ ๋ฐํํ๋ ๊ฐ๊ณผ ๊ด๊ณ์์ด ํญ์ ํ์ฌ ํธ๋์ง์ ์ ๋ฐํํ๋ค. call ์ฐ์ฐ์๋ ์๋์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ๋์์ด ๋์ผํ์ง๋ง ๋ฉ์๋ ์ฒด์ธ์ ์ ์ฉํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค. ์๋ฅผ ๋ค์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ณณ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ์ ์ง์ ํ๋ ค ํ๋ค๊ณ ํ๋ฉด ๋ค์ ๊ฐ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ง๋ ๋ค.
function foo(transition) {
transition
.attr("name1", "value1")
.attr("name2", "value2");
}
์ด๊ฑธ ์ด๋ ๊ฒ ๋ถ๋ฅผ ์๋ ์์ง๋ง,
foo(d3.selectAll("div").transition())
์ด๋ ๊ฒ ํด๋ ๊ฐ๋ค.
d3.selectAll("div").transition().call(foo);
๋๋ถ๋ถ์ ํธ๋์ง์
๊ณผ ์ ํ๋ฌผ์์ ๋ชจ๋ ๋์ผํ ํจ์ foo ๋ฅผ ํธ์ถํ ์ ์๋๋ฐ, ์ด๋ ์ ํ๋ฌผ์ ํธ๋์ง์
์ด ๋์ผ ๋ฉ์๋๋ฅผ ๋ฐ๋ผ๋ณด๊ธฐ ๋๋ฌธ์ด๋ฉฐ ์ด๊ฒฝ์ฐ, ํธ์ถ๋ ํจ์์ this
์ปจํ
์คํธ๋ ํ์ฌ ํธ๋์ง์
์ด๋ค. ์ด ์ฐ์ฐ์์ ์ฒซ ๋ฒ์งธ ์ ๋ฌ์ธ์๋ ๋ถํ์ํ ๋ฉด์ด ์ข ์์ด์ ์ฐจํ์ ๊ฐ์ ๋ ์ง๋ ๋ชจ๋ฅธ๋ค.
# d3.ease(type[, argumentsโฆ])
์ต์ ์ธ์ arguments ๋ฅผ ๊ฐ์ง๊ณ ์ง์ ํ type ์ ๋ด์ฅ ์ด์ง(easing) ํจ์๋ฅผ ๋ฐํํ๋ค. ์ด์ง ํจ์๋ ๋ฒ์ [0,1] ๋ด์์ ํ๋ผ๋ฏธํฐ ํ์ ๊ฐ t ๋ฅผ ์ทจํ๊ณ ์ด๋ฅผ ์ ์ฌํ ๋ฒ์๋ฅผ ๊ฐ์ง ๋ค๋ฅธ๊ฐ๊ณผ ๋งคํํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ง์ easing๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉํ๋ค. ๋ค์ ํ์ ์ ์ด์ง์ ์ง์ํ๋ค.
- linear - the identity function, t. ๋ ์์ ํจ์.
- poly(k) - raises t to the specified power k (e.g., 3). t ๋ฅผ k ๋งํผ ๊ฑฐ๋ญ์ ๊ณฑ ํด์ ์ฆ๊ฐ์ํจ๋ค.
- quad - equivalent to poly(2). poly(2)์ ๋์ผ
- cubic - equivalent to poly(3). poly(3)์ ๋์ผ
- sin - applies the trigonometric function sin. ์ผ๊ฐํจ์ sin ๋ฅผ ์ ์ฉ.
- exp - raises 2 to a power based on t. t ์ ๊ธฐ์ดํด์ 2๋ฅผ ๊ฑฐ๋ญ์ ๊ณฑ์ผ๋ก ์ฆ๊ฐํ๋ค.
- circle - the quarter circle. 1/4์ ํธ
- elastic(a, p) - simulates an elastic band; may extend slightly beyond 0 and 1.
- back(s) - simulates backing into a parking space.
- bounce - simulates a bouncy collision.
์ด๋ฐ ๋ด์ฅ ํ์ ๋ค์ ๋ค์ ๋ชจ๋๋ฅผ ์ฌ์ฉํด์ ํ์ฅ๋ ์ ์๋ค.
- in - the identity function. ๋ ์์ ์ธ ํจ์.
- out - reverses the easing direction to [1,0]. [1.0]์ผ๋ก ์ด์ง ๋ฐฉํฅ ๋ณ๊ฒฝ.
- in-out - copies and mirrors the easing function from [0,.5] and [.5,1]. [0,.5]์ [.5,1]์์ ์ด์ง ํจ์๋ฅผ ๋ณต์ ํ๊ณ ๋ฐ๋ฌ๋งํ๋ค.
- out-in - copies and mirrors the easing function from [1,.5] and [.5,0]. [1,.5]๊ณผ [.5,0]์์ ์ด์ง ํจ์๋ฅผ ๋ณต์ ํ๊ณ ๋ฐ๋ฌ๋งํ๋ค.
๊ธฐ๋ณธ ์ด์ง ํจ์๋ ์ ๋นํ slow-in slow-out ์ ๋๋ฉ์ด์ ์ ์ง์ํ๋ "cubic-in-out" ์ด๋ค.
# ease(t)
๋ฒ์ [0,1] ์์์ ํ๋ผ๋ฏธํฐ ํ์ t ๋ฅผ ์ธ์๋ก ์ฃผ๋ฉด ์ด์ง๋ ํ์์ ๋ฐํํ๋ค. ๋ฐํ๋ ๊ฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฒ์ [0,1]์์ ์๋ค. ํ์ง๋ง "elastic" ์ฒ๋ผ ๋ช ํํ ์ด์ง ํจ์์ ๋ฒ์๋ฅผ ์ฝ๊ฐ ๋์ ์๋ ์๋ค.
D3๋ ์์ฒ๊ฐ์ ํ์ด๋จธ๋ฅผ ์ต์ํ์ ์ค๋ฒํค๋๋ก ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ณ ํจ์จ์ ํ์ด๋จธ ํ๋ฅผ ๋ด๋ถ์์ ์ ์งํ๋ค. ๋ํ ์ด ํ์ด๋จธ ํ๋ ํธ๋์ง์ ์ด ๋์์ ์ผ์ด๋๊ฑฐ๋ ์์ฐจ์ ์ผ๋ก ์ผ์ด๋๋๋ก ์ค์ผ์ค ๋์์ ๋ ์ ๋๋ฉ์ด์ ํ์ด๋ฐ์ด ์ผ๊ด๋๋๋ก ๋ณด์ฅํด์ค๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ํ๋ค๋ฉด ํ์ด๋จธ ํ๋ ์ ์ฐํ๋ฉด์ ํจ์จ์ ์ธ ์ ๋๋ฉ์ด์ ์ ์ํด์ requestAnimationFrame๋ฅผ ์ฌ์ฉํ๋ค. ๋ฟ๋ง์๋๋ผ ํ์ด๋จธ ํ๋ ๋ค์ ์ด๋ฒคํธ ๋ฐ์๊ณผ์ ๊ฐ๊ฒฉ์ด ๊ธธ ๊ฒฝ์ฐ์๋ setTimeout์ ๋นํด์ ํ๋ช ํ๊ฒ ๋์ํ๋ค.
# d3.timer(function, [delay, [mark]])
์ฌ์ฉ์ ์ ์ ์ ๋๋ฉ์ด์ ํ์ด๋จธ๋ฅผ ์์ํ๋ค. ์ด ํ์ด๋จธ๋ ์ ๋ฌ์ธ์ function ์ด true๋ฅผ ๋ฐํํ ๋ ๊น์ง ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ ํจ์๋ฅผ ํธ์ถํ๋ค. ํ์ด๋จธ๋ฅผ ์์ํ๋ฉด ์ทจ์ํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก ๋์์ด ๋๋๋ฉด ํ์ด๋จธ ํจ์๊ฐ ๋ฐ๋์ true๋ฅผ ๋ฐํํด์ผ ํ๋ค.
์ ํด์ง ํ์์คํ ํ mark ์์๋ถํฐ delay ๋ฐ๋ฆฌ์ด ์ดํ์ ์ฃผ์ด์ง ํจ์ function ๋ฅผ ํธ์ถํด์ผ๋ง ํ๋ค๋ฉด ์ต์ ์ ๋ฌ์ธ์ delay ๋ฅผ ์ฌ์ฉํ๋ค. delay ๋ฅผ ๋ฐ๋ฆฌ์ด๋ฅผ ๋ํ๋ด๋ ์ ์๊ณ mark ๋ ํน์ ์์ ์ดํ๋ฅผ ๋ฐ๋ฆฌ์ด๋ก ๋ํ๋ธ ํ์์คํ ํ ์ ์๋ค. mark ๋ฅผ ์๋ตํ๋ฉด Date.now()๋ผ ๊ฐ์ ํ๋ฉฐ, ์ ์ ํ ํ์์คํ ํ๋ฅผ ์ํ data ๊ฐ์ฒด ๋ณํ์ ์ํด Date.getTime๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
function ์ด ํธ์ถ๋์ผ ํ๋ ์์ ์ด ํน์ ์์ ์์ ์๋์ ์ด๋๋ก ์ง์ ํ๊ธฐ ์ํด์ delay ์ mark ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค๋ฉด, ๋ ์ง๊ธฐ๋ฐ์ ์ฝ์์ ๋ค์ ์ฝ๋์ฒ๋ผ ํ ์ ์๋ค.
var appointment = new Date(2012, 09, 29, 14, 0, 0); // @ 29/sep/2012, 1400 hours
...
// ๋ค์๊ฐ ํน์ ๊ทธ ์ ์ ํ๋ฉด์ ์ฝ์์ ํ๊ธฐ์ํจ๋ค. delay์๋ ์์๋ ์ธ ์ ์๋ค!
d3.timer(flash_appointments_due, -4 * 3600 * 1000, appointment);
# d3.timer.flush()
ํ์ด๋จธ๋ฅผ ์ง์ฐ์์ด ์ฆ์ ์คํํ๋ค. ์ผ๋ฐ์ ์ผ๋ก '์ง์ฐ์๋' ํธ๋์ง์ ์ ์ฝ๊ฐ์ ์ง์ฐ(10ms ๋ฏธ๋ง) ํ ์คํ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง๋ฅผ ๋ ๋ฒ ๋๋๋ง ํ ๋ ์ด์ง ๊น๋ฐ์ด๋ ์์ธ์ด ๋๋ค. ๋๋ฒ์ ๋๋๋ง์ ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋๋ฌ์ ๋ ํ ๋ฒ ์ผ์ด๋๊ณ ๋์ ์ฒซ ํ์ด๋จธ ์ฝ๋ฐฑ์์ ๋ฐ๋ก ๋ค์ ์ผ์ด๋๋ค. ๋ง๋ฃ๋ ํ์ด๋จธ๋ฅผ ์ฒซ ๋ฒ์งธ ์ด๋ฒคํธ ๋ฃจํ์ ์ข ๋ฃ ์ง์ ์ ํ๋ก ์์์ ์ง์ฐ์๋ ํธ๋์ง์ ์ ๋ฐ๋ก ์คํํ๊ณ ๊น๋ฐ์์ ํผํ ์ ์๋ค.
์ฎ๊ธด์ด: Interpolation์ ๋ ๊ฐ ์ฌ์ด๋ฅผ ๋ฑ๊ฐ๊ฒฉ์ ๊ฐ๋ค๋ก ๋งค๊พธ๋ ๋ณด๊ฐ์ ๋ปํ๋ค. interpolator๋ ๊ทธ ์ญํ์ ํ๋ ํจ์๋ก ๊ตณ์ด ์ฎ๊ธฐ๋ฉด '๋ณด๊ฐ์'์ด์ง๋ง ์ ์๋ซ์ง ์๋๊ฑด ๋์ผํ๊ธฐ์ ๊ทธ๋ฅ ์ธ๋์ด '์ธํฐํด๋ ์ดํฐ'๋ก ํ๊ธฐํ๋ค.
D3๋ ์์ ๊ฐ๋ค์ ๊ฐ๋จํ ๋ณด๊ฐ(interpolate)ํ๊ธฐ ์ํ ๋ง์ ์ข ๋ฅ์ ์ธํฐํด๋ ์ดํฐ(interpolator)๋ฅผ ๋ด์ฅํ๊ณ ์๋ค. ์ธํฐํด๋ ์ดํฐ๋ ์ ์์ญ ๋ฒ์๊ฐ [0,1]์ธ ํ๋ผ๋ฏธํฐ ๊ฐ t ๋ฅผ ์์, ์ซ์, ์์ ๊ฐ๊ณผ ๋งคํํ ํจ์๋ค.
# d3.interpolate(a, b)
a , b ๋ ๊ฐ ์ฌ์ด์ ๊ธฐ๋ณธ ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ธํฐํด๋ ์ดํฐ์ ํ์
์ ์ข
๋ฃ๊ฐ b ์ ๊ธฐ๋ฐํ๋ค. b ๊ฐ ์ซ์๋ฉด, a ๋ฅผ ์ซ์๋ก ํ๋จํ๊ณ interpolateNumber๋ฅผ ์ฌ์ฉํ๋ค. b ๊ฐ ๋ฌธ์์ด์ด๋ฉด, /^(#|rgb\(|hsl\()/
ํํ์ ์์์ผ๋ก ํํ๊ฐ๋ฅํ์ง, CSS named colors ์ค ํ๋์ธ์ง ํ์ธ ์์
์ ํ๋ค. ๊ทธ๋์ b ๊ฐ ์์์ด๋ฉด, a ๋ RGB ์์์ผ๋ก ๋ณด๊ณ interpolateRgb๋ฅผ ์ฌ์ฉํ๋ค. ์ด ๋์ด ์๋๋ฉด interpolateString๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋์ ๋ฌธ์์ด์ ๋ค์ด์๋ ์ซ์๋ฅผ ๋ณด๊ฐ(interpolate) ์์
ํ๋ค. ์ด๊ฐ์ ๊ธฐ๋ณธ ์ธํฐํฌ๋ ์ดํฐ ํ์
์ ์ถ๊ฐ ํ์
์ ์ง์ํ๊ธฐ ์ํด์ d3.interpolators ๋ฐฐ์ด์ ์ฌ์ฉ์ ์ ์ ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฃ์ด์(push) ํ์ฅํ ์ ์๋ค.
# interpolate(t)
๋ฒ์ [0,1]์ ํ๋ผ๋ฏธํฐ t ๋ฅผ ๋ฐ์์, ์ฐ๊ด๋ ๋ณด๊ฐ ๊ฐ์ ๋ฐํํ๋ค. ์ธํฐํด๋ ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฅ๊ฐ ์ ์์ญ(ํน์ ๋์ ์์น๊ฐ)์ ์ถ๋ ฅ๊ฐ ์น์ญ(์์์ด๋ ํฝ์ ์ขํ์ ๋ฒ์)์ผ๋ก ๋งคํํ๊ธฐ์ํ ์ค์ผ์ผ(scale) ๊ฒฐํฉ์์ ์ฌ์ฉ๋๋ค.
# d3.interpolateNumber(a, b)
๋ ์ซ์ a, b ์ฌ์ด์ ์ซ์ํ ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ๋ฐํ ์ธํฐํด๋ ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
function interpolate(t) {
return a * (1 - t) + b * t;
}
์ฃผ์์ฌํญ: attr ๊ฐ์ ๋ฌธ์์ด์ ์์ฑํ๊ธฐ์ํด์ ์ธํฐํด๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ์ซ์ 0์์ ์์ํ๊ฑฐ๋ ๋๋๋ ๋ณด๊ฐ์์ ์ ํผํด์ผ ํ๋ค. ๋ฌธ์ํ ํ์ ๋, ๋งค์ฐ ์์ ๊ฐ์ ๊ณผํ์ ํ๊ธฐ๋ฒ(scientific notation)์ผ๋ก ๋ณํ๋ ์๋ ์๋ค. ์ด๋ ๋ฌด์๋ฏธํ ์์ฑ๊ฐ์ด๋ ์คํ์ผ ํ๋กํผํฐ ๊ฐ์ ์ผ๊ธฐํ๋ค. ์๋ฅผ ๋ค์ด, 0.0000001๋ ๋ฌธ์์ด "1e-7"๋ก ๋ณํ๋๋ค. ์ด๋ ๋ถํฌ๋ช ๋ ๊ฐ์ ๋ณด๊ฐํ ๋ ํ์คํ ๋ค์ด๋๋ค. ๊ณผํ์ ํ๊ธฐ๋ฒ์ ํผํ๊ธฐ์ํด์๋ 1e-6์์ ํธ๋์ง์ ์ ์์ํ๊ฑฐ๋ ๋๋ด์ผ ํ๋ค. 1e-6์ ๋ฌธ์์ดํ ํ ๋, ์ง์ ํ๊ธฐ๋ฒ(exponential notation)์ด ๋์ง ์๋ ๊ฐ์ฅ ์์ ๊ฐ์ด๋ค.
# d3.interpolateRound(a, b)
a, b ๋ ์ ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ ์ซ์ํ ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ด ์ธํฐํด๋ ์ดํฐ๋ interpolateNumber์ ์ ์ฌํ์ง๋ง ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์ฌ๋ฆผ ํ๋ค.
# d3.interpolateString(a, b)
๋ฌธ์์ด a, b ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ ๋ฌธ์์ด ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์ด ์ธํฐํด๋ ์ดํฐ๋ ๋ค์ ์ ๊ท์์ผ๋ก a ์ b ๋ฌธ์์ด์์ ์ซ์๋ฅผ ์ฐพ๋๋ค.
/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g
์ด ์ธํฐํด๋ ์ดํฐ๋ b ๋ฌธ์์ด์ ๋ค์ด์๋ ๊ฐ ์ซ์์ ๋ํด์ a ์์ ์ผ์นํ๋ ์ซ์๋ฅผ ์ฐพ๋๋ค. ์ผ์นํ๋ ์ซ์๋ฅผ ์ฐพ์ผ๋ฉด, interpolateNumber๋ฅผ ์ฌ์ฉํด์ ์ซ์ํ ์ธํฐํด๋ ์ดํฐ๋ฅผ ์์ฑํ๋ค. b ๋ฌธ์์ด์์ ๋จ์ ๋ถ๋ถ์ ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ๋ค. b ๋ฌธ์์ด์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ด ๋ณด๊ฐ์์ ์ ์ํ ์์๊ฐ ๋๊ณ ๋ณด๊ฐ๋ ์ซ์ ๊ฐ์ด ๊ทธ ํ ํ๋ฆฟ์ ํฌํจ๋๋ค. ์๋ฅผ ๋ค์ด, a ๊ฐ "300 12px sans-serif"์ด๊ณ b ๊ฐ "500 36px Comic-Sans"์ด๋ฉด, ํฌํจ๋ ์ซ์๋ ๋ ๊ฐ๋ค. ๋ฌธ์์ด์ ๋จ์ ๋ณํ์ง ์์ ๋ถ๋ถ์ ์ซ์๋ค ์ฌ์ด์ ๊ณต๋ฐฑ(" ")๊ณผ ์ ๋ฏธ์ฌ("px Comic-Sans")๋ค. ๊ทธ๋์ t = .5 ์์ ํด๋น ์ธํฐํด๋ ์ดํฐ์ ๊ฒฐ๊ณผ๊ฐ์ "400 24px Comic-Sans"์ด๋ค.
# d3.interpolateRgb(a, b)
๋ ์์ a, b ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ RGB ์๊ณต๊ฐ(color space) ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์์ a ์ b ์ด RBG์ผ ํ์๋ ์์ง๋ง d3.rgb๋ฅผ ์ฌ์ฉํด์ RGB๋ก ๋ณํ๋๋ค. ๋นจ๊ฐ, ์ด๋ก, ํ๋ ์ฑ๋์ ๋ถ์๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ interpolateRound์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ํ ๋ณด๊ฐ๋๋ค. ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ฐํ ๊ฐ์ RGB ์์ ๋ํ๋ด๋ ๋ฌธ์์ด์ด๋ค. ๋นจ๊ฐ์ธ ๊ฒฝ์ฐ "rgb(255,0,0)"์ด๋ค.
# d3.interpolateHsl(a, b)
๋ ์์ a, b ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ HSL ์๊ณต๊ฐ(color space) ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ์์ a ์ b ์ด HSL์ผ ํ์๋ ์์ง๋ง d3.hsl๋ฅผ ์ฌ์ฉํด์ HSL๋ก ๋ณํ๋๋ค. ์์, ์ฑ๋, ๋ช ๋๋ interpolateNumber์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ํ ๋ณด๊ฐ๋๋ค. (์์๊ณผ ๋ ์์์ฌ์ด ์ต๋จ ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋๋ค.) ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ฐํ๊ฐ์ RGB ์์์ ๋ํ๋ด๋ ๋ฌธ์์ด์ด๋ค. ๋นจ๊ฐ์ธ ๊ฒฝ์ฐ "#ff0000"์ด๋ค. RGB ์์์ผ๋ก ๋ฐํํ๋ ์ด์ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ CSS์์ HSL ์์์ ๋ชจ๋ ์ง์ํ์ง๋ ์์ผ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ์ํด์ RGB ์์ ๋ฌธ์์ด๋ก ๋ฐํํ๋ค.
# d3.interpolateLab(a, b)
๋ ์์ a, b ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ L*a*b* ์๊ณต๊ฐ(color space) ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ํ์ํ๋ค๋ฉด d3.lab๋ฅผ ์ฌ์ฉํด์ L*a*b* ๋ก ๋ณํํ๋ค. ์์ ์ฑ๋์ interpolateNumber๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ํ ๋ณด๊ฐ๋๋ค. ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ฐํ ๊ฐ์ RGB ์์ ๋ฌธ์์ด๋ก ๋ฐํํ๋ค. ๋นจ๊ฐ์ธ ๊ฒฝ์ฐ "#ff0000"์ด๋ค.
# d3.interpolateHcl(a, b)
๋ ์์ a, b ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ HCL ์๊ณต๊ฐ(color space) ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ํ์ํ๋ค๋ฉด d3.hcl๋ฅผ ์ฌ์ฉํด์ HCL๋ก ๋ณํํ๋ค. ์์ ์ฑ๋์ interpolateNumber์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ํ ๋ณด๊ฐ๋๋ค. (์์๊ณผ ๋ ์์ ์ฌ์ด ์ต๋จ ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋๋ค.) ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ฐํ ๊ฐ์ RGB ์์ ๋ฌธ์์ด๋ก ๋ฐํํ๋ค. ๋นจ๊ฐ์ธ ๊ฒฝ์ฐ "#ff0000"์ด๋ค.
# d3.interpolateArray(a, b)
๋ ๋ฐฐ์ด a, b ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ ๋ฐฐ์ด ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ ํฌํ๋ฆฟ์ b ๋ฐฐ์ด์ ๊ธธ์ด์ ๋์ผํ๊ฒ ์์ฑํ๋ค. b ๋ฐฐ์ด์ ๊ฐ ์์ ์์ธ์ ํด๋นํ๋ a ๋ฐฐ์ด์ ์์๊ฐ ์กด์ฌํ๋ฉด ๋ ์์๋ฅผ ์ํด interpolate๋ฅผ ์ฌ์ฉํ๋ ์ ๋ค๋ฆญ ์ธํฐํด๋ ์ดํฐ๊ฐ ์์ฑ๋๋ค. ์์๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ํ ํ๋ฆฟ์์ b ์ ๋ฐฐ์ด ์์๊ฐ์ ๊ณ ์ ๊ฐ์ผ๋ก ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ t ๋ฅผ ์ํ ํ ํ๋ฆฟ์ ๋ด์ฅ๋ ์ธํฐํด๋ ์ดํฐ๋ค์ ํ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ ๋ฐ์ดํธ๋ ๋ฐฐ์ด ํฌํ๋ฆฟ์ ๋ฐํํ๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ด a ๊ฐ [0, 1]์ด๊ณ ๋ฐฐ์ด b ๊ฐ [1, 10, 100] ์ด๋ฉด, ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ฐํ๊ฐ์ t = .5์ผ ๋, [.5, 5.5, 100]์ด๋ค.
์ฃผ์: ํฌํ๋ฆฟ ๋ฐฐ์ด์ ๋ฐฉ์ด ๋ณต์ฌ๋ณธ(defensive copy)์ ๋ง๋ค์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฐํ๋ ๋ฐฐ์ด์ ๋ณ๊ฒฝ์ ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ค์ ํ๊ฐ์ ์์ข์ ์ํฅ์ ์ค์๋ ์๋ค. ์ธํฐํด๋ ์ดํฐ๋ ์ ๋๋ฉ์ด์ ๋ฃจํ๋ฌธ์ ์ผ๋ถ์ผ ์ ์๋๋ก ๋นจ๋ผ์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ๋ณธ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
# d3.interpolateObject(a, b)
a ์ b ๊ฐ์ฒด ์ฌ์ด๋ฅผ ๋ณด๊ฐํ๋ ๊ฐ์ฒด ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ๊ฐ์ฒด๋ณ ํ ํ๋ฆฟ์ b ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์ผํ ํ๋กํผํฐ๋ฅผ ์์ฑํ๋ค. a ๊ฐ์ฒด์ b ๊ฐ์ฒด์ ํ๋กํผํฐ์ ์ผ์นํ๋ ํ๋กํผํฐ๊ฐ ์๋ค๋ฉด interpolate๋ฅผ ์ฌ์ฉํด์ ๋ ํ๋กํผํฐ๊ฐ์ ์ ๋ค๋ฆญ ์ธํฐํด๋ ์ดํฐ๋ฅผ ์์ฑํ๋ค. ์ผ์นํ๋ ํ๋กํผํฐ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ํ ํ๋ฆฟ์ b ๊ฐ์ฒด์ ํ๋กํผํฐ ๊ฐ์ ๊ณ ์ ๊ฐ์ผ๋ก ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ t ๋ฅผ ์ํ ํฌํ๋ฆฟ์ ๋ด์ฅ๋ ์ธํฐํด๋ ์ดํฐ๋ค์ ํ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ ๋ฐ์ดํธ๋ ๋ฐฐ์ด ํฌํ๋ฆฟ์ ๋ฐํํ๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ฒด a ๊ฐ {x: 0, y: 1}์ด๊ณ ๊ฐ์ฒด b ๊ฐ {x: 1, y: 10, z: 100}์ด๋ฉด, ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ฐํ๊ฐ์ t = .5์ผ ๋, {x: .5, y: 5.5, z: 100}์ด๋ค.
๊ฐ์ฒด ๋ณด๊ฐ์์ ์ ๋ฐ์ดํฐ๊ฐ ์์ฑ์ด ์๋ ๋ณด๊ฐ๋๋ ๋ฐ์ดํฐ์คํ์ด์ค ๋ณด๊ฐ์์ (dataspace interpolation) ์ ํนํ ์ ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ํ์ด ์ฐจํธ์ ํธ(arc)๋ฅผ ๊ธฐ์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ณด๊ฐํ๋ ๊ฒฝ์ฐ ์ ๊ท SVG ํจ์ค ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด์ d3.svg.arc๋ฅผ ์ฌ์ฉํ๋ค.
์ฃผ์: ํฌํ๋ฆฟ ๊ฐ์ฒด์ ๋ฐฉ์ด ๋ณต์ฌ๋ณธ(defensive copy)์ ๋ง๋ค์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฐํ๋ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ์ด ์ธํฐํด๋ ์ดํฐ์ ๋ค์ ํ๊ฐ์ ์์ข์ ์ํฅ์ ์ค์๋ ์๋ค. ์ธํฐํด๋ ์ดํฐ๋ ์ ๋๋ฉ์ด์ ๋ฃจํ๋ฌธ์ ์ผ๋ถ์ผ ์ ์๋๋ก ๋นจ๋ผ์ผ๋ง ํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ๋ณธ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
# d3.interpolateTransform(a, b)
a ์ b ๋ก ํํ๋๋ ๋๊ฐ์ 2D ์ํ(affine) ๋ณํ(transform) ์ฌ์ด์ ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ๊ฐ ๋ณํ์ ํ์ค ํํ์ธ ์ด๋(translate), ํ์ (rotate), x์ถ ๋นํ๊ธฐ(x-skew), ํฌ๊ธฐ๋ณ๊ฒฝ(scale)์ผ๋ก ๋ถํดํด์ ๊ฐ ๋ณํ ์ปดํฌ๋ํธ๋ค์ด ๋ณด๊ฐ๋๋ค. ์ด๋ CSS์ ํ์คํ๋์ด์๋ ๋์์ด๋ค. matrix decomposition for animation๋ฅผ ์ฐธ๊ณ ํ๋ผ.
(์ญ์์ฃผ) affine transform์ HTML ์บ๋ฒ์ค์ CSS์์ ์ฌ์ฉํ๋ 2D ๊ธฐํํ ๋ณํ๋ฒ์ด๋ค.
# d3.geo.interpolate(a, b)
d3.geo.interpolate๋ฅผ ์ฐธ๊ณ ํ๋ผ.
# d3.interpolators
d3.interpolate์์ ์ฌ์ฉํ๋ ๋ด์ฅ ์ธํฐํด๋ ์ดํฐ ํฉํ ๋ฆฌ ๋ฐฐ์ด์ด๋ค. ์ด ๋ฐฐ์ด์ ๋์ ํ์ฅ ์ธํฐํด๋ ์ดํฐ ํฉํ ๋ฆฌ๋ฅผ ์ถ๊ฐ(push)ํ ์ ์๋ค. ์ ๋ฌ์ธ์๋ก ๋๊ธฐ๋ ๋๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ํ ๋ณด๊ฐ์ ์ง์ํ๋ฉด ๊ฐ ํฉํ ๋ฆฌ๋ ์ธํฐํด๋ ์ดํฐ ํจ์๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํฉํ ๋ฆฌ๋ false ๊ฐ์ ๋ฐํํ๊ณ ๋ค๋ฅธ ์ธํฐํด๋ ์ดํฐ๋ฅผ ์๋ํด๋ณธ๋ค. ์ด ๋ฐฐ์ด์ ์ด๊ธฐ๊ฐ์ ์๋ํ๋ ์์๋๋ก ๋ค์๊ณผ ๊ฐ๋ค.
- interpolateNumber - ํ์ ์ด ์ซ์์ธ ๊ฒฝ์ฐ
- interpolateRgb - ํ์ ์ด ์์์ธ ๊ฒฝ์ฐ
- interpolateString - ํ์ ์ด ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ
- interpolateArray - ํ์ ์ด ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ
- interpolateObject - ๋ง์ง๋ง ์ข ์ฐฉ์ง
์๋ฅผ ๋ค์ด, ํํ ํ๊ธฐ(๋ฌ๋ฌ์ ์ผํธ)๋ฅผ ์ํ ์ฌ์ฉ์ ์ ์ ์ธํฐํด๋ ์ดํฐ๋ฅผ ๋ฑ๋กํ๋ ๊ฒฝ์ฐ์, ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.
d3.interpolators.push(function(a, b) {
var re = /^\$([0-9,.]+)$/, ma, mb, f = d3.format(",.02f");
if ((ma = re.exec(a)) && (mb = re.exec(b))) {
a = parseFloat(ma[1]);
b = parseFloat(mb[1]) - a;
return function(t) {
return "$" + f(a + b * t);
};
}
});
d3.interpolate("$20", "$10")(1/3)
๋ $16.67
๋ฅผ ๋ฐํํ๋ค.