GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์ด์์
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ํ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ์๋๊ฒ ์๋๊ณ ์ ๊ฐ ์ดํดํ ๋ฒ์ ์์์ย ์ฐ๋ ๋ด์ฉ์ด๋ผ ํ๋ฆฌ๊ฑฐ๋ ์ ํํ์ง ์์ ๋ด์ฉ์ด ์์์๋ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด ๊ธ์ ์์ ์ฌ๋ ค๋์ 1ํธ(GJK์๊ณ ๋ฆฌ์ฆ)์์ ์ด์ด์ง๋ ๋ด์ฉ์ด์์
1. ์ถฉ๋๋ฒกํฐ
์ค๋ธ์ ํธ์ ์ถฉ๋๊ฐ์ง์๋ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์์ด์
์ฒซ๋ฒ์งธ๋ ๋จ์ํ on off ๋ฐฉ์์ผ๋ก ์ถฉ๋์ ํ๋์ง ์ํ๋์ง๋ฅผ ๊ฐ์งํ๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ๋ ๋ง์ฝ ๋ ์ค๋ธ์ ํธ๊ฐ ์ถฉ๋ํ๋ค๋ฉด ๊ทธ๋์ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ถ๋ ฅํด์ฃผ๋๊ฑฐ์์
์์ ๊ทธ๋ฆผ์ ์ผ์ชฝ์์ ํ๋์์ผ๋ก ํ์ํด๋์ ํ์ดํ๊ฐ ์ถฉ๋๋ฒกํฐ์์,
์์ ์ผ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ฝ ์ฌ๊ฐํ๊ณผ ์ผ๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด,
์ด๋ ๋ ์ค๋ธ์ ํธ๊ฐ ์ถฉ๋ํ์ง ์๋๋ก, ์ฆ ์ค๋ฅธ์ชฝ์ฒ๋ผ ์๋ก ๊ฒ๋ฉด์ด ๋ง๋๋๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์ ๊ฑฐ๋ฆฌ์ ๋ฒกํฐ๊ฐ ๋ฐ๋ก ์ถฉ๋๋ฒกํฐ์์
๊ทธ๋ฆฌ๊ณ ์ถฉ๋๋ฒกํฐ๋ ํญ์ ๋ ์ค๋ธ์ ํธ๊ฐ ์๋ก ์ถฉ๋ํ์ง ์๋ ์ง์ ๊น์ง ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์ ๊ฑฐ๋ฆฌ์ ๋ฒกํฐ, ์ฆ ์ ์ผ ์งง์ ๋ฒกํฐ๋ฅผ ์ด์ผ๊ธฐํด์
์์ ๊ทธ๋ฆผ์์ ์ฒซ๋ฒ์งธ์ฒ๋ผ ์ฌ๊ฐํ๊ณผ ์ผ๊ฐํ์ด ์ถฉ๋ํ์๋, ์ถฉ๋๋ฒกํฐ๋ ๋๋ฒ์งธ์ฒ๋ผ ํ๋์์ด ์๋๋ผ, ์ธ๋ฒ์งธ์ฒ๋ผ ์ด๋ก์์ด์์
2. GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ
GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ 1ํธ์์ ์ด์ผ๊ธฐํ GJK์๊ณ ๋ฆฌ์ฆ์์ ์ด์ด์ง๋ ์๊ณ ๋ฆฌ์ฆ์ด์์
GJK์๊ณ ๋ฆฌ์ฆ์ด ๋จ์ํ ๋ ๋ค๊ฐํ์ด on off๋ก ์ถฉ๋ํ๋์ง ์ํ๋์ง๋ง์ ์ถ๋ ฅํ๋ค๋ฉด
GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋์ง ์ํ๋์ง์ ํจ๊ป, ๋ง์ฝ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด ๊ทธ๋์ ์ถฉ๋๋ฒกํฐ ๋ํ ์ถ๋ ฅํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ด์์
์์ ๊ทธ๋ฆผ์ 1ํธ์์ ์ค๋ช ํ๋ ๋ด์ฉ์ด์์
์์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์์ ๋์์๋๊ฒ์ฒ๋ผ ๋ง์ฝ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด
๊ทธ๋ ์์ ์ ๋ ๋ค๊ฐํ์ย ๋ฏผ์ฝ์คํํค ์ฐจ์ด ๋ด๋ถ์ ์๊ณ
๋ง์ฝ ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ์ง ์์๋ค๋ฉด, ๊ทธ๋์ ์์ ์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ ์ธ๋ถ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์์ ๋์์๋๊ฒ์ฒ๋ผ
๋ง์ฝ ๋ ๋ค๊ฐํ์ด ์๋ก ๊ฐ์ฅ์๋ฆฌ์์ ๋ง๋๋ค๋ฉด
๊ทธ๋์ ์์ ์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ ๊ฐ์ฅ์๋ฆฌ์ ์์ด์
์ฆ, ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ์๋ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ค๋ฉด
๋ ๋ค๊ฐํ์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด ๋ด๋ถ์ ์๋ ์์ ์, ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ ๊ฐ์ฅ์๋ฆฌ๊น์ง ์ฎ๊ธฐ๊ธฐ ์ํ ์ต์๊ฑฐ๋ฆฌ(์ ์ผ ๊ธธ์ด๊ฐ ์งง์ ๋ฒกํฐ)๋ฅผ ๊ตฌํ๋ฉด ๋์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ ๋ค๊ฐํ์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด์์, ๊ทธ ๋ด๋ถ์ ์๋ ์์ ์ ๊ฐ์ฅ์๋ฆฌ๋ก ์ฎ๊ธฐ๊ธฐ ์ํ ์ต์ ๋ฒกํฐ๋ฅผ ๊ตฌํ๋๊ฒ ๋ฐ๋ก GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ์์
์์ ๊ฒฝ์ฐ์ ์ค๋ฅธ์ชฝ์ ๋ค๊ฐํ์ ์ฌ๊ฐํ์์ ์ผ๊ฐํ์ ๋บ์๋์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด๋ก ์ป์ด์ง ๋ค๊ฐํ์ด์์,ย
์ฆ, ์ด๋์ ์ถฉ๋๋ฒกํฐ๋, ์ผ๊ฐํ์ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ๋ฐฉํฅ์ ๋ฒกํฐ์์
๋ฐ๋๋ก ์์ ๊ทธ๋ฆผ์ฒ๋ผ ์ผ๊ฐํ์์ ์ฌ๊ฐํ์ ๋บ ๋ฏผ์ฝ์คํํค ์ฐจ์ด์์ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ตฌํ๋ฉด
์ด๋ ๋์ค๋ ์ถฉ๋๋ฒกํฐ๋ ์ฌ๊ฐํ์ ์ผ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ถฉ๋๋ฒกํฐ๊ฐ ๋์์
์์ ์ฌ๋ ค๋์ ๊ทธ๋ฆผ์ด ๋ฒกํฐ์ ๋บ์ ์ ๋ฐฉํฅ์ด์์
๋ง์ฝ a๋ฒกํฐ์์ b๋ฒกํฐ๋ฅผ ๋บ๋ค๋ฉด ์์ ๊ทธ๋ฆผ์ฒ๋ผ b์์ a๋ก ํฅํ๋ ๋ฐฉํฅ์ ๋ฒกํฐ๊ฐ ๋์์
์ฆ, ์ฌ๊ฐํ์์ ์ผ๊ฐํ์ ๋บ ๋ฏผ์ฝ์คํํค ์ฐจ์ด๋, ๊ฒฐ๊ตญ ์ผ๊ฐํ์์ ์ฌ๊ฐํ์ผ๋ก ํฅํ๋ ๋ฒกํฐ๋ค์ ์งํฉ์ด๋๊น
์ด๋ ๋์ค๋ ์ถฉ๋๋ฒกํฐ๋ ์ผ๊ฐํ์ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ์ด๋์ํค๊ธฐ ์ํ ๋ฒกํฐ๊ฐ ๋๋๊ฑฐ์์,ย
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๋ฐ๋๋ก ์ผ๊ฐํ์์ ์ฌ๊ฐํ์ ๋บ ๋ฏผ์ฝ์คํํค ์ฐจ์ด๋ผ๋ฉด, ์ฌ๊ฐํ์ ์ผ๊ฐํ ๋ฐ์ผ๋ก ์ด๋์ํค๊ธฐ ์ํ ๋ฒกํฐ๊ฐ ๋์ค๊ฒ ๋๋๊ฑฐ๊ณ ์ฌ
3. ์ ๊ณผ ์ง์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
๋ค์์ GJK-EPA์๊ณ ๋ฆฌ์ฆ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ํจ์์ธ
์ ๊ณผ ์ง์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์์ ๋ํ ์ค๋ช ์ด์์
์ฒซ๋ฒ์งธ๋ก ์์ ๊ทธ๋ฆผ์ ํฌ์๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๊ณต์์ด์์
์์ ๊ทธ๋ฆผ์์ a๋ฒกํฐ๋ฅผ b๋ฒกํฐ๊ฐ ์๋ ๋ฐฉํฅ์ผ๋ก ํฌ์์ํจ c๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ค๋ฉด
a๋ฒกํฐ๋ฅผ b๋ฒกํฐ์ ๋ด์ ํ๋ฉด ๋์, ๊ทธ๋ฌ๋ฉด c๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด๋ b๋ฒกํฐ๋ ๋จ์๋ฒกํฐ(๊ธธ์ด๊ฐ 1์ธ ๋ฒกํฐ)์ฌ์ผ๋์ ๊ทธ๋์ผ ๋ ๋ฒกํฐ๋ฅผ ๋ด์ ํ์๋ c๋ฒกํฐ์ ๊ธธ์ด๊ฐ ๋์์
๊ทธ๋ฆฌ๊ณ ์์ ๊ทธ๋ฆผ์ด ์์์ ์ค๋ช ํ ํฌ์๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๊ณต์์ ์ฌ์ฉํด์, ์ ๊ณผ ์ง์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋๊ฑฐ์์
์์ ๊ทธ๋ฆผ์ฒ๋ผ a๋ผ๋ ์ง์ ๊ณผ ํ๋์ ์ ์ฌ์ด์ ๊ธธ์ด์ธ ์ด๋ก์ c์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ค๋ฉด,ย
์ด๋ a์ง์ ์์ ํ๋์ ์ ์ด ์๋ ๋ฐฉํฅ์ผ๋ก์ย ์์ง๋ฒกํฐ(์ด๊ฑด 1ํธ์์ ์ค๋ช ํ vector_directํจ์๋ก ๊ตฌํ ์ ์์ด์) ๋ฅผ
์ ๊ทํ(๋ฒกํฐ๋ฅผ ๊ธธ์ด๊ฐ 1์ธ ๋จ์๋ฒกํฐ๋ก ๋ง๋๋ ๊ณผ์ )ํ ๋ค์, ๊ทธ๋ ๊ฒ ์ป์ด์ง ์ฃผํฉ์ ๋ฒกํฐ์
a์ง์ ์ ํ ์ ์์ ํ๋์ ์ ๊น์ง์ ๋ฒกํฐ์ธ b๋ฅผ ๋ด์ ํ๋ฉด ๋์,
๊ทธ๋ฌ๋ฉด ์ต์ข ์ ์ผ๋ก c๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ์ป์์ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ ก
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
ใ กใ กใ กใ กใ กใ กใ กใ ก
ใ กใ กใ กใ กใ กใ กใ กใ ก
def line_dist(x1,y1,x2,y2)
vx, vy = vector_direct(x1,y1,x2,y2)
vx, vy = vx/((vx**2+vy**2)**0.5), vy/((vx**2+vy**2)**0.5)ย
return vx, vy, x2*vx+y2*vy
end
ใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์์ ์ฌ๋ ค๋์ ๋๋ฒ์งธ ํจ์๊ฐ, ์ด๋ ๊ฒ ์ ๊ณผ ์ง์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์์์, rubyํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ๊ฑฐ์์,
์ฒซ๋ฒ์งธ ํจ์๋ 1ํธ์์ ์ค๋ช ํ๋ ์์ง๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ํจ์์์
๋๋ฒ์งธ ํจ์๋ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ฒกํฐ x1,y1๊ณผ x2,y2๊ฐ ์์๋ ํ๋์ ๋ฒกํฐ๋ฅผ ๊ตฌํด์ฃผ๋ ํจ์์์
์ฐ์ ์ฒซ๋ฒ์งธ ํจ์๋ฅผ ์ฌ์ฉํด์ x1 y1์ x2 y2๋ฐฉํฅ์ ์์ง๋ฒกํฐ๋ฅผ ๊ตฌํ๋ค์
๊ทธ๋ ๊ฒ ์ป์ด์ง ์์ง๋ฒกํฐ๋ฅผ ์ ๊ทํํด์ ๋จ์๋ฒกํฐ๋ก ๋ง๋ค๊ณ
๊ทธ๋ ๊ฒ ์ป์ด์ง ๋จ์๋ฒกํฐ๋ฅผ x2 y2์ ๋ด์ ํด์ ํ๋์ ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํด์
๊ทธ๋ ๊ฒํด์ ์ต์ข ์ ์ผ๋ก๋ ์ป์ด์ง ํ๋์ ๋ฒกํฐ์ ๊ธธ์ด์, ์์ ๊ตฌํด๋์ ๋จ์๋ฒกํฐ๋ฅผ ํจ๊ป ์ถ๋ ฅํด์ฃผ๋ ํจ์์์
4. ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ ๊ตฌํ๊ธฐ
์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ๋ GJK-EPA์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋๋ ๊ณต์์ด์์,
๊ทธ๋ฆฌ๊ณ ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ตฌํ ์ ์์ด์, x y ๊ฐ๊ฐ ์ขํ๋ฅผ ๋ํ๋ค์ 3์ผ๋ก ๋๋ ์ฃผ๋ฉด ๋์
5. GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์๋๋ฐฉ์
GJK-EPA์๊ณ ๋ฆฌ์ฆ์ 1ํธ์์ ์ค๋ช ํ GJK์๊ณ ๋ฆฌ์ฆ์์ ์ด์ด์ง๋ ์๊ณ ๋ฆฌ์ฆ์ด์์
GJK์๊ณ ๋ฆฌ์ฆ์์๋, ๋ง์ฝ ์์ ์ด ์ผ๊ฐํ์ ๋ด๋ถ์ ์๋ค๋ฉด ๋ ๋ค๊ฐํ์ ์ถฉ๋ํ๋ค๊ณ ํ์ ํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
๊ทธ๋ฆฌ๊ณ GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์ด๋, ์ฆ ์์ ์ด ์ผ๊ฐํ ๋ด๋ถ์ ์์๋
ํจ์๋ฅผ ์ข ๋ฃํ์ง ์๊ณ , ์์ ์ผ๋ก๋ถํฐ ๋ฏผ์ฝ์คํํค ๋ค๊ฐํ์ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ์ต์๋ฒกํฐ๋ฅผ ์ฐพ์์ ์ถ๋ ฅํด์ฃผ๋ ๊ฑฐ์์
์์ ๊ทธ๋ฆผ์ด GJK-EPA์๊ณ ๋ฆฌ์ฆ์ด ์๋ํ๋ ์์์์
์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ดย ์์ ์ด ์ผ๊ฐํ ๋ด๋ถ์ ์๋ค๊ณ ํ์ ํ ์ง์ ์ด์์, ์ฆ GJK์๊ณ ๋ฆฌ์ฆ์ด ๋ ๋ค๊ฐํ์ด ์ถฉ๋ํ๋ค๊ณ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๋ ์ง์ ์ด์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๊ทธ๋ฆผ์ ์ด๋์ ์์ ์ผ๋ก๋ถํฐ ์ผ๊ฐํ์ ๊ฐ๊ฐ์ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋๊ฑฐ์์, ์์์ ์ด์ผ๊ธฐํ ์ ๊ณผ ์ง์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์๋ก ๊ตฌํ ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ๋ ์ด๋ ์ ์ผ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ์ง์ (๊ฑฐ๋ฆฌ๊ฐ ์ฃผํฉ์์ผ๋ก ํ์๋ ์ง์ )์์ ์ผ๊ฐํ ์ธ๋ถ๋ก์ ์์ง๋ฐฉํฅ์ผ๋ก(์ด๋ก์ ๋ฒกํฐ) ์๋ก์ด ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ ๊ฐ์ฅ์๋ฆฌ์ support point๋ฅผ ์ฐพ๋๊ฑฐ์์ ์ด๋ ์ป์ด์ง ์๋ก์ด support point๋ ๋นจ๊ฐ์์ผ๋ก ํ์ํ์ด์
์ผ๊ฐํ ์ธ๋ถ๋ก์ ์์ง๋ฐฉํฅ์ ์ฐพ์ผ๋ ค๋ฉด, vector_dorectํจ์๋ก ์์์ ์ด์ผ๊ธฐํ ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์ ๋ฐ๋๋๋ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ๋ฅผ ์ฐพ์ผ๋ฉด ๋์
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฐฉํฅ์ผ๋ก์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด ๋ค๊ฐํ์ support poinjt๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ์ญ์ 1ํธ์์ ์ด์ผ๊ธฐํ mink_difํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์
๋ค๋ฒ์งธ ๊ทธ๋ฆผ์ ๊ทธ๋ ๊ฒ ์๋ก์ด ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ support point๋ฅผ ์ฐพ์๋ค์, ํด๋น ๋ฐฉํฅ์ ์ผ๊ฐํ์ ๋ชจ์๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ชจ์๋ฆฌ์ ์ ๊ผญ์ง์ ์์ ์๋ก ์ฐพ์ supportย point์ ์ด์ด์ง๋ ๋๊ฐ์ ๋ชจ์๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ์์, ์ฆ ์ผ๊ฐํ์ด ์ฌ๊ฐํ์ด ๋ ๋ชจ์ต์ด์์
๊ทธ๋ฆฌ๊ณ ๋ค์ฏ๋ฒ์งธ ๊ทธ๋ฆผ์ ๋ค์ ์ด ์ฌ๊ฐํ์ 4๊ฐ์ ๋ชจ์๋ฆฌ์ ์์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํด์ ์ ์ผ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ชจ์๋ฆฌ๋ฅผ ๊ตฌํ๋๊ฑฐ์์, ์ญ์ ์์์ ์ค๋ช ํ ์ง์ ๊ณผ ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์๋ฅผ ์ฌ์ฉํด์
๊ทธ๋ฆฌ๊ณ ์ฌ์ฏ๋ฒ์งธ๋ ์ด๋ ๊ฒ ์ฐพ์์ง ์ ์ผ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ชจ์๋ฆฌ(๊ฑฐ๋ฆฌ๊ฐ ์ฃผํฉ์์ผ๋ก ํ์๋ ๋ชจ์๋ฆฌ)์์ ์ญ์ ๋ค๊ฐํ ์ธ๋ถ๋ก ์์ง์ธ ๋ฐฉํฅ์ผ๋ก ์๋ก์ด ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ support point๋ฅผ ์ฐพ๋๊ฑฐ์์,
๋ค๊ฐํ ์ธ๋ถ์ ๋ฐฉํฅ์ผ๋ก์ ์์ง๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ค๋ฉด ๋งจ ์ฒ์์ ๊ตฌํด๋์ ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ์์ง๋ฒกํฐ๋ฅผ ์ฐพ์ผ๋ฉด ๋์
๊ทธ๋ฆฌ๊ณ ์ด๋ ์ฐพ์์ง ์๋ก์ด supprot poin๋ย ๊ธฐ์กด์ ๋ชจ์๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ ๋ค์ค ํ๋์ ํฌํจ๋๋๊น(๋นจ๊ฐ์์ผ๋ก ํ์ํ ์ง์ ), ๊ฒฐ๊ตญ ํ์ฌ์ ๋ชจ์๋ฆฌ๊ฐ ๋ฏผ์ฝ์คํํค ์ฐจ์ด๋ก ์ป์ด์ง ๋ค๊ฐํ์ ๊ฐ์ฅ์๋ฆฌ ๋ผ๋๊ฒ ๋๊ณ
๋ฐ๋ผ์ ์์ ์์ ํ์ฌ ์ง์ ๊น์ง์ ๋ฒกํฐ๊ฐ ์ถฉ๋๋ฒกํฐ๊ฐ ๋๋๊น, ํด๋น ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํ๊ณ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฃํ๋๊ฑฐ์์
์์ ๊ทธ๋ฆผ์ GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ด ์งํ๋ ์ ์๋ ๋๋ค๋ฅธ ๊ฒฝ์ฐ์์,ย
์์ ๊ทธ๋ฆผ์์์ฒ๋ผ ์ฒ์์ ์ต์๊ฑฐ๋ฆฌ๋ผ๊ณ ํ์ ๋์ง ์์๋ ์ง์ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์งํํ๋ฉด์ ์ต์๊ฑฐ๋ฆฌ ์ง์ ์ผ๋ก ํ์ ๋ ์๋ ์์ด์,
์๋๋ฉด ์์ ๊ณผ์ ๋ค์ฒ๋ผ ์ฌ๊ฐํ๊น์ง ํ์ฅํ์ง ์๊ณ ์ผ๊ฐํ ๋จ๊ณ์์ ์ข ๋ฃ๋๊ฑฐ๋, ์๋๋ฉด ๋ ๋ง์ ๋ชจ์๋ฆฌ๋ฅผ ๊ฐ์ง ๋ค๊ฐํ๊น์ง ํ์ฅ๋ ์๋ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
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
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
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
def gjk_epa_collision(p1,p2)
#1
x1,y1 = mink_dif(1,0,p1,p2)
x2,y2 = mink_dif(0-x1,0-y1,p1,p2)
#2
if (x2-x1)*x2+(y2-y1)*y2 <= 0
return nil, nil
end
#3
while 1== 1
vx,vy = vector_direct(x2-x1,y2-y1,0-x1,0-y1)
x3,y3 = mink_dif(vx,vy,p1,p2)
#4
if vx*x3+vy*y3 <= 0
return nil, nil
end
#5
tx,ty=vector_direct(x3-x1,y3-y1,x2-x1,y2-y1)
d1 =ย (0-x1)*tx+(0-y1)*tyย
tx,ty=vector_direct(x3-x2,y3-y2,x1-x2,y1-y2)
d2 =ย (0-x2)*tx+(0-y2)*tyย
#6
if d1 >= 0 && d2 >= 0
p3 = Array.new
p3.push([x1,y1,x2,y2])
p3.push([x2,y2,x3,y3])
p3.push([x3,y3,x1,y1])
cx, cy = (x1+x2+x3)/3,(y1+y2+y3)/3
return epa(p3,p1,p2,cx,cy)
end
#7
if d1 <= 0
x1,y1,x2,y2 = x1,y1,x3,y3
end
#8
if d2 <= 0
x1,y1,x2,y2 = x2,y2,x3,y3
end
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์์ ์ฌ๋ ค๋์ ์ฝ๋๋ 1ํธ์์ ์ค๋ช ํ GJK์๊ณ ๋ฆฌ์ฆ์ ์ฝ๋์์,
๊ทธ๋ฆฌ๊ณ ์์ ์ฝ๋์์ GJK-EPA์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ฅํ๋ฉด์ ์์ ๋ ๋ถ๋ถ์ ํ๋์์ผ๋ก ํ์ํด ๋์์ด์
์ฝ๋๋ฅผ ๋ณด๋ฉด ์ฐ์ ํจ์์ ์ด๋ฆ์ด ๋ฌ๋ผ์ก๊ณ ย
ํจ์์ ์ถ๋ ฅ์์ ์ถฉ๋ํ์ง ์์์๋ 0 ๋์ nil์ ์ถ๋ ฅํ๋๋ก ๋ณ๊ฒฝํ๊ณ
์ถฉ๋ํ์๋ 1์ ์ถ๋ ฅํ๋ ๋์ epa์๊ณ ๋ฆฌ์ฆ์ ์งํํด์ ์ถฉ๋๋ฒกํฐ๋ฅผ ์ถ๋ ฅํ๋๋ก ๋ณ๊ฒฝํ์ด์
์์ ํจ์์์ epa์๊ณ ๋ฆฌ์ฆ์ ์งํํ๋ ๋ถ๋ถ์ ๋ณด๋ฉด
์ผ๊ฐํ์ ๋ชจ์๋ฆฌ๋ฅผ [ [x1,y1,x2,y2], [x2,y2,x3,y3], [x3,y3,x1,y1] ] ํ์์ผ๋ก ruby์ธ์ด์ ๋ฐฐ์ด๋ก ๋ง๋ค๊ณ
์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์ย cx cy ๋ก ๊ตฌํ๋ค์
ํด๋น ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก epa ์๊ณ ๋ฆฌ์ฆ์ ์งํํด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def line_dist(x1,y1,x2,y2)
vx, vy = vector_direct(x1,y1,x2,y2)
vx, vy = vx/((vx**2+vy**2)**0.5), vy/((vx**2+vy**2)**0.5)ย
return vx, vy, x2*vx+y2*vy
end
def side_line(p)
d = nil
i = 0
until p[i] == nil
vx2, vy2 ,d2 = line_dist(p[i][2]-p[i][0],p[i][3]-p[i][1],0-p[i][0],0-p[i][1])
if d == nil || d2 < d
pi, vx, vy, d = i, vx2, vy2, d2
end
i+=1
end
return pi, -vx*d, -vy*d
endย
def epa(p3,p1,p2,cx,cy)
while 1 == 1
pi,x,y = side_line(p3)
vx, vy = vector_direct(p3[pi][2]-p3[pi][0],p3[pi][3]-p3[pi][1],cx-p3[pi][0],cy-p3[pi][1])
mx, my = mink_dif(-vx,-vy,p1,p2)
if ( mx == p3[pi][0] && my == p3[pi][1] ) || ( mx == p3[pi][2] && my == p3[pi][3] )
return x,y
end
p3.push([mx,my,p3[pi][0],p3[pi][1]])
p3.push([mx,my,p3[pi][2],p3[pi][3]])
p3.delete_at(pi)
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์์ ์ฌ๋ ค๋์ ์ฝ๋๋ epa์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋๋ ์ฝ๋์์
์ฒซ๋ฒ์งธ ํจ์๋ ์์์ ์ค๋ช ํ ์ ๊ณผ ์ง์ ๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํจ์์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ํจ์๋ ์์ GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์งํ๋ฐฉ์์์
์์ ๊ณผ ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๋ชจ์๋ฆฌ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด์ ์ ์ผ ์์๊ฑธ ์ฐพ๋ ํจ์์์
ย [ [x1,y1,x2,y2], [x2,y2,x3,y3], [x3,y3,x1,y1] ]ย ํ์์ ๋ฐฐ์ด๋กย ๋ชจ์๋ฆฌ๋ค์ด ์ฃผ์ด์ง ๋ค๊ฐํ์ด ์์๋
์ฒซ๋ฒ์งธ ํจ์๋ฅผ ์ด์ฉํด์ ๋ชจ๋ ๋ชจ์๋ฆฌ์ ๊ธธ์ด๋ฅผ ๋น๊ตํ๋ค์,ย ์ ์ผ ๊ธธ์ด๊ฐ ์์ ๋ชจ์๋ฆฌ์ ์ธ๋ฑ์ค, ๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ ์์ ์์ ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํด์
์ฌ๊ธฐ์๋ ์์ ์์ ๋ค๊ฐํ์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ํฅํ๋ ๋ฐฉํฅ์ ๋ฒกํฐ๋ก ์ถ๋ ฅํด์, ์ฆ ์ฒซ๋ฒ์งธ line_distํจ์์์ ๋์จ๊ฒ๊ณผ๋ย ๋ฐฉํฅ์ด ๋ฐ๋๋๋ ๋ฒกํฐ์์
๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ๋ epa์๊ณ ๋ฆฌ์ฆ์ ํจ์์์
1ํธ์์ ์ค๋ช ํ ์ถฉ๋์ ๊ฐ์งํ๋ ์ฒ์ ๋ค๊ฐํ๋ค์ ๋ฐฐ์ด์ธ p1๊ณผ p2
๊ทธ๋ฆฌ๊ณ ์์์ ์ค๋ช ํ๊ฒ์ฒ๋ผย [ [x1,y1,x2,y2], [x2,y2,x3,y3], [x3,y3,x1,y1] ] ํ์์ ์์ ์ด ํฌํจ๋ ์ผ๊ฐํ์ ๋ฐฐ์ด์ธ p3๊ณผ
์ฒ์ ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์ธ cx์ cy๋ฅผ ์
๋ ฅ๊ฐ์ผ๋ก ๋ฐ์์
๊ทธ๋ ๊ฒํด์ ์ฐ์ ์์ ๋๋ฒ์งธ ํจ์๋ก p3, ์ฆ ์ผ๊ฐํ์์ ์์ ๊ณผ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ชจ์๋ฆฌ์, ์์ ์์ ํด๋น ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ
ํด๋น ๋ชจ์๋ฆฌ์์ ์ผ๊ฐํ์ ๋ฌด๊ฒ์ค์ฌ์ ๋ฐ๋๋๋ ๋ฐฉํฅ์ ์์ง๋ฒกํฐ๋ฅผ ๊ตฌํด์
ํด๋น ๋ฐฉํฅ์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด ๋ค๊ฐํ์ support point๋ฅผ ๊ตฌํ๋ค์
๊ทธ๋ ๊ฒ ๊ตฌํ ์ ์ด ํด๋น ๋ชจ์๋ฆฌ์ ๋ ๊ผญ์ง์ ๊ณผ ๊ฐ์ ์ ์ธ์ง๋ฅผ ๋น๊ตํด์
๊ทธ๋ ๊ฒํด์ ๋ง์ฝ ๊ฐ์ ์ ์ด๋ผ๋ฉด, ๊ทธ๋์ ์์ ์์ ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํ๋ค์ ์ข ๋ฃํ๊ณ
์๋๋ผ๋ฉด ํด๋น ๋ชจ์๋ฆฌ์ ์ ๊ผญ์ง์ ์์ ์๋ก ๊ตฌํ ๋ฏผ์ฝ์คํํค ์ฐจ์ด ๋ค๊ฐํ์ support point๊น์ง์ ๋๊ฐ์ ๋ชจ์๋ฆฌ๋ฅผ p3์ ์ถ๊ฐํ๋ค์
์๋์ ๋ชจ์๋ฆฌ๋ฅผ p3์์ ์ ๊ฑฐํด์
๋ค์ ์ธ๋ฒ์งธ ํจ์๋ฅผ ์ฒ์๋ถํฐ, ์ฆ ์์ ๊ณผ ์ ์ผ ๊ฐ๊น์ด ๋ชจ์๋ฆฌ๋ฅผ ์ฐพ๊ณ ๊ทธ๋์ ์์ ์์ ํด๋น ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ๋ฅผ ๊ตฌํ๋ย ๋ถ๋ถ๋ถํฐย ๋ฐ๋ณตํ๋๊ฑฐ์์
์ด๋ ๊ฒ ํ๋ฉด ์ต์ข ์ ์ผ๋ก ์์ ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ ์ ์ผ ์งง์ผ๋ฉด์ ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ ๊ฐ์ฅ์๋ฆฌ์ ์๋ ๋ชจ์๋ฆฌ๋ฅผ ์ฐพ์์ ์๊ณ
์์ ์ผ๋ก๋ถํฐ ํด๋น ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ์ธ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ตฌํด์ ์ถ๋ ฅํ ์ ์์ด์
ย
์์ ์ฌ๋ ค๋์ ์์์ ์์์ ์ค๋ช ํ GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ๋ง๋ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ์ย ์์์ด์์
์์์์ ํ๋์ ์ฌ๊ฐํ์ด ๋ฐฉํฅํค๋ก ์์ง์ด๋ ์ฌ๊ฐํ์ด์์
์์์ ์ฒซ๋ฒ์งธ์ ๋ค๋ฒ์งธ๋ ์ค๋ธ์ ํธ๊ฐ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ๋ฐฉ์์ด์์,
์ฆ, ๋งจ ์ฒ์์ ์ถฉ๋๋ฒกํฐ์ ๋ฐฉํฅ ๋ถ๋ถ์์ ์ค๋ช ํ๊ฒ์ฒ๋ผ ์ค๋ธ์ ํธ์ ๋ค๊ฐํ์์ ํ๋ ์ด์ด์ ๋ค๊ฐํ์ ๋นผ๋ ๋ฐฉ์์ผ๋ก ๋ฏผ์ฝ์คํํค ์ฐจ์ด์ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ตฌํ๋ค์
์ถฉ๋์์ ํ๋ ์ด์ด๋ฅผ ํด๋น ๋ฒกํฐ๋งํผ ์ด๋์์ผ์ฃผ๋ฉด ๋์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ์ ์ธ๋ฒ์งธ๋ ํ๋ ์ด์ด๊ฐ ์ค๋ธ์ ํธ๋ฅผ ๋ฐ์ด๋ด๋ ๋ฐฉ์์ด์์
์ด๊ฑด ๋ฐ๋๋ก ํ๋ ์ด์ด์ ๋ค๊ฐํ์์ ์ค๋ธ์ ํธ๋ฅด ๋นผ๋ ๋ฐฉ์์ผ๋ก ๋ฏผ์ฝ์คํํค ์ฐจ์ด ๋ค๊ฐํ์ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ตฌํด์
์ค๋ธ์ ํธ๋ฅผ ํด๋น ๋ฒกํฐ๋งํผ ์ด๋์์ผ์ฃผ๋ฉด ๋์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒํ๋ฉด GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ ์์ด์
์ง์ง ๋๋ฌด ์ข์๊ธ์ ๋๋ค
ํน์ ๋ธ๋ก๊ทธ๊ฐ์๊ฑด ์ํ์๋์ ์ข์ ์๋ฃ๋ค์ ๋งํฌ๋ฅผ ๋ชจ์๋๊ณ ์๋๋ฐ ๋์จ ๊ฒ์๋ฌผ๋ค์ ๋์ค์๋ณด๋ฉด ์งค์ด ์์ด์ง๊ฑฐ๋ ํ๋ ์ผ๋ ์ข ์์ด์.
์ ์ด๋ฐ๊ฑฐ ์์์ผ ๊ฐ๋ฐํ ์์๋๊ฑฐ๊ตฌ๋... ๋ ๋ฐ๋กํฌ๊ธฐํด์ผํ๋๊ฑฐ์ผ...?ใ
GJK-EPA์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ์ค๋ธ์ ํธ ๋ฐ์ด๋ด๊ธฐ..์๋..
์ปดํจํฐ๋๋จํด..