๋ถ๋ฆฌ์ถ(SAT) ์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์ด์์
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ํ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ์๋๊ฒ ์๋๊ณ ์ ๊ฐ ์ดํดํ ๋ฒ์ ์์์ ์ฐ๋ ๋ด์ฉ์ด๋ผ ํ๋ฆฌ๊ฑฐ๋ ์ ํํ์ง ์์ ๋ด์ฉ๋ค์ด ์์์๋ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
1. ๋ณผ๋ก๋ค๊ฐํ
๋ถ๋ฆฌ์ถ ์ถฉ๋๊ฒ์ฌ๋ ๋ ๋ณผ๋ก๋ค๊ฐํ์ ์ถฉ๋์ ํ์ ํ๋ ๋ฐฉ๋ฒ์ด์์
์์ ๊ทธ๋ฆผ์์ ์ฒซ๋ฒ์งธ ๋๋ฒ์งธ๋ ๋ณผ๋ก๋ค๊ฐํ์ด์ง๋ง, ์ธ๋ฒ์งธ๋ ๋ณผ๋ก๋ค๊ฐํ์ด ์๋์์
2. ์ต์์ด๋๋ฒกํฐ(MTV, Minimum Translation Vector)
MTV๋ ๋ ๋ํ์ด ์ถฉ๋ํ์๋, ๋ํ์ ์๋ก ์ถฉ๋ํ์ง ์๋ ์ํ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์ ๊ฑฐ๋ฆฌ์ ๋ฒกํฐ๋ฅผ ์ด์ผ๊ธฐํ๋๊ฑฐ์์
์๋์ ๊ทธ๋ฆผ์ ๋๊ฐ์ง ๋ฒกํฐ์ค ์ด๋ก์ ๋ฒกํฐ๊ฐ ์ต์์ด๋๋ฒกํฐ์ ํด๋น๋์, ํ๋์์ ์ต์๊ธธ์ด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ต์์ด๋๋ฒกํฐ๊ฐ ์๋์์
3. ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ์ ์๋ฆฌ
์์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ ์ฌ๊ฐํ๊ณผ ์ผ๊ฐํ์ด ์ถฉ๋ํ ์ํ์ด๊ณ , ๋๋ฒ์งธ ๊ทธ๋ฆผ์ ์ฌ๊ฐํ๊ณผ ์ผ๊ฐํ์ด ์ถฉ๋ํ์ง ์์ ์ํ์์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆผ์ ๊ฐ์ฅ์๋ฆฌ์ ๊ฒ์ ์ ๋ค์, ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๋ชจ์๋ฆฌ์์ ์์ง์ธ ๋ฒกํฐ๋ค์ด์์, ์ฆ, ๊ทธ๋ฆผ์์๋ ์ผ๋ถ๋ง ๊ทธ๋ ค์ ธ์์ง๋ง, ์ฌ๊ฐํ4๊ฐ ์ผ๊ฐํ3๊ฐ ํด์ ์ด 7๊ฐ์ ๋ฒกํฐ๊ฐ ์์์ ์์ด์
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ์๋ฆฌ์ ๋ฒกํฐ ์์ ๋ํ๊ณผ ๋์ผํ ์์ผ๋ก ๊ทธ๋ ค์ง ์ ๋ค์, ํด๋น ๋ค๊ฐํ์ ๊ทธ ๋ฒกํฐ ์์ ํฌ์ํ์๋์ ์์ญ์ ํ์ํ๊ฑฐ์์
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ฝ ๋ ๋ํ์ด ์ถฉ๋ํ๋ค๋ฉด, ๋ ๋ํ์ ๊ฐ๊ฐ์ ๊ฐ์ฅ์๋ฆฌ์ ์์ง์ธ ๋ชจ๋ (7๊ฐ)์ ๋ฒกํฐ์์, ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ง๊ฒ์ฒ๋ผ ๋ ๋ํ์ ํฌ์์์ญ์ ๊ฒน์น๊ฒ ๋์
๋ฐ๋๋ก ๋๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผ ๋ง์ฝ ๋ ๋ํ์ด ์ถฉ๋ํ์ง ์์๋ค๋ฉด, ๋ชจ๋ (7๊ฐ)์ ๋ฒกํฐ ์ค์์ ๊ทธ๋ฆผ์ ๋์์๋๊ฒ์ฒ๋ผ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋ ๋ฒกํฐ๊ฐ ์์ด์,
์ฆ, ๋ค๊ฐํ์ ๊ฐ๊ฐ์ ๊ฐ์ฅ์๋ฆฌ์ ์์ง์ธ ๋ชจ๋ ๋ฒกํฐ๋ณ๋ก, ๊ฐ ๋ฒกํฐ๋ค๋ง๋ค ๋ํ์ ํฌ์์์ผ์, ๊ทธ ์์ญ์ด ๊ฒน์น๋์ง ์๋์ง๋ฅผ ์กฐ์ฌํ๋ฉด, ๊ฒฐ๊ตญ ๋ ๋ํ์ด ์ถฉ๋ํ์ง ์๋์ง๋ฅผ ๊ตฌํ ์ ์์ด์,
๋ง์ฝ ํ๋๋ผ๋ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋ ๋ฒกํฐ๊ฐ ์๋ค๋ฉด, ๋ ๋ํ์ ์ถฉ๋ํ์ง ์๋ ๊ฒ์ด๊ณ , ๋ชจ๋ ๋ฒกํฐ์์ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ค๋ฉด ๋ ๋ํ์ ์ถฉ๋ํ๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ์ ์๋ฆฌ์์
๊ทธ๋ฆฌ๊ณ ์ด๋ ์์์ ์ค๋ช ํ ์ต์์ด๋๋ฒกํฐ(MTV)๋ฅผ ๊ตฌํ๋ ค๋ฉด, ๋ ๋ํ์ ํฌ์์์ญ์ด ์ ์ผ ์ ๊ฒ ๊ฒน์น๋ ๋ฒกํฐ๋ฅผ ์ฐพ์ผ๋ฉด ๋์,
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๋ ๋ํ์ ํฌ์์ํจ ๋ฒกํฐ์ ๋ฐฉํฅ์ผ๋ก, ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด ๋งํผ์ ๋ฒกํฐ๊ฐ, MTV๊ฐ ๋๋๊ฑฐ์์
์์ ๊ทธ๋ฆผ์์ ์ด๋ก์์ผ๋ก ํ์ํ ๋ฒกํฐ๊ฐ ๋ ๋ํ์ ์ถฉ๋์์์ MTV์์
๊ทธ๋ฆฌ๊ณ MTV์ ๋ฐฉํฅ์ ๊ฒฐ์ ํ๊ธฐ ์ํด์๋(์์ ๊ทธ๋ฆผ์์ ์ผ๊ฐํ์ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ผ์ง, ์ฌ๊ฐํ์ ์ผ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ผ์ง)
๋ ํฌ์์์ญ์ค ์ด๋ค ์ ๋ถ์ ๊ณ ์ ์ํค๊ณ ๋ฐ์ด๋ผ์ง์ ๋ฐ๋ผ ๊ธธ์ด์ ๋ถํธ๋ฅผ +ํน์-๋ก ํ๋ฉด ๋์
์์ ๊ทธ๋ฆผ์ ํ๋์์ด ์ผ์ชฝ, ์ฃผํฉ์์ด ์ค๋ฅธ์ชฝ์ธ ์ํ์์, ํ๋์์ ์ฃผํฉ์ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ณ ์ ํด์
-๊ธธ์ด๊ฐ ๋์ค๊ฒ ๋๋๊ฑฐ์์
4. ํฌ์๋ฒกํฐ์ ๊ธธ์ด ๊ตฌํ๊ธฐ
์์ ๊ทธ๋ฆผ์์ a๋ฒกํฐ๋ฅผ b๋ฒกํฐ์ ๋ฐฉํฅ์ผ๋ก ํฌ์์ํจ c๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋
a๋ฒกํฐ์ b๋ฒกํฐ๋ฅผ ๋ด์ ํ๋ฉด ๋์, ๋จ ์ด๋ b๋ฒกํฐ๋ ๋จ์๋ฒกํฐ(๊ธธ์ด๊ฐ 1์ธ ๋ฒกํฐ)์ฌ์ผ ๋์
๊ทธ๋์ผ ๋ ๋ฒกํฐ๋ฅผ ๋ด์ ํ์๋ c๋ฒกํฐ์ ๊ธธ์ด๊ฐย ๋์์, ์ด๊ฒ ํฌ์๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด์์
5. ๋ํ์ ํฌ์์์ญ ๊ตฌํ๊ธฐ : shape_project ํจ์
๊ทธ๋ฆฌ๊ณ ์์ ํฌ์๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์, ํน์ ๋ํ์ ํน์ ๋ฒกํฐ์ ํฌ์ํ์๋์ ์์ญ์ ๊ตฌํ ์ ์์ด์
์์ ๊ทธ๋ฆผ์์ ํ๋์์ผ๋ก ํ์๋ ๋ถ๋ถ, ์ฆ ๋ํ์ ์๋์ ๋ฒกํฐ์ ํฌ์ํ์๋์ ์์ญ์ ๊ตฌํ๋๊ฑฐ์์
์ต์ข ์ ์ผ๋ก๋ ๊ทธ๋ฆผ์์ min max๋ผ๊ณ ํ์๋ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ด ๋์ค๊ฒ ๋์
๋ํ์ ๊ฐ๊ฐ์ ๊ผญ์ง์ ์, ์์ ์ผ๋ก๋ถํฐ ํด๋น ๊ผญ์ง์ ๊น์ง์ ๋ฒกํฐ๋ก ์ฌ๊ธด๋ค์
์์ ํฌ์๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์, ๋ชจ๋ ๊ผญ์ง์ (๋ฒกํฐ)๋ค์ ์๋์ ๋ฒกํฐ์ ํฌ์์์ผฐ์๋์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ณ
๊ทธ๋์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ตฌํ๋ฉด ๋์,
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def shape_project(vx,vy,p)
len = Array.new
i = 0
until p[i] == nil
len.push(p[i][0]*vx+p[i][1]*vy)
i+=1
end
return len.min, len.max
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์ ๊ณผ์ ์ ์ฝ๋์์, rubyํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑ๋ ์ฝ๋์์
์ ๋ ฅ๊ฐ์์ vx์ vy๋ ๋ํ์ ํฌ์์์ญ์ ๊ตฌํ๊ณ ์ ํ๋ ๋ฒกํฐ์์, ๋จ ์ด๋ ์ด ๋ฒกํฐ๋ ๋จ์๋ฒกํฐ๋ก ์ ๋ ฅํด์ผํด์
๊ทธ๋ฆฌ๊ณ p๋ [[x1,y1],[x2,y2],[x3,y3]] ํํ์ ๋ฐฐ์ด๋ก ํฌ์์์ญ์ ๊ตฌํ๊ณ ์ ํ๋ ๋ค๊ฐํ์ ๊ฐ ๊ผญ์ง์ ์ ์ขํ๋ฅผ ์ ๋ ฅํ๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ์ ๋ ฅํ๋ฉด, ์ต์ข ์ ์ผ๋ก ํด๋น ๋ํ์ ํด๋น ๋ฒกํฐ์ ํฌ์ํ์๋์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ด ์ถ๋ ฅ๋์
6. ์ ๋ถ์ด ๊ฒน์น๋ ์์ญ ๊ตฌํ๊ธฐ : line_overlap ํจ์
์์ ์ฌ๋ ค๋์ ๊ทธ๋ฆผ์, ๋ ์ ๋ถ์ด ์ฃผ์ด์ก์๋, ๋ ์ ๋ถ์ด ๊ฒน์น๋์ง๋ฅผ ์ฒดํฌํ๋ ํจ์์์
๋ ์ ๋ถ(์ฃผํฉa ํ๋b)์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ(amn amx bmn bmx)์ด ์ฃผ์ด์ก์๋, ๋ ์ ๋ถ์ด ๊ฒน์น๋์ง๋ฅผ ์ฒดํฌํด์
๋ง์ฝ ๊ฒน์น์ง ์๋๋ค๋ฉด nil์ ์ถ๋ ฅํ๊ณ ,
๊ฒน์น๋ค๋ฉด, ๊ทธ๋์ ๊ธธ์ด๋ฅผ, ์ฃผํฉ์ ์ ๋ถ์ ๊ณ ์ ์ํจ์ฑ๋ก ํ๋์ ์ ๋ถ์ ์ฃผํฉ์ ์ ๋ถ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์ ์ด๋๊ธธ์ด๋ก ์ถ๋ ฅํด์ค์
๊ทธ๋ฆผ์์ ์ผ์ชฝ ์์ ์ ๋ถ๋ค์ ๋ณด๋ฉด ๋ ์ ๋ถ์ด ๊ฒน์ณ์์ง ์์์, ์ด๋ด๋๋ nil์ ์ถ๋ ฅํด์ค์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆผ์์ ์ผ์ชฝ ์๋๋ ๋ ์ ๋ถ์ด ์ผ๋ฐ์ ์ผ๋ก ๊ฒน์ณ์ ธ์๋ ์ํ์์,
์์ชฝ์ ํ๋์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ์ด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ + ๋ฐฉํฅ์ ๊ธธ์ด๋ก ์ถ๋ ฅ๋๊ณ
์๋์ชฝ์ ํ๋์์ ์ผ์ชฝ์ผ๋ก ๋ฐ์ด๋ด์ผ ํ๋๊น -๊ธธ์ด๋ก ์ถ๋ ฅ๋์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆผ์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ๋ค์ ๋ณด๋ฉด, ๋ ์ ๋ถ์ค ํ์ชฝ์ด ๋ค๋ฅธํ์ชฝ์ ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ์์
์ด๋ด๋๋ ํ๋์์ ์ด๋์ชฝ(์ค๋ฅธ์ชฝ ๋๋ ์ผ์ชฝ)์ผ๋ก ๋ฐ์ด๋ด์ผ ๋ ์ด๋๊ฑฐ๋ฆฌ๊ฐ ์ ์์ง๋ฅผ ์ฒดํฌํด์
ํด๋น ๋ฐฉํฅ์ผ๋ก์ ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํด์ค์, ์ญ์ ํ๋์ ์ ๋ถ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ์ด๋ด์ผ ํ๋ค๋ฉด +๋ฅผ, ์ผ์ชฝ์ด๋ผ๋ฉด -๋ฅผ ์ถ๋ ฅํด์ค์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ด๋๋ฐฉํฅ์ ๋ฐ๋ผ ์ด๋๊ฑฐ๋ฆฌ์ ๋ถํธ๋ฅผ + - ๋ก ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์
๋ ๋ํ์ ์ถฉ๋์์ MTV์ ๋ฐฉํฅ์ ๊ตฌํ๊ธฐ ์ํด ์ฌ์ฉํด์
๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด๋ฅผ ํ ๋๋ก MTV๋ฅผ ๊ตฌํ ๋
์ด๋ค ๋ํ์ ๊ณ ์ ์ํค๊ณ , ์ด๋ค ๋ํ์ ๋ฐ์ด๋ผ์ง์ ๋ฐ๋ผ์, ๊ณ ์ ์ํฌ ์ ๋ถ๊ณผ ์ด๋์ํฌ ์ ๋ถ์ ๊ตฌํ๋ฉด
๊ทธ ๊ธธ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์, ๊ฒฐ๊ตญ ์ํ๋ ๋ํ์ ๋ฐ์ด๋ด๊ธฐ ์ํ MTV๋ฅผ ๊ตฌํ ์ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def line_overlap(amn,amx,bmn,bmx)
#1
if amx <= bmn || bmx <= amn
return nil
end
#2
if (amn <= bmn && bmx <= amx) || (bmn <= amn && amx <= bmx)
t1,t2 = amx-bmn, bmx-amn
if (t1).abs < (t2).abs
return t1
else
return -t2
end
end
#3
if amn <= bmn
return amx-bmn
end
if bmn <= amn
return (bmx-amn)*-1
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์ด๊ฒ ์์ ํจ์์ ์ฝ๋์์, ์ ๋ ฅ๊ฐ์ผ๋ก ๋ ์ ๋ถ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ ๋ ฅํ๋ฉด, ๋ ์ ๋ถ์ด ๊ฒน์น์ง ์๋๋ค๋ฉด nil์,
๋ง์ฝ ๊ฒน์น๋ค๋ฉด b๋ฅผ a๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์๊ธธ์ด๋ฅผ ์ถ๋ ฅํด์ค์, +๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ด์ผ ํ๋ค๋ฉด +๊ธธ์ด๋ฅผ ์ถ๋ ฅํด์ฃผ๊ณ
-๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ด์ผ ์ต์๊ฑฐ๋ฆฌ๋ผ๋ฉด -๊ธธ์ด๋ฅผ ์ถ๋ ฅํด์ค์
์์ ํจ์์ ์ฝ๋์์ #1 ๋ถ๋ถ์ ๊ฒน์น์ง ์๋๋ค๋ฉด nil์ ์ถ๋ ฅํด์ฃผ๋ ๋ถ๋ถ์ด์์
#2 ๋ถ๋ถ์ ๋ ์ ๋ถ์ค ํ์ชฝ์ด ๋ค๋ฅธ ํ์ชฝ์ ์์ ํ ํฌํจ๋๋ ๊ฒฝ์ฐ์์, ์ค๋ฅธ์ชฝ(+๋ฐฉํฅ) ์ผ์ชฝ(-๋ฐฉํฅ)์ค ๋ ๊ฑฐ๋ฆฌ์ ์ ๋๊ฐ์ด ์ ์ ๋ฐฉํฅ์ ์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํด์ค์
#3๋ถ๋ถ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ๋ถ์ด ๊ฒน์ณ์๋ ๊ฒฝ์ฐ์์, a๊ฐ ์ผ์ชฝ์ด๊ณ b๊ฐ ์ค๋ฅธ์ชฝ์ด๋ฉด +๊ธธ์ด๋ก
b๊ฐ ์ผ์ชฝ์ด๊ณ a๊ฐ ์ค๋ฅธ์ชฝ์ด๋ฉด -๊ธธ์ด๋ก ์ถ๋ ฅํด์ค์
7. ๋ ๋ค๊ฐํ์ ํฌ์ํ์๋ ๊ฒน์น๋ ๋ถ๋ถ ๊ตฌํ๊ธฐ : sat1ํจ์
๊ทธ๋ฆฌ๊ณ ์์ ๋ ํจ์๋ฅผ ์ฌ์ฉํด์, ์ต์ข ์ ์ผ๋ก ๋ ๋ค๊ฐํ์ ํฌ์ํ์๋ ๊ฒน์น๋ ๋ถ๋ถ์ ๊ตฌํ๋ ํจ์๋ฅผ ๋ง๋ค์ ์์ด์
์์ ๊ทธ๋ฆผ์ ํด๋น ํจ์์ ๊ทธ๋ฆผ์ด์์, ๋ง์ฝ ์ฒซ๋ฒ์งธ์ฒ๋ผ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋๋ค๋ฉด nil์ ์ถ๋ ฅํ๊ณ
๋๋ฒ์งธ์ฒ๋ผ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ค๋ฉด, ์ด๋ ํ๋์(์ฌ๊ฐํ)์ ์ฃผํฉ์(์ผ๊ฐํ) ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํด์ค์,
์ฆ, ๋๋ฒ์งธ ๊ทธ๋ฆผ์ +๊ฑฐ๋ฆฌ๊ฐ ๋์ค๊ณ , ์ธ๋ฒ์งธ ๊ทธ๋ฆผ์ -๊ฑฐ๋ฆฌ๊ฐ ๋์ค๊ฒ ๋์
์ด๋ ๊ฒ ์ด๋์์ผ์ผํ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ด๋๊ฑฐ๋ฆฌ์ ๋ถํธ๋ฅผ ๋ค๋ฅด๊ฒ ํ๋ฉด, ์ถฉ๋์์ MTV๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ํน์ ๋ํ์ ๊ณ ์ ์ํค๊ณ ํน์ ๋ํ์ ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์์ด๋๋ฒกํฐ๋ฅผ ๊ตฌํ ์ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def sat1(vx,vy,p1,p2)
amn, amx = shape_project(vx,vy,p1)
bmn, bmx = shape_project(vx,vy,p2)
return line_overlap(amn,amx,bmn,bmx)
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์ ํจ์์ ์ฝ๋์์, vx์ vy๋ ํฌ์์์ญ์ด ๊ฒน์น๋์ง ํ์ธํ๊ณ ์ ํ๋ ๋ฒกํฐ๋ฅผ ๋จ์๋ฒกํฐ๋ก ์ ๋ ฅํ๋ฉด ๋์
p1๊ณผ p2๋ ๊ฐ๊ฐ [[x1,y1],[x2,y2],[x3,y3]] ํ์์ผ๋ก ์ ๋ ฅํ ๋ค๊ฐํ์ด์์,
๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ ๋ํ์ด ํด๋น ๋ฒกํฐ์์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋๋ค๋ฉด nil์, ๊ฒน์น๋ค๋ฉด p2๋ฅผ p1๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์์ด๋๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํด์ค์,
์ฆ +๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ด์ผํ๋ค๋ฉด +๊ฑฐ๋ฆฌ๊ฐ ๋์ค๊ณ , -๋ฐฉํฅ์ผ๋ก ๋ฐ์ด๋ด์ผํ๋ค๋ฉด -๊ฑฐ๋ฆฌ๊ฐ ๋์ค๊ฒ ๋์
8. ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ๋ฒกํฐ๋ก ๋ณํํ๊ธฐ : sortํจ์
์์ ์ฌ๋ ค๋์ ๊ทธ๋ฆผ์, ๊ทธ๋ฆผ์ ํ์๋๊ฒ์ฒ๋ผ ๋ค๊ฐํ์ ๊ผญ์ง์ ๋ค์ด ์์๋, ํด๋น ๊ผญ์ง์ ๋ค์ ๋ฒกํฐ๋ก ๋ณํ์์ผ์ฃผ๋ ํจ์์์,
๊ทธ๋ฆผ์ฒ๋ผ 5๊ฐ์ ๊ผญ์ง์ ์ด ์ฃผ์ด์ ธ์๋ค๋ฉด, 1๋ฒ-2๋ฒ, 2๋ฒ-3๋ฒ, 3๋ฒ-4๋ฒ, 4๋ฒ-5๋ฒ, 5๋ฒ-1๋ฒ ์ด๋ ๊ฒ ์ด 5๊ฐ์ ๋ชจ์๋ฆฌ(๋ฒกํฐ)๊ฐ ๋์ค๊ฒ ๋์
๊ทธ๋ฆฌ๊ณ ์ด๋ ์ค์ํ๊ฑด, ๊ผญ์ง์ ๋ค์ด ์์๋๋ก ์ ๋ ฅ๋์ผ ํด์, ์๊ณ๋ฐฉํฅ์ด๋ ๋ฐ์๊ณ๋ฐฉํฅ์ ์๊ด์์ด์
์ด ํจ์๋ SAT์ถฉ๋๊ฒ์ฌ์์, ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ์ขํ๋ค๋ก๋ถํฐ ๋ํ์ ํฌ์์ํฌ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ํจ์์์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def sort(p)
a = Array.new
i = 0
until p[i] == nil
if p[i+1] == nil
x,y = p[0][0]-p[i][0],p[0][1]-p[i][1]
else
x,y = p[i+1][0]-p[i][0],p[i+1][1]-p[i][1]
end
a.push([x,y])
i += 1
end
return a
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์ด๊ฒ ์์ ์ฌ๋ ค๋์ ํจ์์ ์ฝ๋์์, ๋ค๊ฐํ์ ๊ฐ ๊ผญ์ง์ ๋ค์ [[x1,y1],[x2,y2],[x3,y3]] ํ์์ ๋ฐฐ์ด๋ก ์ ๋ ฅํ๋ฉด ๋์, ์ด๋ ๊ผญ์ง์ ๋ค์ ์์๋๋ก ์ ๋ ฅํด์ผํด์, ์๊ณ๋ฐฉํฅ์ธ์ง ๋ฐ์๊ณ๋ฐฉํฅ์ธ์ง๋ ์๊ด์์ด์
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ถ๋ ฅ๊ฐ๋ ๋์ผํ ํ์์ ๋ฐฐ์ด๋ก ๋์ค๊ฒ ๋์ [[x2-x1,y2-y1],[x3-x2,y3-y2],[x1-x3,y1-y3]] ์ด๋ฐ์์ผ๋ก์
9. SAT์ถฉ๋๊ฒ์ฌ์ ์๋๋ฐฉ์
#1 ๊ณผ์ ์ ์์์ ์ด์ผ๊ธฐํ sortํจ์๋ก, ์ถฉ๋๊ฒ์ฌ๋ฅผ ํ๊ณ ์ ํ๋ ๋ ๋ค๊ฐํ์ ๋ชจ๋ ๊ผญ์ง์ ๋ค๋ก๋ถํฐ ๋ฒกํฐ๋ฅผ ์ป์ด์,
#2 ๊ณผ์ ์ ๊ทธ์ค ํ๊ฐ์ง์ ๋ฒกํฐ๋ฅผ ๊ณจ๋ผ์, ํด๋น ๋ฒกํฐ์์ ์์ง์ธ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ (๋ฒกํฐ๊ฐ x,y๋ผ๋ฉด -y,x ๋๋ y,-x)
ํด๋น ๋ฒกํฐ๋ฅผ ์ ๊ทํํด์ ๋จ์๋ฒกํฐ๋ก ๋ง๋ค์ด์, ๋ ๋ฒกํฐ์ ๊ฐ ์์(x,y)๋ฅผ ํด๋น ๋ฒกํฐ์ ๊ธธ์ด๋ก ๋๋ ์ฃผ๋ฉด ๋์
#3 ๊ณผ์ ์ ์์์ ์ด์ผ๊ธฐํ sat1ํจ์๋ฅผ ์ฌ์ฉํด์
๊ทธ๋ ๊ฒ ์ป์ ๋จ์๋ฒกํฐ์์์ ๋ ๋ค๊ฐํ์ ํฌ์์์ญ์ ๋น๊ตํด์,
๊ทธ๋ ๊ฒํด์ ๋ง์ฝ ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ ๋ค๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋๋ค๋ฉด,
๋ ๋ค๊ฐํ์ ์ถฉ๋ํ์ง ์์๋ค๊ณ ํ๋จํ๊ณ nil์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
์๋๋ ๋ ๋ค๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ฒฝ์ฐ์ ์
#4 ๊ณผ์ ์ ๋ง์ฝ ๋ ๋ค๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ค๋ฉด, ์ด๋์ ํฌ์์์ญ์ ์ฒดํฌํ๋ ๋จ์๋ฒกํฐ์, ํด๋น ๋จ์๋ฒกํฐ์์ ๊ฒน์น๋ ํฌ์์์ญ์ ๊ธธ์ด(๋ฐฉํฅ์ ๋ฐ๋ผ์ + ๋๋ -)๋ฅผ ์ ์ฅํด๋๊ณ
๋ค์ ๋ฒกํฐ๋ฅผ ๊ณจ๋ผ์ #2 ๋ถํฐ ๋ค์ ํจ์๋ฅผ ๋ฐ๋ณตํด์
๊ทธ๋ ๊ฒ ๋ฐ๋ณตํ๋ฉด์ ๋ง์ฝ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋๋ค๋ฉด ์ถฉ๋ํ์ง ์์๋ค๊ณ nil์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๊ณ
๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ค๋ฉด, ๊ธฐ์กด์ ์ ์ฅํด๋์๋ ํฌ์์์ญ๊ณผ ๋น๊ตํด์, ๋ ์ ๋๊ฐ์ ๊ธธ์ด๊ฐ ์งง์์ชฝ์ ๋จ์๋ฒกํฐ์ ๊ฒน์น๋ ๊ธธ์ด๋ฅผ ์ ์ฅํด์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ฐ๋ณต์ ๊ณ์ํ๋ค๋ฉด
์ต์ข ์ ์ผ๋ก๋ ๋ ๋ํ์ด ์ถฉ๋ํ์ง ์๋๋ค๋ฉด, ์ถฉ๋ํ์ง ์๋ ๋ฒกํฐ๋ฅผ ์ฐพ์์ nil์ ์ถ๋ ฅํ๊ณ ํจ์๊ฐ ๋์ค์ ์ข ๋ฃ๋๊ฒ ๋๊ณ
๋ง์ฝ ์ถฉ๋ํ๋ค๋ฉด ๋ชจ๋ ๋ฒกํฐ๋ฅผ ๋๊น์ง ๋ฐ๋ณตํด์ ์ ์ผ ๊ฒน์น๋ ๊ฑฐ๋ฆฌ๊ฐ ์์ ๋จ์๋ฒกํฐ์ ๊ทธ๋์ ๊ฒน์น๋ ๊ธธ์ด๋ฅผ ๊ตฌํ ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ๋ ๋ํ์ด ์ถฉ๋ํด์ ์ ์ผ ๊ฒน์น๋ ๊ฑฐ๋ฆฌ๊ฐ ์์ ๋จ์๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค๋ฉด,
๊ทธ ๋จ์๋ฒกํฐ์ ํด๋น ๊ธธ์ด๋ฅผ ๊ณฑํด์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์, ์ด๊ฒ ๋ ๋ํ์ด ์ถฉ๋ํ์๋์ ์ํ๋ ๋ฐฉํฅ์ผ๋ก์ MTV๊ฐ ๋๋๊ฑฐ์์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def sat_collision(p1,p2)
#1
a = Array.new
a = sort(p1)+sort(p2)
#2
d2 = nil
i = 0
until a[i] == nil
vx, vy = a[i][0], a[i][1]
vx, vy = -vy,vx
vx, vy = vx/((vx**2+vy**2)**0.5),vy/((vx**2+vy**2)**0.5)
#3
d = sat1(vx,vy,p1,p2)
if d == nil
return nil,nil
end
#4
if d2 == nil || (d).abs < (d2).abs
vx2, vy2, d2 = vx, vy, d
end
i += 1
end
return vx2*d2, vy2*d2
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
์ด๊ฒ ์์ ํจ์์ ์ฝ๋์์,
์ด๋ก์ #์ผ๋ก ์ฃผ์์ ํ์ํด๋์ ๋ถ๋ถ์ด ์์์ ์ค๋ช ํ ํด๋น ๊ณผ์ ์ด์์
p1๊ณผ p2๋ก ์ถฉ๋์ ๊ฒ์ฌํ๊ณ ์ ํ๋ ๋ ๋ค๊ฐํ์ ๊ผญ์ง์ ์ ์ขํ๋ฅผ [[x1,y1],[x2,y2],[x3,y3]] ํ์์ ๋ฐฐ์ด๋ก ์ ๋ ฅํ๋ฉด ๋์,
๋จ ์ด๋ ๊ผญ์ง์ ๋ค์ ์์๋๋ก ์ ๋ ฅํด์ผ๋์, ์๊ณ๋ฐฉํฅ์ธ์ง ๋ฐ์๊ณ๋ฐฉํฅ์ธ์ง๋ ์๊ด์์ด์
๊ทธ๋ ๊ฒํ๋ฉด ๋ ๋ํ์ด ์ถฉ๋ํ์ง ์๋๋ค๋ฉด nil์ ์ถ๋ ฅํ๊ณ
๋ง์ฝ ์ถฉ๋ํ๋ค๋ฉด, p2๋ก ์ ๋ ฅํ ๋ค๊ฐํ์ p1 ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์์ด๋๋ฒกํฐ(MTV)๊ฐ ์ถ๋ ฅ๋์
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์์ ์ค๋ช ํ SAT์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ๋ง๋ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ์์
์์์ ์ฒซ๋ฒ์งธ์ ๋ค๋ฒ์งธ๋, ์ค๋ธ์ ํธ-ํ๋ ์ด์ด ์์๋ก ์ถฉ๋์ฒดํฌ๋ฅผ ํด์, ๋ง์ฝ ํ๋ ์ด์ด์ ์ค๋ธ์ ํธ๊ฐ ์ถฉ๋ํ๋ค๋ฉด ํ๋ ์ด์ด๋ฅผ ์ค๋ธ์ ํธ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ MTV๋ฅผ ๊ตฌํ๋ค์, ํ๋ ์ด์ด๋ฅผ ํด๋น ๋ฒกํฐ๋งํผ ๋ฐ์ด๋ด๋ ๋ฐฉ์์ด์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ์ ์ธ๋ฒ์งธ๋ ํ๋ ์ด์ด-์ค๋ธ์ ํธ ์์๋ก ์ถฉ๋์ฒดํฌ๋ฅผ ํด์, ๋ง์ฝ ์ถฉ๋ํ๋ค๋ฉด ์ค๋ธ์ ํธ๋ฅผ ํ๋ ์ด์ด ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ MTV๋ฅผ ๊ตฌํ๊ณ ์ค๋ธ์ ํธ๋ฅผ ํด๋น ๋ฒกํฐ๋งํผ ๋ฐ์ด๋ด๋ ๋ฐฉ์์ด์์
์ด๋ ๊ฒํ๋ฉด ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ ์์ด์
์ข์์ค๋ช ๊ฐ์ฌ. ๊ทธ๋ผ mtv๊ตฌํ๋ ์์๊ฐ ํ๋ ์ด์ด ์ค๋ธ์ ํธ ์์ด ๋๋ฉด ์ค๋ธ์ ํธ๊ฐ ๋ฐ๋ ค๋๋ค๋๊ฑฐ์ง? ๊ทธ๋ผ ์ ํ์ ํ๋ ๋ฐ๊ฐ ๋ฐ๋ ค๋๋ค๋๊ฑด๋ฐ. ๊ทธ๋ผ ์๋์ง ์๋. ๊ทธ ๋ถ๋ถ์ ์ด๋ป๊ฒ ํด์ํ๋ฉด ์ข์? ๋ณดํต ๋ฌผ๋ฆฌ์์ง์ ์ง๋๊ณ์ฐํด์ ์์ชฝ๋ค๋ฐ์ด๋ด๊ฑฐ๋ kinematics๋ static์ธ ์ ๋ค์ ์๋ฐ๋ฆฌ๊ฒํ๊ฑฐ๋ ๊ทธ๋ฐ๊ฑฐ๊ฐ๋๋
๊ฒน์น ๋ค์ ์๋ก ๋ฐ์ด๋