GJK-EPA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธ€์ด์—์š”


๊ทธ๋ฆฌ๊ณ  ์ €๋„ ์ˆ˜ํ•™์ด๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ ์•„๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋ฒ”์œ„ ์•ˆ์—์„œย ์“ฐ๋Š” ๋‚ด์šฉ์ด๋ผ ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋‚ด์šฉ์ด ์žˆ์„์ˆ˜๋„ ์žˆ์–ด์š”


๊ทธ๋ฆฌ๊ณ  ์ด ๊ธ€์€ ์œ„์— ์˜ฌ๋ ค๋†“์€ 1ํŽธ(GJK์•Œ๊ณ ๋ฆฌ์ฆ˜)์—์„œ ์ด์–ด์ง€๋Š” ๋‚ด์šฉ์ด์—์š”




1. ์ถฉ๋Œ๋ฒกํ„ฐ



7cf08168f5dc3f8650bbd58b3680766c066f



์˜ค๋ธŒ์ ํŠธ์˜ ์ถฉ๋Œ๊ฐ์ง€์—๋Š” ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์š”


์ฒซ๋ฒˆ์งธ๋Š” ๋‹จ์ˆœํžˆ on off ๋ฐฉ์‹์œผ๋กœ ์ถฉ๋Œ์„ ํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€๋ฅผ ๊ฐ์ง€ํ•˜๋Š”๊ฑฐ์—์š”


๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ๋Š” ๋งŒ์•ฝ ๋‘ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ถฉ๋Œํ–ˆ๋‹ค๋ฉด ๊ทธ๋•Œ์˜ ์ถฉ๋Œ๋ฒกํ„ฐ๋ฅผ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š”๊ฑฐ์—์š”




์œ„์˜ ๊ทธ๋ฆผ์˜ ์™ผ์ชฝ์—์„œ ํŒŒ๋ž‘์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•ด๋†“์€ ํ™”์‚ดํ‘œ๊ฐ€ ์ถฉ๋Œ๋ฒกํ„ฐ์—์š”,


์œ„์˜ ์™ผ์ชฝ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋งŒ์•ฝ ์‚ฌ๊ฐํ˜•๊ณผ ์‚ผ๊ฐํ˜•์ด ์ถฉ๋Œํ–ˆ๋‹ค๋ฉด,


์ด๋•Œ ๋‘ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก, ์ฆ‰ ์˜ค๋ฅธ์ชฝ์ฒ˜๋Ÿผ ์„œ๋กœ ๊ฒ‰๋ฉด์ด ๋งŒ๋‚˜๋„๋ก ๋ฐ€์–ด๋‚ด๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ์˜ ๋ฒกํ„ฐ๊ฐ€ ๋ฐ”๋กœ ์ถฉ๋Œ๋ฒกํ„ฐ์—์š”





7cf08268f5dc3f8650bbd58b36897d69df



๊ทธ๋ฆฌ๊ณ  ์ถฉ๋Œ๋ฒกํ„ฐ๋Š” ํ•ญ์ƒ ๋‘ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์„œ๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ์ง€์ ๊นŒ์ง€ ๋ฐ€์–ด๋‚ด๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ์˜ ๋ฒกํ„ฐ, ์ฆ‰ ์ œ์ผ ์งง์€ ๋ฒกํ„ฐ๋ฅผ ์ด์•ผ๊ธฐํ•ด์š”


์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์ฒซ๋ฒˆ์งธ์ฒ˜๋Ÿผ ์‚ฌ๊ฐํ˜•๊ณผ ์‚ผ๊ฐํ˜•์ด ์ถฉ๋Œํ–ˆ์„๋•Œ, ์ถฉ๋Œ๋ฒกํ„ฐ๋Š” ๋‘๋ฒˆ์งธ์ฒ˜๋Ÿผ ํŒŒ๋ž‘์ƒ‰์ด ์•„๋‹ˆ๋ผ, ์„ธ๋ฒˆ์งธ์ฒ˜๋Ÿผ ์ดˆ๋ก์ƒ‰์ด์—์š”





2. GJK-EPA ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ


7ff08168f5dc3f8650bbd58b36847d6825



7ff08268f5dc3f8650bbd58b36847c6e67


GJK-EPA ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 1ํŽธ์—์„œ ์ด์•ผ๊ธฐํ•œ GJK์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ด์–ด์ง€๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—์š”


GJK์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹จ์ˆœํžˆ ๋‘ ๋‹ค๊ฐํ˜•์ด on off๋กœ ์ถฉ๋Œํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€๋งŒ์„ ์ถœ๋ ฅํ–ˆ๋‹ค๋ฉด


GJK-EPA ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‘ ๋‹ค๊ฐํ˜•์ด ์ถฉ๋Œํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€์™€ ํ•จ๊ป˜, ๋งŒ์•ฝ ๋‘ ๋‹ค๊ฐํ˜•์ด ์ถฉ๋Œํ–ˆ๋‹ค๋ฉด ๊ทธ๋•Œ์˜ ์ถฉ๋Œ๋ฒกํ„ฐ ๋˜ํ•œ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—์š”





์œ„์˜ ๊ทธ๋ฆผ์€ 1ํŽธ์—์„œ ์„ค๋ช…ํ–ˆ๋˜ ๋‚ด์šฉ์ด์—์š”


์œ„์˜ ์ฒซ๋ฒˆ์งธ ๊ทธ๋ฆผ์—์„œ ๋‚˜์™€์žˆ๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ์•ฝ ๋‘ ๋‹ค๊ฐํ˜•์ด ์ถฉ๋Œํ–ˆ๋‹ค๋ฉด


๊ทธ๋•Œ ์›์ ์€ ๋‘ ๋‹ค๊ฐํ˜•์˜ย ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด ๋‚ด๋ถ€์— ์žˆ๊ณ 


๋งŒ์•ฝ ๋‘ ๋‹ค๊ฐํ˜•์ด ์ถฉ๋Œํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๊ทธ๋•Œ์˜ ์›์ ์€ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด์˜ ์™ธ๋ถ€์— ์žˆ์–ด์š”






7ff08368f5dc3f8650bbd58b36847c6c71




๊ทธ๋ฆฌ๊ณ  ์œ„์— ๋‚˜์™€์žˆ๋Š”๊ฒƒ์ฒ˜๋Ÿผ


๋งŒ์•ฝ ๋‘ ๋‹ค๊ฐํ˜•์ด ์„œ๋กœ ๊ฐ€์žฅ์ž๋ฆฌ์—์„œ ๋งŒ๋‚œ๋‹ค๋ฉด


๊ทธ๋•Œ์˜ ์›์ ์€ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์žˆ์–ด์š”



7ff08468f5dc3f8650bbd58b3687776f7b



์ฆ‰, ๋‘ ๋‹ค๊ฐํ˜•์ด ์ถฉ๋Œํ–ˆ์„๋•Œ ์ถฉ๋Œ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด


๋‘ ๋‹ค๊ฐํ˜•์˜ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด ๋‚ด๋ถ€์— ์žˆ๋Š” ์›์ ์„, ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด์˜ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•œ ์ตœ์†Œ๊ฑฐ๋ฆฌ(์ œ์ผ ๊ธธ์ด๊ฐ€ ์งง์€ ๋ฒกํ„ฐ)๋ฅผ ๊ตฌํ•˜๋ฉด ๋˜์š”


๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ๋‘ ๋‹ค๊ฐํ˜•์˜ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด์—์„œ, ๊ทธ ๋‚ด๋ถ€์— ์žˆ๋Š” ์›์ ์„ ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋Š”๊ฒŒ ๋ฐ”๋กœ GJK-EPA์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ์—์š”




์œ„์˜ ๊ฒฝ์šฐ์— ์˜ค๋ฅธ์ชฝ์˜ ๋‹ค๊ฐํ˜•์€ ์‚ฌ๊ฐํ˜•์—์„œ ์‚ผ๊ฐํ˜•์„ ๋บ์„๋•Œ์˜ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด๋กœ ์–ป์–ด์ง„ ๋‹ค๊ฐํ˜•์ด์—์š”,ย 


์ฆ‰, ์ด๋•Œ์˜ ์ถฉ๋Œ๋ฒกํ„ฐ๋Š”, ์‚ผ๊ฐํ˜•์„ ์‚ฌ๊ฐํ˜• ๋ฐ–์œผ๋กœ ๋ฐ€์–ด๋‚ด๊ธฐ ์œ„ํ•œ ๋ฐฉํ–ฅ์˜ ๋ฒกํ„ฐ์—์š”


7ff08568f5dc3f8650bbd58b3687706f61


๋ฐ˜๋Œ€๋กœ ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์‚ผ๊ฐํ˜•์—์„œ ์‚ฌ๊ฐํ˜•์„ ๋บ€ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด์—์„œ ์ถฉ๋Œ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋ฉด


์ด๋•Œ ๋‚˜์˜ค๋Š” ์ถฉ๋Œ๋ฒกํ„ฐ๋Š” ์‚ฌ๊ฐํ˜•์„ ์‚ผ๊ฐํ˜• ๋ฐ–์œผ๋กœ ๋ฐ€์–ด๋‚ด๊ธฐ ์œ„ํ•œ ์ถฉ๋Œ๋ฒกํ„ฐ๊ฐ€ ๋‚˜์™€์š”


7ff08668f5dc3f8650bbd58b368774657f



์œ„์— ์˜ฌ๋ ค๋†“์€ ๊ทธ๋ฆผ์ด ๋ฒกํ„ฐ์˜ ๋บ„์…ˆ์˜ ๋ฐฉํ–ฅ์ด์—์š”


๋งŒ์•ฝ a๋ฒกํ„ฐ์—์„œ b๋ฒกํ„ฐ๋ฅผ ๋บ๋‹ค๋ฉด ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ b์—์„œ a๋กœ ํ–ฅํ•˜๋Š” ๋ฐฉํ–ฅ์˜ ๋ฒกํ„ฐ๊ฐ€ ๋‚˜์™€์š”




์ฆ‰, ์‚ฌ๊ฐํ˜•์—์„œ ์‚ผ๊ฐํ˜•์„ ๋บ€ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด๋Š”, ๊ฒฐ๊ตญ ์‚ผ๊ฐํ˜•์—์„œ ์‚ฌ๊ฐํ˜•์œผ๋กœ ํ–ฅํ•˜๋Š” ๋ฒกํ„ฐ๋“ค์˜ ์ง‘ํ•ฉ์ด๋‹ˆ๊นŒ


์ด๋•Œ ๋‚˜์˜ค๋Š” ์ถฉ๋Œ๋ฒกํ„ฐ๋Š” ์‚ผ๊ฐํ˜•์„ ์‚ฌ๊ฐํ˜• ๋ฐ–์œผ๋กœ ์ด๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฒกํ„ฐ๊ฐ€ ๋˜๋Š”๊ฑฐ์—์š”,ย 


๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๋ฐ˜๋Œ€๋กœ ์‚ผ๊ฐํ˜•์—์„œ ์‚ฌ๊ฐํ˜•์„ ๋บ€ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด๋ผ๋ฉด, ์‚ฌ๊ฐํ˜•์„ ์‚ผ๊ฐํ˜• ๋ฐ–์œผ๋กœ ์ด๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ฒกํ„ฐ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜๋Š”๊ฑฐ๊ณ ์—ฌ







3. ์ ๊ณผ ์ง์„  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ตฌํ•˜๊ธฐ



7ef08168f5dc3f8650bbd58b3684746dbc




๋‹ค์Œ์€ GJK-EPA์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ธ


์ ๊ณผ ์ง์„ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์ด์—์š”




์ฒซ๋ฒˆ์งธ๋กœ ์œ„์˜ ๊ทธ๋ฆผ์€ ํˆฌ์˜๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๊ณต์‹์ด์—์š”


์œ„์˜ ๊ทธ๋ฆผ์—์„œ a๋ฒกํ„ฐ๋ฅผ b๋ฒกํ„ฐ๊ฐ€ ์žˆ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํˆฌ์˜์‹œํ‚จ c๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด


a๋ฒกํ„ฐ๋ฅผ b๋ฒกํ„ฐ์™€ ๋‚ด์ ํ•˜๋ฉด ๋˜์š”, ๊ทธ๋Ÿฌ๋ฉด c๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ• ์ˆ˜ ์žˆ์–ด์š”


๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ b๋ฒกํ„ฐ๋Š” ๋‹จ์œ„๋ฒกํ„ฐ(๊ธธ์ด๊ฐ€ 1์ธ ๋ฒกํ„ฐ)์—ฌ์•ผ๋˜์š” ๊ทธ๋ž˜์•ผ ๋‘ ๋ฒกํ„ฐ๋ฅผ ๋‚ด์ ํ–ˆ์„๋•Œ c๋ฒกํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ๋‚˜์™€์š”


7ef08268f5dc3f8650bbd58b36857d6eb7


๊ทธ๋ฆฌ๊ณ  ์œ„์˜ ๊ทธ๋ฆผ์ด ์•ž์—์„œ ์„ค๋ช…ํ•œ ํˆฌ์˜๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๊ณต์‹์„ ์‚ฌ์šฉํ•ด์„œ, ์ ๊ณผ ์ง์„ ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š”๊ฑฐ์—์š”


์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ a๋ผ๋Š” ์ง์„ ๊ณผ ํŒŒ๋ž‘์ƒ‰ ์  ์‚ฌ์ด์˜ ๊ธธ์ด์ธ ์ดˆ๋ก์ƒ‰ c์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด,ย 


์ด๋•Œ a์ง์„ ์—์„œ ํŒŒ๋ž‘์ƒ‰ ์ ์ด ์žˆ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ์˜ย ์ˆ˜์ง๋ฒกํ„ฐ(์ด๊ฑด 1ํŽธ์—์„œ ์„ค๋ช…ํ•œ vector_directํ•จ์ˆ˜๋กœ ๊ตฌํ• ์ˆ˜ ์žˆ์–ด์š”) ๋ฅผ


์ •๊ทœํ™”(๋ฒกํ„ฐ๋ฅผ ๊ธธ์ด๊ฐ€ 1์ธ ๋‹จ์œ„๋ฒกํ„ฐ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •)ํ•œ ๋‹ค์Œ, ๊ทธ๋ ‡๊ฒŒ ์–ป์–ด์ง„ ์ฃผํ™ฉ์ƒ‰ ๋ฒกํ„ฐ์™€


a์ง์„ ์˜ ํ•œ ์ ์—์„œ ํŒŒ๋ž‘์ƒ‰ ์ ๊นŒ์ง€์˜ ๋ฒกํ„ฐ์ธ b๋ฅผ ๋‚ด์ ํ•˜๋ฉด ๋˜์š”,


๊ทธ๋Ÿฌ๋ฉด ์ตœ์ข…์ ์œผ๋กœ c๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ์–ป์„์ˆ˜ ์žˆ์–ด์š”






7ef08368f5dc3f8650bbd58b36877d6eb1



ใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…ก

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. ์‚ผ๊ฐํ˜•์˜ ๋ฌด๊ฒŒ์ค‘์‹ฌ ๊ตฌํ•˜๊ธฐ

79f08168f5dc3f8650bbd58b3680756f1964



์‚ผ๊ฐํ˜•์˜ ๋ฌด๊ฒŒ์ค‘์‹ฌ๋„ GJK-EPA์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต์‹์ด์—์š”,


๊ทธ๋ฆฌ๊ณ  ์‚ผ๊ฐํ˜•์˜ ๋ฌด๊ฒŒ์ค‘์‹ฌ์€ ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ตฌํ• ์ˆ˜ ์žˆ์–ด์š”, x y ๊ฐ๊ฐ ์ขŒํ‘œ๋ฅผ ๋”ํ•œ๋‹ค์Œ 3์œผ๋กœ ๋‚˜๋ˆ ์ฃผ๋ฉด ๋˜์š”






5. GJK-EPA์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ž‘๋™๋ฐฉ์‹


78f08168f5dc3f8650bbd58b36837c6cd057



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๋Š”ย ๊ธฐ์กด์˜ ๋ชจ์„œ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ ๋“ค์ค‘ ํ•˜๋‚˜์— ํฌํ•จ๋˜๋‹ˆ๊นŒ(๋นจ๊ฐ•์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•œ ์ง€์ ), ๊ฒฐ๊ตญ ํ˜„์žฌ์˜ ๋ชจ์„œ๋ฆฌ๊ฐ€ ๋ฏผ์ฝ”์Šคํ”„ํ‚ค ์ฐจ์ด๋กœ ์–ป์–ด์ง„ ๋‹ค๊ฐํ˜•์˜ ๊ฐ€์žฅ์ž๋ฆฌ ๋ผ๋Š”๊ฒŒ ๋˜๊ณ 


๋”ฐ๋ผ์„œ ์›์ ์—์„œ ํ˜„์žฌ ์ง์„ ๊นŒ์ง€์˜ ๋ฒกํ„ฐ๊ฐ€ ์ถฉ๋Œ๋ฒกํ„ฐ๊ฐ€ ๋˜๋‹ˆ๊นŒ, ํ•ด๋‹น ๋ฒกํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ข…๋ฃŒํ•˜๋Š”๊ฑฐ์—์š”





78f08268f5dc3f8650bbd58b3683766c37c7




์œ„์˜ ๊ทธ๋ฆผ์€ 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์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ์–ด์š”