[CS] ๋ฒ ์ง์ ๊ณก์ ์๋ฆฌ ์ดํดํ๊ธฐ feat. ์นด์คํ ์กฐ ์๊ณ ๋ฆฌ์ฆ
CSS์์ ์ ๋๋ฉ์ด์ ์ด๋ ์ ํ ํจ๊ณผ๋ฅผ ์ ์ดํ ๋ ํ์ด๋ฐ ํจ์(๊ฐ์๋ ๊ณก์ )๋ฅผ ์ฌ์ฉํ๋ค. ํ์ด๋ฐ ํจ์๋ ์ ๋๋ฉ์ด์ ์ด ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ๋๋ ๋๋ฆฌ๊ฒ ์์ํ๊ณ ๋๋๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ํ์ ์ธ ํจ์๋ค. ์ฝ๊ฒ ๋งํด ์ ๋๋ฉ์ด์ ์ ์๋ ๋ณํ๋ฅผ ์ ์ดํ๋ ์ญํ ์ ํ๋ค.
Tailwind CSS๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ease-in
, ease-out
, ease-in-out
๋ฑ ๋ฏธ๋ฆฌ ์ ์๋์ด ์๋ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ๋ค์ํ ๊ฐ์๋ ๊ณก์ ์ ์ ์ฉํ ์ ์๋ค.
<!--
transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
transition-duration: 300ms;
-->
<button class="ease-in duration-300 ...">Button A</button>
์๋ฅผ ๋ค์ด ease
๋ ๋ถ๋๋ฝ๊ฒ ์์ํด์ ๋ถ๋๋ฝ๊ฒ ๋๋๊ณ (์ผ๋ฐ์ ์ธ ๊ฐ์๋ ๊ณก์ ), ease-in
์ ๋๋ฆฌ๊ฒ ์์ํด์ ๋น ๋ฅด๊ฒ ๋๋๋ ํจ๊ณผ๋ฅผ ์ค ๋ ์ฌ์ฉํ๋ค.
์ฌ์ค ease
, ease-in
, ease-out
, ease-in-out
๋ฑ์ CSS์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ํ์ด๋ฐ ํจ์(easing function) ํ๋ฆฌ์
์ด๋ค. ๊ฐ ๊ฐ์ ์๋์ฒ๋ผ cubic-bezier ๊ณก์ ์ผ๋ก ๋ฏธ๋ฆฌ ์ ์๋์ด ์๋ค.
ease /* cubic-bezier(0.25, 0.1, 0.25, 1) */
ease-in /* cubic-bezier(0.42, 0, 1, 1) */
ease-out /* cubic-bezier(0, 0, 0.58, 1) */
ease-in-out /* cubic-bezier(0.42, 0, 0.58, 1) */
...
๋ฒ ์ง์ ๊ณก์ ์ ์ปดํจํฐ ๊ทธ๋ํฝ์ค์์ ๋ถ๋๋ฌ์ด ๊ณก์ ์ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ํ์ ๊ณก์ ์ผ๋ก, ์กฐ์ ์ (control point)์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ ๋ค์ ์งํฉ์ผ๋ก ์ ์๋๋ค. n
๊ฐ์ ์กฐ์ ์ ์ด ์ฃผ์ด์ง๋ฉด n-1
์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ๋ง๋ค ์ ์๋ค.
CSS์์ ์ฌ์ฉํ๋ cubic-bezier() ํจ์๋ 4๊ฐ์ ์กฐ์ ์ (Pโ, Pโ, Pโ, Pโ)์ผ๋ก ๊ตฌ์ฑ๋ 3์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ์ด ์ค ์์์ (Pโ)๊ณผ ๋์ (Pโ)์ ํญ์ (0, 0)๊ณผ (1, 1)๋ก ๊ณ ์ ๋์ด ์๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก๋ ์ค๊ฐ์ ์๋ ๋ ์ ์ด์ (Pโ, Pโ)๋ง ์ง์ ์ค์ ํ๋ค.
/* cubic-bezier(P1.x, P1.y, P2.x, P2.y) ํํ๋ก ์ฌ์ฉ */
transition: width 1s cubic-bezier(0.12, 0.83, 0.92, 1);
/* x ์ขํ(์ง์์๊ฐ)๋ ๋ฐ๋์ [0, 1] ๋ฒ์ ๋ด์ ์์ด์ผ ํจ */
cubic-bezier(0.25, 0.1, 0.75, 1.0) /* โ
*/
cubic-bezier(1.5, 0.1, 0.75, 1.0) /* โ */
/* y ์ขํ(์งํ๋ฅ )๋ [0, 1] ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ์์ผ๋ฉฐ, ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ๋ฐ์ด์ฑ ํจ๊ณผ ์์ฑ */
cubic-bezier(0.1, -0.6, 0.2, 2.0)
ํํธ, ๋ฒ ์ง์ ๊ณก์ ์ ์นด์คํ
์กฐ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋ง๋ค ์ ์๋ค. ์ฃผ์ด์ง ์กฐ์ ์ ์ ์ ๋ถ(์์์ ๊ณผ ๋์ ์ด ์ ํด์ง ์ง์ )์ผ๋ก ์ฐ๊ฒฐํ ํ, ๊ฐ ์ ๋ถ์ ๋์ผํ ๋น์จ t
๋ก ๋ด๋ถ(์ ๋ถ์ ์ฃผ์ด์ง ๋น์จ๋ก ๋๋; ์ ํ ๋ณด๊ฐ)ํ์ฌ ์๋ก์ด ์ ๋ค์ ๊ตฌํ๋ ๊ณผ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ๋ ์ ์ฌ์ด์ ์ ๋ถ์ ํน์ ๋น์จ t
๋ก ๋๋๋ ์ฐ์ฐ์ ๋ด๋ถ ํน์ ์ ํ ๋ณด๊ฐ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ ์ ๊ฐ์๊ฐ 1๊ฐ๋ง ๋จ์ ๋๊น์ง ์ ํ ๋ณด๊ฐ์ ๋ฐ๋ณตํ๋ฉด, ์ต์ข ์ ์ผ๋ก ๋จ์ ์ ์ด ๋ฒ ์ง์ ๊ณก์ ์์ ์ขํ๊ฐ ๋๋ค. ์ฆ, ์นด์คํ ์กฐ ์๊ณ ๋ฆฌ์ฆ์ ์ ํ ๋ณด๊ฐ์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ์ฌ ๊ณก์ ์ ์ ์ ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ค.
๊ธ๋ง ๋ณด๋ฉด ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์๋ ์์ผ๋ 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ๋ถํฐ ํ๋ํ๋ ๋ง๋ค์ด๋ณด์.
๐ ๋ณด๊ฐ (ๆๅผ, Interpolation)
๋ณด๊ฐ์ ์ด๋ฏธ ์๊ณ ์๋ ์ฌ๋ฌ ์ง์ ์ ๊ธฐ๋ฐ์ผ๋ก, ๊ทธ ์ฌ์ด์ ์๋ ค์ง์ง ์์ ๊ฐ์ ์ถ๋ก ํ๋ ๋ชจ๋ ๊ณผ์ ์ ๊ฐ๋ฆฌํจ๋ค. ํ์ ๋ป ๊ทธ๋๋ก ์ฌ์ด(้)๋ฅผ ๋ณด์ถฉ(่ฃ)ํ๋ค๋ ์๋ฏธ. ์๋ฅผ ๋ค์ด $x=0$์ผ ๋ ๊ฐ์ด $0$์ด๊ณ $x=10$์ผ ๋ ๊ฐ์ด $100$์ด๋ผ๋ฉด, ๊ทธ ์ฌ์ด์ธ $x=3$์ด๋ $x=7$์ ๊ฐ์ ์ถ์ ํ๋ ๊ณผ์ ์ด ๋ฐ๋ก ๋ณด๊ฐ์ด๋ค.
๐ ์ ํ ๋ณด๊ฐ (็บฟๆงๆๅผ, Linear Interpolation)
์ ํ ๋ณด๊ฐ์ ์ด๋ฌํ ๋ณด๊ฐ ๊ธฐ๋ฒ ์ค ๊ฐ์ฅ ๋ํ์ ์ด๊ณ ๊ฐ๋จํ ๋ฐฉ๋ฒ. ์ ํ ๋ณด๊ฐ์ ์๋ ค์ง ๋ ์ ์ ์ง์ ์ผ๋ก ์๋๋ค๊ณ ๊ฐ์ ํ๊ณ , ๊ทธ ์ง์ ์์ ์ค๊ฐ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฐฉ์์ด๋ค. ์ค์ฌ์ Lerp๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์ฐธ๊ณ ๋ก ์ ํ์ ์ง์ ํํ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
2์ฐจ ๋ฒ ์ง์ ๊ณก์
๋จผ์ A
, B
, C
์กฐ์ ์ 3๊ฐ๋ฅผ ์ง์ ์ผ๋ก ์๋๋ค. ๊ทธ๋ผ AB
, BC
2๊ฐ์ ์ ๋ถ์ด ์๊ธด๋ค.
๊ฐ ์ ๋ถ์ ๋์ผํ ๋น์จ t
(0 ≤ t ≤ 1)๋ก ๋๋๋ค(๋ด๋ถ). ์๋ฅผ ๋ค์ด t
๊ฐ 0.3์ด๋ผ๋ฉด A
์์ B
๋ฐฉํฅ์ผ๋ก 30% ์ด๋ํ ์ง์ D
์, B
์์ C
๋ฐฉํฅ์ผ๋ก 30% ์ด๋ํ ์ง์ E
๊ฐ ๋ง๋ค์ด์ง๋ค.
์ D
์ E
๋ฅผ ๋ค์ ์ง์ ์ผ๋ก ์ด์ด ์๋ก์ด ์ ๋ถ DE
๋ฅผ ๋ง๋ ๋ค.
์ด ์ ๋ถ์์ ๋ค์ t
๋งํผ ์ด๋ํ ์ง์ F
๋ฅผ ๊ตฌํ๋ค. ์ ์ด F
ํ๋๋ง ๋จ์์ผ๋ฏ๋ก ์ด ์ง์ ์ด ๋ฒ ์ง์ ๊ณก์ ์ ์ขํ๊ฐ ๋๋ค.
t
๊ฐ์ 0๋ถํฐ 1๊น์ง ์กฐ๊ธ์ฉ ์ฆ๊ฐ์ํค๋ฉฐ(0.05, 0.1, …, 0.95, 1) ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด, ์ฌ๋ฌ ๊ฐ์ ์ ์ด ์์ฑ๋๊ณ , ์ด ์ ๋ค์ ์์๋๋ก ์ด์ผ๋ฉด 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ด ์์ฑ๋๋ค.
์๋ ์ฝ๋ํ์์ Start Animation ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ณก์ ์ด ๊ทธ๋ ค์ง๋ ๊ณผ์ ์ ์ง์ ํ์ธํด ๋ณผ ์ ์๋ค.
See the Pen Quadratic Bezier Curves 2์ฐจ ๋ฒ ์ง์ ๊ณก์ by ColorFilter (@colorfilter) on CodePen.
3์ฐจ ๋ฒ ์ง์ ๊ณก์
3์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ์กฐ์ ์ 4๊ฐ๋ก ์ด๋ฃจ์ด์ง๋ค. ๊ณก์ ์ ๋ง๋๋ ๊ธฐ๋ณธ ์๋ฆฌ๋ 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ๊ณผ ๋์ผํ์ง๋ง, ์กฐ์ ์ ์ด ํ๋ ๋์ด๋ฌ๊ธฐ ๋๋ฌธ์ ์ ํ ๋ณด๊ฐ ๊ณผ์ ์ด ํ ๋ฒ ๋ ๋ฐ๋ณต๋๋ค.
๋จผ์ A
, B
, C
, D
์กฐ์ ์ 4๊ฐ๋ฅผ ์ง์ ์ผ๋ก ์๋๋ค.
AB
, BC
, CD
๊ฐ ์ ๋ถ์ ๋์ผํ ๋น์จ t
๋ก ๋ด๋ถํ๋ค.
๋ด๋ถํ์ฌ ์๊ธด ์ E
, F
, G
๋ฅผ ์ด์ด ์๋ก์ด ์ ๋ถ EF
, FG
์ ๋ง๋ ๋ค.
์๋ก์ด ์ ๋ถ์ ๋ค์ t
๋ก ๋ด๋ถํ์ฌ ์ H
, I
๋ฅผ ๋ง๋ ๋ค.
๋ด๋ถํ์ฌ ์๊ธด ์ ์ ์ง์ ์ผ๋ก ์ด์ด ์ ๋ถ HI
๋ฅผ ๋ง๋ ๋ค.
์ ๋ถ์ ๋ค์ t
๋งํผ ๋ด๋ถํ์ฌ ์ J
๋ฅผ ๊ตฌํ๋ค. ์ ์ด 1๊ฐ๋ง ๋จ์์ผ๋ฏ๋ก ์ด ์ง์ ์ด ๋ฒ ์ง์ด ๊ณก์ ์ ์ขํ๊ฐ ๋๋ค.
3์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ด ๋ง๋ค์ด์ง๋ ์์ธํ ๊ณผ์ ์ ์๋ ์ฝ๋ํ์ ์ฐธ๊ณ ํ์.
See the Pen Cubic Bezier Curves 3์ฐจ ๋ฒ ์ง์ ๊ณก์ by ColorFilter (@colorfilter) on CodePen.
๋ฒ ์ง์ ๊ณก์ ์ํ ๊ณต์ ์ดํดํ๊ธฐ
1์ฐจ ๋ฒ ์ง์ ๊ณก์ (์กฐ์ ์ 2๊ฐ)
1์ฐจ ๋ฒ ์ง์ ๊ณก์ (์กฐ์ ์ 2๊ฐ)์ ์๋ ์ํ ๊ณต์์ผ๋ก ํํํ ์ ์๋ค. — ์ ํ ๋ณด๊ฐ ๊ณต์
$$ P = (1-t)P_1 + tP_2 $$
$P_1$์ ์์์ , $P_2$๋ ๋์ , $t$๋ ์งํ๋ฅ (0 ์ด์ 1 ์ดํ, 0์ด๋ฉด ์ถ๋ฐ 1์ด๋ฉด ๋์ฐฉ), $P$๋ $t$์ ๋ฐ๋ผ $P_1$์์ $P_2$๋ก ์ด๋ํ ์์น(์งํ๋ฅ )๋ฅผ ๋ํ๋ธ๋ค.
์๋ฅผ ๋ค์ด $t = 0$์ผ ๋ $P$๋ $P_1$๊ณผ ์ ํํ ์ผ์นํ๋ค.
$$ \begin{aligned} t &= 0 \\ P &= (1 - 0)P_1 + 0 \cdot P_2 \\ &= 1 \cdot P_1 + 0 \\ &= P_1 \end{aligned} $$
$t = 0.3$์ ์ถ๋ฐ์ $P_1$์์ ๋์ $P_2$ ๋ฐฉํฅ์ผ๋ก ์ ์ฒด ๊ฑฐ๋ฆฌ์ 30% ๋งํผ ์ด๋ํ ์ง์ ์ ์๋ฏธํ๋ค. ์ด ์ง์ ์ ์์น $P$๋ $P_1$๊ณผ $P_2$ ์์น์ ๊ฐ๊ฐ ๊ฐ์ค์น๋ฅผ ๊ณฑํ์ฌ ๋ํ๋ ๊ฐ์ค ํ๊ท (weighted average) ๋ฐฉ์์ผ๋ก ๊ณ์ฐํ ์ ์๋ค. ๊ฐ์ค ํ๊ท ์ ์์น๊ฐ ๋ ๊ฐ๊น์ด ์ง์ ์ ๋ ํฐ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ค. $t = 0.3$ ์ผ ๋ $P$๋ $P_1$์์ 30% ๋งํผ ๋จ์ด์ ธ ์๊ณ , $P_2$์ 70% ๋งํผ ๋จ์ด์ ธ ์์ผ๋ฏ๋ก $P_1$์ ๋ ๊ฐ๊น๋ค. ๋ฐ๋ผ์ $P_1$์ ๊ฐ์ค์น๋ฅผ 70%, $P_2$์ ๊ฐ์ค์น 30%๋ฅผ ์ ์ฉํ์ฌ ๊ฒฐ๊ณผ์ ์ผ๋ก $P = 0.7 \cdot P_1 + 0.3 \cdot P_2$ ์์์ด ์์ฑ๋๋ค.
$$ \begin{aligned} t &= 0.3 \\ P &= (1 - 0.3)P_1 + 0.3 \cdot P_2 \\ &= 0.7 \cdot P_1 + 0.3 \cdot P_2 \end{aligned} $$
$t = 1$์ผ ๋ $P$๋ $P_2$์ ์ ํํ ์ผ์นํ๋ค.
$$ \begin{aligned} t &= 1 \\ P &= (1 - 1)P_1 + 1 \cdot P_2 \\ &= 0 \cdot P_1 + 1 \cdot P_2 \\ &= 0 + P_2 \\ &= P_2 \end{aligned} $$
1์ฐจ ๋ฒ ์ง์ ๊ณก์ (์ ํ ๋ณด๊ฐ) ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ด ์์์ ์ ๊ฐํ์ฌ ๋ณด๋ค ์ง๊ด์ ์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
$$ \begin{aligned} P &= P_1-tP_1+tP_2 \\ &= P_1+tP_2-tP_1 \\ &= P_1+t(P_2-P_1) \end{aligned} $$
2์ฐจ ๋ฒ ์ง์ ๊ณก์ (์กฐ์ ์ 3๊ฐ)
์กฐ์ ์ ์ด 3๊ฐ์ผ ๋ ๊ณต์์ ์๋์ ๊ฐ๋ค. 1์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ์๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ ๊ฒ์ผ๋ก ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ ๋ค๋ฅด์ง ์๋ค. ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ์๋ ๊ณต์์ด ๋์ถ๋๋์ง ํ๋ํ๋ ์ดํด๋ณด์.
$$ P = (1 - t)^2 P_1 + 2(1 - t)t P_2 + t^2 P_3 $$
๋จผ์ 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ํ์ํ 3๊ฐ์ ์กฐ์ ์ —์์ $P_1$, ์ค๊ฐ $P_2$, ๋ $P_3$—์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์. ์ด ์ธ ์ ์ ์ด์ฉํด ๋ ๊ฐ์ ๋์ ์ธ ์ ์ ๋ง๋ ๋ค.
- $P_1$์์ $P_2$๋ก ์ด๋ํ๋ ์ $Q_1 = (1-t)P_1+tP_2$
- $P_2$์์ $P_3$์ผ๋ก ์ด๋ํ๋ ์ $Q_2 = (1-t)P_2+tP_3$
๋งค๊ฐ๋ณ์ $t$๊ฐ 0์์ 1๋ก ๋ณํจ์ ๋ฐ๋ผ, $Q_1$์ $P_1$์์ $P_2$๋ก, $Q_2$๋ $P_2$์์ $P_3$์ผ๋ก ์ผ์ ํ๊ฒ(์ ํ์ ) ์ด๋ํ๋ค. 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ์์ ์ต์ข ์ ์ธ ์ $P$๋ ์ด๋ ๊ฒ ์์ง์ด๋ ๋ ์ $Q_1$, $Q_2$๋ฅผ ๋ค์ $t$์ ๋ํด ์ ํ ๋ณด๊ฐํ์ฌ ์ป์ ์ ์๋ค. ์ฆ, $Q_1$์ ์์์ ์ผ๋ก $Q_2$๋ฅผ ๋์ ์ผ๋ก ๊ฐ๋ ๋ ๋ค๋ฅธ 1์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ๋ง๋๋ ๊ฒ์ด๋ค.
$$ P = (1-t)Q_1 + tQ_2 $$
์ด์ ์ ๊ณต์์ $Q_1$๊ณผ $Q_2$ ์ ์๋ฅผ ๊ฐ๊ฐ ๋์ ํด ๋ณด์.
$$ \begin{aligned} P &= (1-t){\color{cyan}Q_1} + {\color{orange}tQ_2} \\ &= (1-t){\color{cyan}((1-t)P_1 + tP_2)} + {\color{orange}t((1-t)P_2 + tP_3)} \end{aligned} $$
๋ถ๋ฐฐ๋ฒ์น์ ์ด์ฉํด ๊ณฑ์ ์ ์ ๊ฐํ๋ค.
$$ P = {\color{cyan}(1-t)(1-t)P_1 + (1-t)tP_2} + {\color{orange}t(1-t)P_2 + t \cdot tP_3} $$
๊ฑฐ๋ญ์ ๊ณฑ(²)์ ์ฌ์ฉํด์ ์์ ์ ๋ฆฌํ๋ค.
$$ P = {\color{yellowgreen}(1-t)^2P_1} + (1-t)tP_2 + t(1-t)P_2 + {\color{yellowgreen}t^2P_3} $$
๊ฐ์ด๋ฐ ์๋ 2๊ฐ์ $P_2$ ํญ์ ๊ณฑ์ ์์๋ง ๋ค๋ฅผ ๋ฟ ๋์ผํ๋ฏ๋ก(๋๋ฅํญ) ํ๋๋ก ํฉ์ณ์ค๋ค. ๊ทธ๋ผ 2์ฐจ ๋ฒ ์ง์ ๊ณก์ ์ ๊ณต์์ด ์์ฑ๋๋ค.
$$ P = (1-t)^2P_1+{\color{yellowgreen}2(1-t)tP_2}+t^2P_3 $$
3์ฐจ, 4์ฐจ ๋ฑ ๋ ๋์ ์ฐจ์์ ๋ฒ ์ง์ ๊ณก์ ๋ ์์ ๋์ผํ ์๋ฆฌ๊ฐ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉ๋์ด ๋ง๋ค์ด์ง๋ค.
์ฐธ๊ณ ๋ก ๊ฐ ์กฐ์ ์ ์์ ๊ณฑํด์ง $(1-t)^2$, $2(1-t)t$, $t^2$ ๊ฐ์ ํญ๋ค์ ๋ฒ์คํ์ธ ๊ธฐ์ ๋คํญ์(Bernstein basis polynomials) ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ฌํ ํญ๋ค์ $t$ ๊ฐ์ ๋ฐ๋ผ ๊ฐ ์กฐ์ ์ ์ด ๊ณก์ ์์ ์ $P$์ ์ผ๋ง๋ ํฐ ์ํฅ(๊ฐ์ค์น)์ ๋ฏธ์น๋์ง ๊ฒฐ์ ํ๋ค.
๋ฒ ์ง์ ๊ณก์ ์ ๊ธฐ์ธ๊ธฐ
์๋๋ ๋ค์ํ ๋ฒ ์ง์ ๊ณก์ ์์.
๋ฒ ์ง์ ๊ณก์ ๊ทธ๋ํ์์ x์ถ์ ์๊ฐ์ ํ๋ฆ(์ง์ ์๊ฐ), y์ถ์ ์ ๋๋ฉ์ด์ ์ ์งํ๋ฅ ์ ๋ํ๋ธ๋ค. ์ด๋ ๊ณก์ ์ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ทธ ์๊ฐ์ ์๋๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์ธ๊ธฐ๊ฐ ๊ฐํ๋ฅผ์๋ก ๋น ๋ฅด๊ฒ, ์๋งํ ์๋ก ๋๋ฆฌ๊ฒ ์์ง์ด๋ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.
x์ถ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฒด ์ง์์๊ฐ์ 1๋ก ์ ๊ทํํ์ผ๋ฏ๋ก ํญ์ 0~1 ๋ฒ์๋ก ์ง์ ํด์ผ ํ์ง๋ง, y์ถ์ ๋ชฉํ๊ฐ 1์ ๋์ด์ฐ๋ค๊ฐ ๋ค์ ๋์์ค๋ ํจํด์ ํ์ฉํด์ ๋ฐ์ด์ค ํจ๊ณผ๋ฅผ ๋ง๋ค ์ ์๋ค.
[0 → 0.5 → 0.8] → [1.1] → [0.95 → 1.02 → 0.98] → [1.0]
๊ฐ์๊ตฌ๊ฐ ์ค๋ฒ์ํธ ๋ฐ์ด์ค ๋๋ฌ
- ๊ฐ์ ๊ตฌ๊ฐ (0 → 0.8): ๊ธฐ์ธ๊ธฐ๊ฐ ์ฆ๊ฐํ๋ฉด์ ์ ์ ๋นจ๋ผ์ง
- ์ค๋ฒ์ํธ (1.1): y ๊ฐ์ด 1.1์ ๋๋ฌํ์ ๋ ์๊ฐ์ ์ผ๋ก ์๋๊ฐ 0์ด ๋ ํ ์ด๋ ๋ฐฉํฅ ์ ํ
- ๋ฐ์ด์ค (0.95 → 1.02 → 0.98): ๋ชฉํ๊ฐ์ ์ค์ฌ์ผ๋ก y๊ฐ์ด ์์๋๋ก ์ฌ๋ฌ ๋ฒ ์ถ๋ ์ด๋ ๊ตฌ๊ฐ
- ๋๋ฌ (1.0): ๋ชฉํ๊ฐ์ ๋๋ฌํ์ฌ ๋ฉ์ถ๋ ๊ตฌ๊ฐ
์๋ฅผ ๋ค์ด cubic-bezier(0.34, 1.56, 0.64, 1)
์ฒ๋ผ ์ค์ ํ๋ฉด ์ค๋ฒ์ํธ ํจ๊ณผ๋ฅผ ๋ง๋ค ์ ์๋ค. ์ฐธ๊ณ ๋ก ์ค๋ฒ์ํธ(Overshoot)๋ ๋ชฉํ ์ง์ (1)์ ์๋์ ์ผ๋ก ๋์ด๊ฐ๋ค๊ฐ ๋ค์ ๋ชฉํ ์ง์ ์ผ๋ก ๋๋์์ค๋ ์์ง์์ด๊ณ , ์ธ๋์ํธ(Undershoot)๋ ๋ฐ๋๋ก ์์ ์ง์ (0) ๋ณด๋ค ๋ ๋ค๋ก ๊ฐ๋ค๊ฐ ๋ค์ ๋ชฉํ ์ง์ ์ผ๋ก ํฅํ๋ ์์ง์์ ์๋ฏธํ๋ค.
๋ ํผ๋ฐ์ค
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] async ํจ์๊ฐ await๋ฅผ ๋ง๋ฌ์ ๋ ๋์ ํ๋ฆ (1) | 2025.06.14 |
---|---|
[CSS] grid-row ๋์ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ (0) | 2025.06.03 |
[HTTP] ETag ์ํฐํฐ ํ๊ทธ ํค๋ (0) | 2025.05.05 |
[JS] ์๋ฐ์คํฌ๋ฆฝํธ 6์ค๋ก ์ด๋ฏธ์ง ๋น๊ต ์ฌ๋ผ์ด๋ ๋ง๋ค๊ธฐ (0) | 2025.04.17 |
[HTTP] Cache-Control ํค๋ (0) | 2025.03.31 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] async ํจ์๊ฐ await๋ฅผ ๋ง๋ฌ์ ๋ ๋์ ํ๋ฆ
[JS] async ํจ์๊ฐ await๋ฅผ ๋ง๋ฌ์ ๋ ๋์ ํ๋ฆ
2025.06.14 -
[CSS] grid-row ๋์ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ
[CSS] grid-row ๋์ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ
2025.06.03 -
[HTTP] ETag ์ํฐํฐ ํ๊ทธ ํค๋
[HTTP] ETag ์ํฐํฐ ํ๊ทธ ํค๋
2025.05.05 -
[JS] ์๋ฐ์คํฌ๋ฆฝํธ 6์ค๋ก ์ด๋ฏธ์ง ๋น๊ต ์ฌ๋ผ์ด๋ ๋ง๋ค๊ธฐ
[JS] ์๋ฐ์คํฌ๋ฆฝํธ 6์ค๋ก ์ด๋ฏธ์ง ๋น๊ต ์ฌ๋ผ์ด๋ ๋ง๋ค๊ธฐ
2025.04.17