GJK์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ๋ค์ํ ํํ์ ๋ํ๋ค์ ์ถฉ๋ํ์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์ด์์
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ํ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ์๋๊ฒ ์๋๊ณ , ์ ๊ฐ ์ดํดํ ๋ฒ์ ์์์๋ง ์ฐ๋ ๋ด์ฉ๋ค์ด๋ผ
ํ๋ฆฌ๊ฑฐ๋ ์ ํํ์ง ์์ ๋ด์ฉ๋ค์ด ์์์๋ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
1. ๋ชฉ์ฐจ
์ด๋ฒ ๊ธ์์ ๋ค๋ฃฐ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์์
์ฒซ๋ฒ์งธ๋กย ์ค๋ธ์ ํธ์ ์ถฉ๋์ ์ข ๋ฅ์ ๋ํด ์ดํด๋ณด๊ณ , ์ฌ๋ฌ ์ถฉ๋ํ์ ๋ฐฉ๋ฒ๋ค์ ๊ฐ๋ตํ๊ฒ ์ดํด๋ณผ ๊ฑฐ์์
๋๋ฒ์งธ๋ก GJK์ถฉ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ๋ก ๊ณก์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ํ์ ๋ค๊ฐํ์ผ๋ก ๊ฐ๋ตํํ๋ ๋ฐฉ๋ฒ, ๊ธฐ์ธ์ด์ง ๋ค๋ฉด์ฒด์ ์ขํ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณธ ๋ค์
๋ง์ง๋ง์ผ๋ก ์ถฉ๋๊ฐ์ง์ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋ํด์ ์ด์ผ๊ธฐํ ๊ฑฐ์์
2. ๋ํ๋ค์ ์ถฉ๋์ ์ฌ๋ฌ ํํ
์์ ์ฌ๋ ค๋์ ๊ทธ๋ฆผ์ ๋ค๊ฐํ๋ค์ ๋ค์ํ ์ถฉ๋๋ฐฉ์์ ๋ํด ์ค๋ช ํ๋ ๊ทธ๋ฆผ์ด์์
1. ์ถฉ๋์ ํ ๋ค๊ฐํ์ ํ๊ฐ ํน์ ์ฌ๋ฌ๊ฐ์ ๊ผญ์ง์ ์ด ๋ค๋ฅธ ๋ค๊ฐํ ๋ด๋ถ์ ํฌํจ๋๋๊ฑฐ์์
2. ํฌํจ์ ํ ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ ์ด ๋ค๋ฅธ ๋ค๊ฐํ ๋ด๋ถ์ ํฌํจ๋ ๊ฒฝ์ฐ์์
3. ๊ดํต์ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ์ง๋ง ๊ผญ์ง์ ์ด ์๋ก์ ๋ด๋ถ์ ํฌํจ๋์ด์์ง ์์ ๊ฒฝ์ฐ์์
3. ์๊ณผ ์์ ์ถฉ๋
๋ค์ํ ์ถฉ๋๊ฐ์ง ๋ฐฉ๋ฒ์ค ์ฒซ๋ฒ์งธ๋ก ์ดํด๋ณผ๊ฑด ์๊ณผ ์์ ์ถฉ๋์ด์์
์ฒซ๋ฒ์งธ ์์ ์ค์ ์ด (x1,y1) ์ด๊ณ ๋ฐ์ง๋ฆ์ด r1 ๋๋ฒ์งธ ์์ ์ค์ ์ด (x2,y2)๊ณ ๋ฐ์ง๋ฆ์ด r2์ผ๋
๋ ์์ ์ค์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ( (x2-x1)^2+(y2-y1)^2 )^0.5 ๊ฐ ๋ ์์ ๋ฐ์ง๋ฆ์ ํฉ r1+r2๋ณด๋ค ์์ผ๋ฉด ์ถฉ๋ํ๋ค๊ณ ํ์ ํด์
๊ทธ๋ฆฌ๊ณ ์ด ๊ณต์์ ์ต์ ํ๋ฅผ ์ํด์ ๋ฃจํธ๋ฅผ ์ ๊ฑฐํ ๋ฐฉ์์ผ๋กย (x2-x1)^2+(y2-y1)^2 = d^2 ์ ํํ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํด์
4. ์ฌ๊ฐํ๊ณผ ์ฌ๊ฐํ์ ์ถฉ๋
๋๋ฒ์งธ๋ ๊ธฐ์ธ์ด์ง์ง ์์ ์ฌ๊ฐํ ์ฌ์ด์ ์ถฉ๋์ด์์
๋ง์ฝ ์ถฉ๋ํ๋ค๋ฉด ์ค๋ฅธ์ชฝ์ฒ๋ผ xy์ถ์์์ ๋ ์ฌ๊ฐํ์ ๋ชจ๋ ์์ญ์ด ๊ฒน์ณ์ง ๊ฒ์ด๋๊น
xy์ถ์ค ํ๋๋ผ๋ ๊ฒน์ณ์ง์ง ์๋ ์์ญ์ด ์๋ค๋ฉด ์ถฉ๋ํ์ง ์์๋ค๊ณ ํ์ ํด์
์ฆ, a์ x์ขํ์ค ์ต๋๊ฐ์ดย b์ x์ขํ์คย ์ต์๊ฐ๋ณด๋ค ์๊ฑฐ๋, ํน์ ๊ทธ ๋ฐ๋๋ก b์ ์ต๋๊ฐ a์ ์ต์๋ณด๋ค ์๊ฑฐ๋
a์ y์ขํ์ค ์ต๋๊ฐ์ด b์ y์ขํ์ค ์ต์๊ฐ๋ณด๋ค ์๊ฑฐ๋, ์ญ์ย ๊ทธ ๋ฐ๋๋ก b์ ์ต๋๊ฐ a์ ์ต์๋ณด๋ค ์์ผ๋ฉดย ์ถฉ๋ํ์ง ์์๋ค๊ณ ํ์ ํด์
5. ๋ถ๋ฆฌ์ถ(SAT) ์ถฉ๋๊ฒ์ฌ
์ธ๋ฒ์งธ๋ ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด์์
๋๊ฐ์ ๋ค๊ฐํ์ ๋ชจ์๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๋ฒกํฐ๋ก ๋ฐ๋ผ๋ณธ๋ค์ ํด๋น ๋ฒกํฐ๋ค์ ์์ง์ธ ๋ฒกํฐ๋ฅผ ๊ตฌํด์
๊ทธ๋ ๊ฒ ๊ตฌํ ์์ง๋ฒกํฐ๋ค๋ก์ ๋ ๋ค๊ฐํ์ ํฌ์์์ญ์ ๊ตฌํด์ ๋ง์ฝ ๊ฒน์น์ง ์๋ ์์ง๋ฒกํฐ ์์ญ์ด ํ๊ตฐ๋ฐ๋ผ๋ ์์ผ๋ฉด
์ถฉ๋ํ์ง ์์๋ค๊ณ ํ์ ํ๋๊ฑฐ์์,
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ฒซ๋ฒ์งธ๋ ๋ ๋ํ์ด ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ง๋ฒกํฐ์์(๊ทธ๋ฆผ์์๋ 3๊ฐ๋ง ๋์์์ง๋ง ์ฌ๊ฐํ 4๊ฐย + ์ผ๊ฐํ 3๊ฐ๋ก ์ด 7๊ฐ์์ ๊ฒ์ฌํด์) ๋ ๋ํ์ ํฌ์ ์์ญ์ด ๊ฒน์น์ง๋ง
๋๋ฒ์งธ ๊ทธ๋ฆผ์์๋ย ๋ ๋ํ์ด ์ถฉ๋ํ์ง ์์๊ธฐ ๋๋ฌธ์, ๋ ๋ํ์ ์ถฉ๋์์ญ์ด ๊ฒน์น์ง ์๋ ์์ง๋ฒกํฐ๊ฐ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ๋ถ๋ฆฌ์ถ ์ถฉ๋๊ฒ์ฌ๋ ์ง์ฌ๊ฐํ๊ณผ ์ง์ฌ๊ฐํ์ ์ถฉ๋๋ก ๋จ์ํ์ํจ OBB ์ถฉ๋๊ฒ์ฌ๋ฅผย ์ฌ์ฉํ๊ธฐ๋ ํด์
6. ๋ณผ๋ก๋ค๊ฐํ
๊ทธ๋ฆฌ๊ณ ๋ค์์ผ๋กย GJK์ถฉ๋ํ์ ย ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ์ผ๋ก ๋ค์ด๊ฐ๋ฉด
ย
์ฐ์ GJK์ถฉ๋ํ์ ย ์๊ณ ๋ฆฌ์ฆ์ ๋ ๋ณผ๋ก๋ค๊ฐํ์ ์ถฉ๋์ ๊ฒ์ฌํ๋ ๋ฐฉ๋ฒ์ด์์,
์์ ๊ทธ๋ฆผ์์ ์ฒซ๋ฒ์งธ ๋๋ฒ์งธ๋ ๋ณผ๋ก๋ค๊ฐํ์ด์ง๋ง, ์ธ๋ฒ์งธ๋ย ๋ณผ๋ก๋ค๊ฐํ์ด ์๋์์
7. ๋ฏผ์ฝํ์คํค ํฉ
์์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผย ๋ ๋ค๊ฐํ์ด ์์๋, ๋ ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๊ผญ์ง์ ์ย ์์ ์์ ํด๋น ๊ผญ์ง์ ์ ํฅํ๋ ๋ฒกํฐ๋ก ๋ฐ๋ผ๋ณธ๋ค์
๋๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผ ํ ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๋ฒกํฐ(๊ผญ์ง์ )์ ๋ค๋ฅธ ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๋ฒกํฐ(๊ผญ์ง์ )์ ๋ํ๋ฉดย ์๋ก์ด ๋ฒกํฐ(๊ผญ์ง์ )๋ค์ ์ป์์ ์์ด์,
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ป์ด์ง ๋ฒกํฐ๋ค์ ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ํฉ์ด๋ผ๊ณ ํด์
๊ทธ๋ฆฌ๊ณ ์์ ๊ทธ๋ฆผ์์ ๊ฐ์์ผ๋ก ํ ๋๋ฆฌ๋ฅผ ๊ทธ๋ ค๋์๊ฒ์ฒ๋ผ,ย ์ด๋ ๊ฒ ์ป์ด์ง ๋ฏผ์ฝํ์คํค ํฉ์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ฐ๋ผ์ ๋ค๊ฐํ์ผ๋ก ๋ฐ๋ผ๋ณผ์ ์์ด์
8. ๋ฏผ์ฝํ์คํค ์ฐจ์ด
์์ ๊ทธ๋ฆผ์์ ๋ณด์ด๋๊ฒ์ฒ๋ผ, ๋ฏผ์ฝํ์คํค ํฉ๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋กย ํ ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ (๋ฒกํฐ)๋ค ๊ฐ๊ฐ์ ๋ค๋ฅธ ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ (๋ฒกํฐ)๋ค์ ๋นผ์, ์๋ก์ด ๋ฒกํฐ๋ค์ ์ป์์ ์์ด์,ย
ย
์์ ๊ทธ๋ฆผ์์ ๋ ๊ผญ์ง์ ๋ค(๋ฒกํฐ๋ค)๊ฐ์ ์ฐจ์ด๋ก ์ป์ด์ง ๋ฒกํฐ๋ค์, ์์ ์ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๋ฉด ์์ ๊ทธ๋ฆผ์ด ๋์์,
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ด๋ค ๋ค๊ฐํ์์ ๋ค๋ฅธ ๋ค๊ฐํ์ ๋ชจ๋ ๋ฒกํฐ๋ค์ ๋นผ์ ์ป์ด์ง ๋ฒกํฐ๋ค์ ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ผ๊ณ ํด์ย
์ญ์ ๋ฏผ์ฝํ์คํค ํฉ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ ์์ ๊ทธ๋ฆผ์์ ๊ฐ์์ผ๋ก ๊ทธ๋ ค๋์๊ฒ์ฒ๋ผ, ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ฐ๋ผ์ ๋ค๊ฐํ์ผ๋ก ๋ฐ๋ผ๋ณผ์ ์์ด์
9. GJK์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ ์์ (0,0)์ ํฌํจํ๊ณ ์์ด์
์ฆ, ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ฅผ ๊ตฌํ๋ค์ ๊ทธ๋ ๊ฒ ์ป์ด์ง ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ ์์ ์ด ํฌํจ๋๋์ง๋ฅผ ๊ฒ์ฌํ๋ฉด
๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋์ง ์ํ๋์ง๋ฅผ ์ ์ ์์ด์, ์ด๊ฒ GJK์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ์์
์์ ์ฌ๋ ค๋์ ๊ทธ๋ฆผ์ย ์ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ์๋ ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๊ฐ ์์ ์ ํฌํจํ๋์ง์ ๋ํ ์ด์ ์์
์์ ๊ทธ๋ฆผ์ ์ผ์ชฝ์ฒ๋ผ ๋ง์ฝ ์์ (0,0)์ด ์ด๋ค ๋ค๊ฐํ์ ์ธ๋ถ์ ์๋ค๋ฉด, ์์ ์ผ๋ก๋ถํฐ ๊ทธ ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ ๊น์ง์ ๋ฒกํฐ๋ค์ 180๋ ๋ฒ์๋ฅผ ๋์ด๊ฐ์ง ์์์
๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ์์ ์ด ์ด๋ค ๋ค๊ฐํ์ ๋ด๋ถ์ ์๋ค๋ฉด, ์์ ์ผ๋ก๋ถํฐ ๊ทธ ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ ๊น์ง์ ๋ฒกํฐ๋ค์ 180๋ ๋ฒ์๋ฅผ ๋์ด๊ฐ์
๊ทธ๋ฆฌ๊ณ ์์ ๊ทธ๋ฆผ์ ๋ ๋ค๊ฐํ๊ฐ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ค์ค ์ผ๋ถ๋ฅผ ํ์ํด๋์ ๊ฑฐ์์, ์ฌ๊ธฐ์๋ ์ฌ๊ฐํ์์ ์ผ๊ฐํ์ ๋นผ๋ ๋ฐฉ์์ด์์
์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์์์ฒ๋ผย ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ์ง ์์๋ค๋ฉด ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ค์ ๋ฒ์๋ 180๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์์์
๊ทธ๋ ์ง๋ง ๋๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผย ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด ๊ทธ๋ฆผ์์ ๋ณด์ด๋๊ฒ์ฒ๋ผ ๋ ๋ค๊ฐํ๊ฐ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ค์ 180๋ ๋ฒ์๋ฅผ ๋์ด๊ฐ์
์ฆ, ์ ๋ ๊ฒ ์ป์ด์ง ๋ชจ๋ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ค์ ์์ ์ ์ค์ฌ์ผ๋ก ๋ชจ์์ ์๋ก์ด ๋ค๊ฐํ์ ๋ง๋ค์์๋, ๋ฒกํฐ๋ค์ ๋ฒ์๊ฐ 180๋๋ฅผ ๋์ด๊ฐ๋๊น, ์์ ์ ๊ทธ ๋ค๊ฐํ์ ๋ด๋ถ์ ์๊ฒ๋๋๊ฑฐ์์
10. Support Point
Support Point๋ ์ด๋ค ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ ์ค, ํน์ ๋ฐฉํฅ์์ ๊ฐ์ฅ ๋ฉ๋ฆฌ์๋ ๊ผญ์ง์ ์ ์ด์ผ๊ธฐํด์
์ฆ, ํน์ ํ ๋ค๊ฐํ๊ณผ ํน์ ํ ๋ฒกํฐ๊ฐ ์ฃผ์ด์ก์๋, ๊ทธ ๋ค๊ฐํ์ ๊ตฌ์ฑํ๋ ๊ผญ์ง์ ๋ค์ค ๊ทธ ๋ฒกํฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ฅ ๋ฉ๋ฆฌ์๋ ๊ผญ์ง์ ์ ์ด์ผ๊ธฐํ๋๊ฑฐ์์
์์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์์ ๊ฐ๊ฐ ํ์ํด๋์ ๊ผญ์ง์ ๋ค์ด ํด๋น ๋ฒกํฐ์์์ support point์์
๊ทธ๋ฆฌ๊ณ ์ด support point๋ ๋ฒกํฐ์ ๋ด์ ์ผ๋ก ๊ตฌํ ์ ์์ด์
์ญ์ ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๊ผญ์ง์ ๋ค์, ์์ ์ผ๋ก๋ถํฐ ํด๋น ๊ผญ์ง์ ๊น์ง์ ๋ฒกํฐ๋ก ๋ฐ๋ผ๋ณด๋ฉด
๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ (๋ฒกํฐ)๋ค์ ์ฃผ์ด์ง ๋ฐฉํฅ๋ฒกํฐ์ ๋ด์ ํ์๋, ๊ทธ ๊ธธ์ด๊ฐ ์ต๋๋ก ๋์ค๋ ๊ผญ์ง์ (๋ฒกํฐ)๊ฐ
๊ทธ ๋ฐฉํฅ๋ฒกํฐ์์ ๊ทธ ๋ค๊ฐํ์ support point์์, ์์ ๊ทธ๋ฆผ์์๋ ํ๋์์ผ๋ก ํ์ํด๋์ ๊ผญ์ง์ ์ด ์๋์ ํ๋์ ๋ฒกํฐ์ ๋ํ ์ผ๊ฐํ์ support point์์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def support_point(x,y,p)
rx,ry,d = nil,nil,nil
i = 0
until p[i] == nil
b = p[i][0]*x+p[i][1]*y
if d == nil || b > d
rx,ry,d = p[i][0], p[i][1], b
end
i+=1
end
return rx,ry
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์์ ์ฌ๋ ค๋์ ํจ์๋ support point๋ฅผ ๊ตฌํ๋ ํจ์์์, rubyํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ์ด์
ํจ์์ ์ ๋ ฅ๊ฐ์์ x,y๋ ๋ฐฉํฅ๋ฒกํฐ๊ณ , p๋ ๋ค๊ฐํ์ด์์ ruby์ ๋ฐฐ์ด๋ก [ [x1,y1],[x2,y2],[x3,y3], ] ํ์์ ๊ฐ์ผ๋ก ์ ๋ ฅ๋์
์์ ์์๋ ์ธ ๊ผญ์ง์ (x1,y1) (x2,y2) (x3,y3) ์ ๊ฐ์ง ์ผ๊ฐํ์ ๊ฒฝ์ฐ์ผ๋์์
๊ฐ๊ฐ์ ๊ผญ์ง์ ๋ค์ ์ฃผ์ด์ง ๋ฐฉํฅ๋ฒกํฐ์ ๋ชจ๋ ๋ด์ ํ๋ค์, ๊ทธ์ค์์ ๋ด์ ๊ฐ์ด ์ต๋๋ก ๋์จ ๊ผญ์ง์ ์ return๊ฐ์ผ๋ก ์ถ๋ ฅํด์
11. ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ support point
์์์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ค๋ก ์ป์ด์ง ๋ฒกํฐ๋ค์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ฐ๋ผ์, ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ฅผ ๋ค๊ฐํ์ผ๋ก ๋ฐ๋ผ๋ณผ์ ์๋ค๊ณ ์ด์ผ๊ธฐํ์ด์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ฅผ ๋ค๊ฐํ์ผ๋ก ๋ฐ๋ผ๋ดค์๋, ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ ๋ํด์๋ support point๋ฅผ ๊ตฌํ ์ ์์ด์
์์ ๊ทธ๋ฆผ์์ ์๋์ ์ฌ๊ฐํ๊ณผ ์ผ๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ก ์ป์ด์ง ๋ํ์ด ์์ ๋ค๊ฐํ์ด๊ณ , ์ด๋ ํ๋์ ๋ฒกํฐ ๋ฐฉํฅ์ ํด๋น ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ support point๊ฐ ๊ทธ๋ฆผ์ ํ์ํด๋์๊ฒ์ฒ๋ผ a์ผ๋
์ด a๋ ์ฌ๊ฐํ์ ๋์ผํ ๋ฐฉํฅ์ผ๋ก์(ํ๋์ ๋ฒกํฐ) support point์ธ b์์ย ์ผ๊ฐํ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก์(์ฃผํฉ์ ๋ฒกํฐ) support point์ธ c๋ฅผย ๋นผ๋ฉด ์ป์์ ์์ด์,ย ์ฆ a=b-c์์
ใ กใ กใ กใ กใ กใ ก
def mink_dif(vx,vy,p1,p2)
x1,y1 = support_point(vx,vy,p1)
x2,y2 = support_point(-vx,-vy,p2)
return x1-x2,y1-y2
end
ใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ํน์ ๋ฐฉํฅ์ผ๋ก์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ support point๋ฅผ ๊ตฌํ๋ ํจ์์์, ์์์ ์ ์ํ support point ํจ์๊ฐ ์ฌ์ฉ๋์
์ ๋ ฅ๊ฐ์ ๋ฒกํฐ vx,vy๊ฐ ์ฃผ์ด์ก์๋, ๋ค๊ฐํ p1๊ณผ p2์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ ์ฃผ์ด์ง ๋ฐฉํฅ(vx,vy)์ผ๋ก์ support point๋ฅผ ๊ตฌํด์ฃผ๋ ํจ์์์
์ญ์ p1๊ณผ p2๋ ์์ ํจ์์ฒ๋ผ ruby์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ย [ [x1,y1],[x2,y2],[x3,y3], ]ย ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ๋ ฅ๋์
12. ํน์ ๋ฐฉํฅ์ผ๋ก ์์ง์ธ ๋ฒกํฐ ๊ตฌํ๊ธฐ
์ด๋ค ๋ฒกํฐ์์ ํน์ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ํจ์๋ GJK์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋๋ ํจ์์์,
์์ ์ฌ๋ ค๋์๊ฒ์ฒ๋ผ x,y์ ๋ฒกํฐ๊ฐ ์์๋ ๊ทธ x,y์ ์์ง์ธ ๋ฒกํฐ๋ -y,x y,-x์ด๋ ๊ฒ ๋๊ฐ๊ฐ ์์ด์
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋๊ฐ์ง์ค ์ด๋ค ๋ฒกํฐ๊ฐ ํน์ ๋ฐฉํฅ์ผ๋ก์ ์์ง๋ฒกํฐ์ธ์ง๋ฅผ ๊ตฌํ๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ๋ฒกํฐ์ ๋ด์ ์ผ๋ก ๊ตฌํ ์ ์์ด์
์์ ๊ทธ๋ฆผ์์ ์ด๋ก์์ด ์ฃผ์ด์ง ๋ฒกํฐ์ผ๋, ํ๋์ ๋ฒกํฐ์ ๋๊ฐ์ง ์์ง๋ฒกํฐ(๋๊ฐ์ ์ฃผํฉ์ ๋ฒกํฐ)์ค, ์ด๋ค๊ฒ ์ด๋ก์ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ์ธ์ง๋ฅผ ๊ตฌํ๋ ค๋ฉด
๋๊ฐ์ ์ฃผํฉ์ ๋ฒกํฐ๋ฅผ ๊ฐ๊ฐ ์ด๋ก์ ๋ฒกํฐ์ ๋ด์ ์ ํด๋ณด๋ฉด ๋์, ๊ทธ๋ฌ๋ฉด ๊ทธ ๊ฐ์ด +๋ก ๋์ค๋ ๋ฐฉํฅ์ ๋ฒกํฐ๊ฐ ์ด๋ก์ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ์์
์ผ์ชฝ ๊ทธ๋ฆผ์์๋ -y,x๊ฐ ์ด๋ก์๊ณผ์ ๋ด์ ๊ฐ์ด +๋ก ๋์ค๊ธฐ ๋๋ฌธ์ ๊ตฌํ๊ณ ์ ํ๋ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ์ด๊ณ
์ค๋ฅธ์ชฝ์์๋ y,-x๊ฐ ์ด๋ก์๊ณผ์ ๋ด์ ๊ฐ์ด +๋ก ๋์ค๊ธฐ ๋๋ฌธ์ ๊ตฌํ๊ณ ์ ํ๋ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ์์
ใ กใ กใ กใ กใ กใ กใ กใ ก
def vector_direct(x1,y1,x2,y2)
if -y1*x2+x1*y2 >= 0
return -y1,x1
end
if y1*x2+-x1*y2 >= 0
return y1,-x1
end
end
ใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์ ๊ณผ์ ์ ํจ์๋ก ์ ๋ฆฌํ๊ฑฐ์์
์์ ํจ์๋ ์ ๋ ฅ๊ฐ์์ย x1,y1๋ฒกํฐ์ x2,y2๋ฒกํฐ ๋ฐฉํฅ์ผ๋ก์ ์์ง์ธ ๋ฒกํฐ๋ฅผ ๊ตฌํด์ฃผ๋ ํจ์์์,
์ฆ ์ต์ข ์ ์ผ๋ก๋ x1,y1๊ณผ ์์ง์ธ ๋ ๋ฒกํฐ์ค์์ x2,y2๋ฐฉํฅ์ผ๋ก์ ๋ฒกํฐ๊ฐ ์ถ๋ ฅ๋์
13. GJK์๊ณ ๋ฆฌ์ฆ์ ์๋๋ฐฉ์
GJK์๊ณ ๋ฆฌ์ฆ์ ์๋๋ฐฉ์์, ์ฐ์ ์ฒซ์งธ๋ก ์์ ์ค๋ช ํ mink_dif ํจ์๋ฅผ ์ด์ฉํด์, ์ถฉ๋ํ์ ์ ํ๊ณ ์ ํ๋ ๋ ๋ค๊ฐํ์ ์์์ ๋ฐฉํฅ(๋ฒกํฐ)์ผ๋ก์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด์ support point๋ฅผ ํ๋ ๊ตฌํด์
์ด๋์ ๋ฐฉํฅ(๋ฒกํฐ)์ ์๋ฌด๊ฑฐ๋ ์ง์ ํด๋ ์๊ด์์ด์,
์์ ๊ทธ๋ฆผ์์ย ๊ฒ์ ์ ๋ค๊ฐํ์ดย ์ถฉ๋ํ์ ์ ํ๊ณ ์ ํ๋ ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ก ์ป์ด์ง ๋ค๊ฐํ์ด๊ณ , ์ด๋ ํ๋์์ด ์์์ ๋ฐฉํฅ์ผ๋ก์ ํด๋น ๋ค๊ฐํ์ support point์์
๋๋ฒ์งธ๋ก ๊ทธ๋ ๊ฒ ์ป์ ์์์ ์ง์ (ํ๋์)์์ ์์ (0,0)๋ฐฉํฅ์ผ๋ก์ support point๋ฅผ ๊ตฌํด์, ์ญ์ mink_dif ํจ์๋ฅผ ์ฌ์ฉํด์
๊ทธ๋ ๊ฒํด์ ์ป์ด์ง๊ฒ ์ด๋ก์ ์ ์ด์์, ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ด์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๊ทธ๋ฆผ์ ๊ทธ๋ ๊ฒ ํด์ ์ป์ด์ง ํ๋์์ > ์ด๋ก์์ ๊น์ง์ ๋ฒกํฐ(์ด๋ก์ ๋ฒกํฐ)์
์์ > ์ด๋ก์์ ๊น์ง์ ๋ฒกํฐ(๊ฒ์ ์ ๋ฒกํฐ)๋ฅผ ๋ด์ ํด์ ๋์ ๋ฐฉํฅ์ ๋น๊ตํด์
์ด๋ก์ ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด๋ก ์ป์ด์ง ๋ค๊ฐํ์์, ์์ ๋ฐฉํฅ์ผ๋ก ์ ์ผ ๋ฉ๋ฆฌ ์๋ ์ ์ธ๋ฐ
๋ง์ฝ ๋ ๋ฒกํฐ์ ๋ด์ ๊ฐ์ด 0๋ณด๋ค ์๋ค๋ฉด, ์ฆ ๋ ๋ฒกํฐ๊ฐ ์๋ก ๋ค๋ฅธ ๋ฐฉํฅ์ด๋ผ๋ฉด
์์ ์ ๊ฒฐ๊ตญ ๋ฏผ์ฝํ์คํค ์ฐจ์ด ๋ค๊ฐํ ๋ด๋ถ์ ์กด์ฌํ์ง ์๋๋ค๋๊ฒ ๋๋๊น
์ถฉ๋ํ์ง ์๋๋ค๊ณ ํ์ ํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
๋ค์์ ๊ณผ์ ์ ์ฌ๊ธฐ์ ๋ด์ ํ์๋ +๊ฐ ๋์จ ๊ฒฝ์ฐ, ์ฆ ๋ ๋ฒกํฐ๊ฐ ๊ฐ์ ๋ฐฉํฅ์ ์๋ ๊ฒฝ์ฐ์์
14. GJK์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ณต๋ถ๋ถย
๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ๋ก๋ ์ฐ์ ์์์ ์ป์ ๋ ์ ์ ์ด์ ์ง์ ์์(์์ ๊ทธ๋ฆผ์ ์ด๋ก์ ์ง์ ), ์์ ๊น์ง์ ๋ฐฉํฅ์ผ๋ก ์์ง์ธ ๋ฒกํฐ๋ฅผ ๊ตฌํด์
์ฌ๊ธฐ์๋ ์์์ ์ค๋ช ํ vector_direct ํจ์๊ฐ ์ฌ์ฉ๋์
๊ทธ๋ฆฌ๊ณ ย mink_difํจ์๋ฅผ ์ฌ์ฉํด์ย ๊ทธ๋ ๊ฒ ์ป์ ์์ง๋ฒกํฐ ๋ฐฉํฅ์ผ๋ก์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด ๋ค๊ฐํ์์์ support point๋ฅผ ๊ตฌํด์
์ผ์ชฝ์ ๊ทธ๋ฆผ์์ ์ฃผํฉ์ ๋ฒกํฐ๊ฐ ์์ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ๊ณ , ์ฃผํฉ์ ์ ์ด ํด๋น ๋ฐฉํฅ์ผ๋ก์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด ๋ค๊ฐํ์ support point์์
๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ์ ๊ทธ๋ฆผ์ฒ๋ผ ์ด๋์ ์ง์ ์์ support point๊น์ง์ ์์ง๋ฒกํฐ(์ฃผํฉ๋ฒกํฐ) ์ ์์ ์์ support point๊น์ง์ ๊ฒ์ ์ ๋ฒกํฐ๋ฅผ ๋ด์ ํด์
๋ง์ฝ ๊ฐ์ด 0๋ณด๋ค ์๊ฒ ๋์จ๋ค๋ฉด, ์ฆ ๋ ๋ฒกํฐ์ ๋ฐฉํฅ์ด ๋ค๋ฅด๋ค๋ฉด ์์ ์ ๋ฏผ์ฝํ์คํค ์ฐจ์ด ๋ค๊ฐํ ๋ฐ์ ์๋๊ฑฐ๋๊น, ์ถฉ๋ํ์ง ์์๋ค๊ณ ์ฒ๋ฆฌํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
์ฌ๊ธฐ์์ ์ฃผํฉ์ ์ ์ง์ ์์ ์์ ๋ฐฉํฅ์ผ๋ก ์ต๋๋ก ๋ฉ๋ฆฌ ์๋ ๋ฏผ์ฝํ์คํค ๋ค๊ฐํ์ support point์ธ๋ฐ, ์์ ์ด ์ด๊ฒ๋ณด๋ค ๋ ๋ฉ๋ฆฌ์๋ค๋ฉด(๋ ๋ฒกํฐ์ ๋ฐฉํฅ์ด ๋ฐ๋๋ผ๋ฉด) ์์ ์ ๊ฒฐ๊ตญ ๋ฏผ์ฝํ์คํค ์ฐจ์ด ๋ค๊ฐํ ๋ฐ์ ์๋๊ฒ ๋๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ๋ค์์ ๊ณผ์ ์ ์ฌ๊ธฐ์ ๋ ๋ฒกํฐ์ ๋ด์ ๊ฐ์ด +๊ฐ ๋์์๋์์
15. ์์ ์ย ๋ฒ์ ์ ํ
์์ ๊ทธ๋ฆผ ๊ฐ์ด๋ฐ์ ์ผ๊ฐํ์ ์์ ๊ณผ์ ์์ ์ป์ ์ธ๋ฒ์งธ ์ ๊ณผ, ๊ธฐ์กด์ ์ง์ ์ ์ ๋์ ์ ์ด์ด์ ๊ทธ๋ฆฐ ์ผ๊ฐํ์ด์์
๊ทธ๋ฆฌ๊ณ ์ด๋์ ์์ ์ ์์ ๊ทธ๋ฆผ์ ํ์๋ ์์ญ์์ e f g ์ ์์ญ์๋ฐ์ ์์์ ์์ด์
์ฐ์ ์ฒซ๋ฒ์งธ ์ด๋ก์ ์ง์ ์ ํ ์ ์์ ์์ ๋ฐฉํฅ์ผ๋ก์ support point๋ฅผ ์ฐพ์์ ๊ทธ๋ฆฐ ์ง์ ์ด๊ธฐ ๋๋ฌธ์
๊ทธ ์ง์ ์ ์์์ ๋ท์ชฝ์ธ a์์ญ์๋ ์์ ์ด ์์์ ์๊ณ , ์์์ ๊ทธ ์ง์ ์ ๋์ฐฉ์ ์ธย support point๊ฐ ์์ ๊ณผ์ ๋ด์ ์์ +๊ฐ ๋์๊ธฐ ๋๋ฌธ์
๊ทธ ์ง์ ์ ๋์ฐฉ์ ๋๋จธ์ ์์ญ์ธ b์๋ ์์ ์ด ์กด์ฌํ ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ผ๊ฐํ์ ์ธ๋ฒ์งธ ๊ผญ์ง์ ์ ์์ ์ด๋ก์ ์ง์ ์์ ์์ ๋ฐฉํฅ์ผ๋ก์ support point๋๊น, ์ด ์ง์ ์ ๋ค์ชฝ ๋ฐ๋ํธ์ธ d ์์ญ์๋ ์์ ์ด ์์์ ์๊ณ
์ญ์ ๊ทธ๋ ๊ฒ ๊ตฌํ support point๋ ์์ ๊ณผ์ ๋ด์ ์์ +๊ฐ ๋์๊ธฐ ๋๋ฌธ์ย ๊ทธ ์ธ๋ฒ์งธ ๊ผญ์ง์ ๋๋จธ์ ์์ญ์ธ c์๋ ์์ ์ ์์์ ์์ด์
์ฆ, ๊ทธ๋ ๊ฒ ์๊ฑฐํ๋ฉด ์ต์ข ์ ์ผ๋ก e f g ์์ญ์๋ง ์์ ์ด ์์์ ์๋ค๋ ๊ฒฐ๋ก ์ด ๋์์
๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ผ๋ก ์ด๋์ ์์ ์ด ์ผ๊ฐํ ๋ด๋ถ์ธ g ์์ญ์ ์์ด์ผ๋ง ์์ ์ด ๋ฏผ์ฝํ์คํค ์ฐจ์ด ๋ค๊ฐํ ๋ด๋ถ์ ์๋ค๊ณ ํ๋ณํด์ ์ถฉ๋ํ๋ค๊ณ ์ฒ๋ฆฌํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
16. ์ผ๊ฐํ ๋ด๋ถ์ ์์ ํ๋ณ
ย
๊ทธ๋์ ๋ค์์ ๊ณผ์ ์ ์ฐ์ ์์ ์ด ์ผ๊ฐํ ๋ด๋ถ(์์ ๊ณผ์ ์ g์์ญ)์ ์๋์ง ํ๋ณํ๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ํ๋ณํ๊ธฐ ์ํด, ์ฐ์ ์ผ๊ฐํ์ ๋ ๋ชจ์๋ฆฌ(์์ ๊ทธ๋ฆผ์ ์ฃผํฉ๊ณผ ํ๋)์์, vector_direct ํจ์๋ก ์ผ๊ฐํ์ ๋ค๋ฅธ ๊ผญ์ง์ ๋ฐฉํฅ์ผ๋ก ์์ง์ธ ๋ฒกํฐ๋ฅผ ๊ตฌํด์
๊ทธ๋ ๊ฒ ํ๋ฉด ๊ทธ๋ฆผ ์๋์ชฝ์ ๋๊ฐ์ ๋ฒกํฐ๊ฐ ๋์์
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฒกํฐ๋ค์ ์์ ์ผ๋ก๋ถํฐ ๋ ๋ชจ์๋ฆฌ์ ํ ๊ผญ์ง์ ๊น์ง์ ๋ฒกํฐ(์์ ๊ทธ๋ฆผ์ ๋ณด๋ผ์ ๋ฒกํฐ)์ ๋ด์ ํด์ ๊ทธ ๊ฐ์ ๋น๊ตํด์
๊ทธ๋์ ์ต์ข ์ ์ผ๋ก ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ๋ ๋ด์ ๊ฐ์ด ๋ชจ๋ 0๋ณด๋ค ํฌ๋ฉด ์์ ์ ์ผ๊ฐํ ๋ด๋ถ์ ์๋๊ฑฐ๋๊น ์ถฉ๋ํ๋ค๊ณ ์ฒ๋ฆฌํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
17. ๋ค์ ์ง์ ์ ๊ตฌํด์ ์๊ณ ๋ฆฌ์ฆ์ย ๋ฐ๋ณตํ๊ธฐ
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ์์ ๊ณผ์ ์์ ๋ ๋ด์ ๊ฐ์ด 0๋ณด๋ค ํฌ๊ฒย ๋์ค์ง ์์ผ๋ฉด, ์ฆ ์์ ์ด ์ผ๊ฐํ ๋ด๋ถ(g์์ญ)์ ์์ง ์์ผ๋ฉด
๋ค์ ๊ณผ์ ์ ์์ ์ด e f ์์ญ์ค ์ด๋์ ์๋์ง๋ฅผ ์ฐพ๋๊ฑฐ์์,
๊ทธ๋ฆฌ๊ณ ๋ ๋ฒกํฐ๋ฅผ ๋ด์ ํ์๋ ๊ทธ ๊ฐ์ด ์์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ผ๋ฉด, ์ฆ ์ค๋ฅธ์ชฝ์ด -๊ณ ์ผ์ชฝ์ด +๋ฉดย
์์ ์ f์์ญ์ ์๋๊ฑฐ๋๊น ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ ์ค๋ฅธ์ชฝ์ฒ๋ผ ์ผ๊ฐํ์ ์ค๋ฅธ์ชฝ ๋ชจ์๋ฆฌ๋ฅผ ์ง์ ์ผ๋ก ํด์ย
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์ค์ ๋ก ์์ gjk์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ์ถฉ๋ํ์ ์ ์ฒ๋ฆฌํด๋ณด๋ย ์์์ด์์
๋ค์ ์ค๋ช ์ ์์์ ๊ตฌํ ์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ค์ ๋ก ์ฌ๋ฌ ๋ํ๋ค์ ์ถฉ๋ํ์ ์ ๊ตฌํด๋ณด๋ ๋ฐฉ์์ ๋ํ ์ค๋ช ์ด์์
์ฒซ๋ฒ์งธ ์ค๋ช ์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ๊ณก์ ์ธ ๋ํ๋ค์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด์์,
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ ๊ณก์ ๋ํ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๊ธฐ ์ํด์ ํด๋น ๋ํ์ ๋ค๊ฐํ์ผ๋ก ๊ทผ์ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ด์,
์ฆ, ๊ณก์ ์ธ ๋ํ๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋๊ฒ ์๋๋ผ ๊ณก์ ๋ํ๊ณผ ์๋นํ ์ ์ฌํ ๋ค๊ฐํ๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋๊ฑฐ์์
์ฐ์ ์์ ์์ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ํ๊ฐํ์ผ๋ก ๊ทผ์ฌ์์ผฐ์ด์,
์ฆ, ์๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋๊ฒ ์๋๋ผ, ์ค์ ๋ก๋ ์์ ๊ฐ๊น์ด ํ๊ฐํ๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋ ๊ฑฐ์์,
๋ค์์ผ๋ก ํ์ ์ญ์ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ํ๊ฐํ์ผ๋ก ๊ทผ์ฌ์์ผฐ์ด์,
๋ง์ฐฌ๊ฐ์ง๋ก ํ์๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋ค๊ณ ํด๋, ์ค์ ๋ก๋ ํ์์ด ์๋ย ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ํ๊ฐํ๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋๊ฑฐ์์
19. ๊ธฐ์ธ์ด์ง ๋ค๊ฐํ์ ๊ผญ์ง์ ๊ตฌํ๊ธฐ
๋๋ฒ์งธ ์ค๋ช ์ ๊ธฐ์ธ์ด์ง ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด์์
๊ทธ๋ฆฌ๊ณ ์์ ๊ทธ๋ฆผ์ ๋ฒกํฐ์ ํ์ ๊ณต์์ด์์
๊ทธ๋ฆผ์ ๋์จ๊ฒ์ฒ๋ผ ๋ฒกํฐ x1,y1์ด ์์ ์ ๊ธฐ์ค์ผ๋ก a๊ฐ๋๋งํผ ํ์ ํด์ ๋์จ ๋ฒกํฐ๊ฐ x2,y2์ผ๋
x2 =ย x1*cos(a)-y1*sin(a)
y2 = x1*sin(a)+y1*cos(a)
๊ฐ ๋๋ ๋ฐฉ์์ด์์
๊ทธ๋ฆฌ๊ณ ์ด ๋ฒกํฐ์ ํ์ ๊ณต์์ผ๋ก ๊ธฐ์ธ์ด์ง ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ์ขํ๋ฅผ ๊ตฌํ ์ ์์ด์
๋ค๊ฐํ์ ์ค์ฌ์ ์ด ์์ (0,0)์ ๋์ธ ๋ฐฉ์์ผ๋ก ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๊ผญ์ง์ ๋ค์ ์ขํ๊ฐ์ด ์ฃผ์ด์ก์๋
๋ง์ฝ ๋ค๊ฐํ์ด ์์ ์ ์ค์ฌ์ผ๋ก a๊ฐ๋๋งํผ ๊ธฐ์ธ์ด์ก๋ค๋ฉด, ์ญ์ ๊ทธ ๋ค๊ฐํ์ ๊ผญ์ง์ ๋ค๋ย ์์ ์ ์ค์ฌ์ผ๋ก a๊ฐ๋๋งํผ ๊ธฐ์ธ์ด์ง๊ฒ ๋๋๊ฑฐ๋๊น
์๋์ ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ์์ ๋ฒกํฐ์ ํ์ ๊ณต์์ ์ฌ์ฉํ๋ฉด ๊ธฐ์ธ์ด์ง ๊ฐ๋์์์ ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ์ขํ๋ฅผ ๊ตฌํ ์ ์์ด์
ใ กใ กใ กใ กใ กใ ก
def vector_turn(x,y,a)
return x*Math.cos(a)-y*Math.sin(a),x*Math.sin(a)+y*Math.cos(a)
end
ใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์์ ํจ์๋ ์์ ๊ทธ๋ฆผ์ ๋์จ ๊ณต์์ ํจ์ํ์ํจ๊ฑฐ์์
์ ๋ ฅ๊ฐ์ x,y๊ฐ ํ์ ์ํฌ ๋ฒกํฐ๊ณ a๊ฐ ํ์ ๊ฐ๋์์
๊ทธ๋ฆฌ๊ณ ๋ค๊ฐํ์ ํ์ ์์ ์ค์ ๋ก ๋ชจ๋ ๊ผญ์ง์ ์ ํ์ ์ํค์ง ์์๋ ๋์
์๋ฅผ๋ค์ด ์์ ๋ง๋ฆ๋ชจ๋ฅผ ๋ณด๋ฉด ์ผ์ชฝ ๊ทธ๋ฆผ์์์ฒ๋ผ ๋ง๋ฆ๋ชจ์ ๊ผญ์ง์ ์ 4๊ฐ์ง๋ง
์ค์ ๋ก๋ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ํ์ํ๊ฒ์ฒ๋ผ 2๊ฐ์ ๊ผญ์ง์ ๋ง ํ์ ์ํค๋ฉด ๋์
๋ค๊ฐํ์ ๊ผญ์ง์ ๋ค์ ์ขํ๋, ๋ค๊ฐํ์ ์ค์ฌ์ ์ด ์์ ์ ๋์์๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฃผ์ด์ก์ผ๋๊น
๋๋จธ์ง 2๊ฐ๋ ํด๋น ๊ผญ์ง์ ๋ค์ ์ ๋ฐ๋๋ฐฉํฅ์ธ ๋ฒกํฐ(-x,-y)๊ฐ ๋๊ณ , ๊ฒฐ๊ตญย ํ์ ๊ณต์์ ์ฌ์ฉํ์ง ์๊ณ ๋ฒกํฐ์ ๋ถํธ๋ฅผ ๋ฐ๊พธ๋๊ฒ ๋ง์ผ๋ก ๊ตฌํ ์ ์์ด์
์์ ๊ทธ๋ฆผ์ฒ๋ผ ํฌ๋ฆฌ์คํ ํํ์ ๋ค๊ฐํ๋
์ผ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ๊ผญ์ง์ ์ ์ฌ์ฏ๊ฐ๊ฐ ์์ง๋ง ์ค์ ๋ก๋ ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ๋๊ฐ์ ๊ผญ์ง์ ๋ง ํ์ ์ํค๋ฉด ๋์
์ค์์ 4๊ฐ์ ๊ผญ์ง์ ์ ์ค์์ ์์ ์ ๊ธฐ์ค์ผ๋ก ์๋ก ์์ง(90๋)์ด๋๊น, ํ ๊ผญ์ง์ ์ ๋ถํธ๋ฅผ ๋ฐ๊พธ๋๊ฒ ๋ง์ผ๋ก ๊ตฌํ ์ ์๊ณ
๊ฐ์ฅ์๋ฆฌ์ 2๊ฐ์ ๊ผญ์ง์ ์ ์ญ์ ์๋ก ๋ฐ๋๋ฐฉํฅ์ด๋๊น, ํ๋๋ง ํ์ ์ํค๊ณ ๋ค๋ฅธ ํ๋๋ ํ ๊ผญ์ง์ ์ ๋ถํธ๋ฅผ ๋ฐ๊พธ๋๊ฒ์ผ๋ก ๊ตฌํ ์ ์์ด์
20. ์ค๋ชฉ ๋ค๋ฉด์ฒด์ ์ถฉ๋ํ์ ๊ตฌํ๊ธฐ
์ธ๋ฒ์งธ๋ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ณผ๋ก ๋ค๊ฐํ์ดย ์๋ ๋ค๊ฐํ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด์์
๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ๊ทธ๋ฆผ์ ์ค๋ฅธ์ชฝ์ฒ๋ผ ํด๋น ์ค๋ชฉ ๋ค๊ฐํ์ ์ฌ๋ฌ ๋ณผ๋ก ๋ค๊ฐํ์ผ๋ก ๋๋ ์ ๊ฐ๊ฐ์ ๋ค๊ฐํ๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ์์ด์
์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์๋ฆฌ๊ฒ ๋ชจ์์ ๋๊ฐ์ ๋ง๋ฆ๋ชจ๋ก ๋๋์ด๋์๊ฑธ ๋ณผ ์ ์์ด์
์ฆ, ์ค์ ๋ก๋ ์๋ฆฌ๊ฒ ๋ชจ์๊ณผ์ ์ถฉ๋ํ์ ์ ๊ตฌํ๋๊ฒ ์๋๋ผ, ์ ๋ ๊ฒ ๋๊ฐ์ ๋ง๋ฆ๋ชจ ๋ชจ์๊ณผ์ ์ถฉ๋ํ์ ์ ๊ฐ๊ฐ ๊ตฌํ๋๊ฑฐ์์,
ย
21. ์ถฉ๋ํ์ ์ ์ต์ ํ
๋ง์ง๋ง์ ๊ฒ์์์ ์ถฉ๋๊ฒ์ฌ๋ฅผ ์คํํ ๋ ์ต์ ํ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช ์ด์์
์ฌ๊ธฐ์๋ ์ถฉ๋ํ์ ๋ฐฉ๋ฒ์ผ๋ก GJK์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ง๋ง, ์ค์ ๋ก ์ธ๊ฒ์์์ ํด๋น ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ชจ๋ ์ค๋ธ์ ํธ์์ ์ถฉ๋์ ๊ฒ์ฌํ ํ์๋ ์์ด์
์์ ๊ทธ๋ฆผ์ ์ค๋ฅธ์ชฝ์์ ๋ง๋ฆ๋ชจ ์ฃผ์์ ๋ง๋ฆ๋ชจ๋ฅผ ํฌํจํ๋ ์์ ๊ทธ๋ ค๋์๊ฒ์ฒ๋ผ
๊ฐ๊ฐ์ ์ค๋ธ์ ํธ๋ณ๋ก ์ค๋ธ์ ํธ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ์์ผ๋กย 1์ฐจ ์ถฉ๋ ์์ญ์ ์ค์ ํด๋๊ณ
๊ธฐ๋ณธ์ ์ธ ์ค๋ธ์ ํธ๊ฐ์ ์ถฉ๋๊ฒ์ฌ๋ ๊ธ์ ๋งจ ์ฒ์์์ ์ค๋ช ํ ์๊ณผ ์(๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํ๋ ๋ฐฉ์)์ผ๋กย
๊ทธ๋ ๊ฒ ์ค์ ํด๋์ 1์ฐจ ์ถฉ๋์์ญ์ด ์๋ก ์ถฉ๋ํ๋์ง๋ฅผ ๊ฒ์ฌํ๋๊ฑฐ์์
๋ง์ฝ ๋ ์ค๋ธ์ ํธ์ 1์ฐจ ์ถฉ๋ ์์ญ์ด ๋ง๋์ง ์๋๋ค๋ฉด
๋ ์ค๋ธ์ ํธ๊ฐ ์ถฉ๋ํ์ง ์๋๊ฑด ํ์คํ๋๊น
๊ตณ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ๋ณต์กํ ์ถฉ๋๊ฒ์ฌ๋ฅผ ์คํํ ํ์๋ ์์ด์
์ฆ, ๊ธฐ๋ณธ์ ์ธ ๊ฑฐ๋ฆฌ๋น๊ต๋ก ์ค๋ธ์ ํธ๊ฐ์ 1์ฐจ ์ถฉ๋์์ญ์ ์ถฉ๋์ฌ๋ถ๋ค๋ง ํ๋ณํ๊ณ
๋ง์ฝ ๋ ์ค๋ธ์ ํธ๊ฐ 1์ฐจ ์ถฉ๋์์ญ์ด ์๋ก ์ถฉ๋ํ๋ค๋ฉด, ๊ทธ๋์๋ง ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ์ธ๋ถ์ ์ธ ์ถฉ๋ํ์ ์ ๊ฒ์ฌํ๋ฉด ๋์
์ด๋ ๊ฒ ํ๋ฉด ๋ณต์กํ ์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด์๋ ์ฐ์ฐ๋์ ์๋นํ ์ค์ผ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์ค์ ๋ก ์ธ๊ฒ์์์ ์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ์์์ด์์
์ด๋ฐ์์ผ๋ก ํ๋ฉด GJK์ถฉ๋ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ๋ค์ํ ๋ํ๊ฐ์ ์ถฉ๋ํ์ ์ ๊ตฌํ ์ ์์ด์
์ ์๋... ์ค๋ ์ง๋ ๊ฑฐ๊ธฐ ์๋๋ฐ์? ๋๋ฌด ์ด๋ ค์์..
์ฐ์ฐ ๋๋จ์
rpg ์ฏ๊พธ๋ฅด๋ก๋ง๋ ์ธ๊ฐค๊ฒ = ๋ฏผ์ฝํ์คํค gjk ๋จธ์๊ธฐ๋ก ๋ค๊ฐํ์ถฉ๋ ๊ตฌํํจ ์ธ๋ฆฌ์ผ๋ก ๋ง๋ ๋ด๊ฒ์ = ๊ตฌํ์ถฉ๋๋ก ๊ฑฐ๋ฆฌ๊ณ์ฐ๋งํจ
์ ํํ ์ ์ด๋ฌ์๋๊ฑฐ์ฃ ? ์ด์ ๊ฐ ์์๊บผ ์๋์์?! ๋ค?!
์์ฐ
์..์ ์๋ ์ง๋๊ฐ ๋๋ฌด ๋นจ๋ผ์
๊ณ ๋ด๋ฐฅ์ถ - dc App
์ ์ดํดํ์ด! (์ดํด ๋ชปํจ)
ํ .. ์ ๋ ๋์ํฉ๋๋ค.
์ค์ค ์ ๊ธฐํ๋ค ์์ธํ ์๋ฆฌ๋ ์ดํ ๋ชปํ์ง๋ง ์์ ๊ฐ์ ๊ฑฐ ์์ผ๋ฉด ์ปค์คํ ์ถฉ๋ ํ์ํ ๋ ํจ๊ณผ์ ์ผ๋ก ์ธ ์ ์์๋ฏ?
์ฒ์ ๋ณด๋ ์๊ณ ๋ฆฌ์ฆ์ธ๋ฐ ์์ ๋ค์ด์จ๋ค! ๋ ๋๊ฒ ์ค๋ช ์ํ๋๊ตฌ๋ใ ใ ์ ์ฑ๋ด๊ธด ๊ธ ๊ณ ๋ง์, ์ ์ฝ์์ด! ๊ทผ๋ฐ ์ฝ์ผ๋ฉด์ ์๋ฌธ์ด ๋ค์๋ ๋ถ๋ถ์ด ์์ด์ ์ง๋ฌธ ํ๋๋ง ํ ๊ฒ!
14๋ฒ๊น์ง ์งํํ๊ณ 15๋ฒ์์ ๋จ์ ์์ญ์ด e, f, g๋ผ๊ณ ํ๋๋ฐ ๋ด๊ฐ ์ดํดํ๊ธฐ๋ก๋ e, f์์ญ์ ์ ๋ถ๋ถ์ด ์ข ๋ ์ง์์ ธ์ผ ํ๋ ๊ฒ ๊ฐ์์ ์ง๋ฌธํด๋ด. (์ผ๊ฐํ g์์, ์ด๋ก์ ์ ๋๊ฐ์ธ ์ ์์ ์ด๋ก์ ๊ณผ ํํํ๊ฒ ๊ทธ์ e, f์ ์๋ถ๋ถ, ๋์ถฉ ์ ์ถ๊ฐํ ์ฌ์ง ๋งํฌ์ผ
https://ibb.co/vdWSmFB)
ํด์๊ธฐํ์ถ