ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋”ฐ๋ผ์˜ค๋ฉด์„œ ์ถ”๊ฒฉํ•˜๋Š”ย ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธ€์ด์—์š”


๊ทธ๋ฆฌ๊ณ  ์ €๋„ ์ˆ˜ํ•™์ด๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜ ์•„๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํ‹€๋ฆฌ๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด ์žˆ์„์ˆ˜๋„ ์žˆ์–ด์š”



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



1. ๋ฒกํ„ฐ์˜ ๋ง์…ˆ์„ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•


์ฒซ๋ฒˆ์งธ๋Š” ๋ฒกํ„ฐ์˜ ๋ง์…ˆ์„ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•์ด์—์š”, ์ด ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋ฐฉํ–ฅ๊ณผ ์†๋„๊ฐ€ ๋ณ€ํ•˜๋Š” ์ถ”๊ฒฉํ˜• ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ์–ด์š”

ย 


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

def vector_lim(x1,y1,x2,y2,lmn,lmx)

x3, y3 = x1+x2, y1+y2

d = (x3**2+y3**2)**0.5

if d < lmn

x3, y3 = x3/d, y3/d

return x3*lmn, y3*lmn

end

if d > lmx

x3, y3 = x3/d, y3/d

return x3*lmx, y3*lmx

end

return x3, y3

end

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


์œ„์— ์˜ฌ๋ ค๋†“์€ ์ฝ”๋“œ๋Š” ๋ฒกํ„ฐ์˜ ๋ง์…ˆ์„ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์˜ ์ฝ”๋“œ์—์š”, rubyํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•œ๊ฑฐ์—์š”


๋ฒกํ„ฐ (x1,y1) ๊ณผ (x2,y2)๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๋‘ ๋ฒกํ„ฐ๋ฅผ ๋”ํ•œ ๋ฒกํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ด์ค˜์š”




๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ ๊ทธ๋ ‡๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ๋ฒกํ„ฐ๋ฅผ, ๋ฐฉํ–ฅ์€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์€์ฑ„๋กœ ๊ทธ ๊ธธ์ด๋งŒ ์ž…๋ ฅํ•œ ์ตœ์†Œ๊ธธ์ด(lmn)์™€ ์ตœ๋Œ€๊ธธ์ด(lmx) ๋ฒ”์œ„ ๋‚ด๋กœ ์ถœ๋ ฅํ•ด์ค˜์š”,


์ฆ‰, ๋‘ ๋ฒกํ„ฐ๋ฅผ ๋”ํ•œ ๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด์„œ, ๋งŒ์•ฝ ๊ทธ ๋ฒกํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ์ตœ์†Œ๊ธธ์ด๋ณด๋‹ค ์ž‘์œผ๋ฉดย ํ•ด๋‹น ๋ฒกํ„ฐ๋ฅผ ์ •๊ทœํ™”ํ•ด์„œ ๋‹จ์œ„๋ฒกํ„ฐ๋กœ ๋งŒ๋“ ๋‹ค์Œ, ์ตœ์†Œ๊ธธ์ด๋ฅผ ๊ณฑํ•ด์„œ ์ถœ๋ ฅํ•ด์ฃผ๋Š”๊ฑฐ์—์š”ย ์ฆ‰, ๋ฒกํ„ฐ์˜ ๋ฐฉํ–ฅ์€ ์œ ์ง€ํ•œ์ฑ„๋กœ ๊ธธ์ด๋งŒ ์ตœ์†Œ๊ธธ์ด๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š”๊ฑฐ์—์š”


์ตœ๋Œ€๊ธธ์ด๋ณด๋‹ค ์ปค๋‹ค๋ž€ ๊ฒฝ์šฐ์—๋„ย ๋งˆ์ฐฌ๊ฐ€์ง€์—์š”, ๋ฒกํ„ฐ์˜ ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ์ฑ„๋กœ ๊ทธ ๊ธธ์ด๋งŒ ์ตœ๋Œ€๊ธธ์ด๋กœ ์ถœ๋ ฅํ•ด์ค˜์š”



https://gall.dcinside.com/m/game_dev/162026

๋ฒกํ„ฐ์˜ ์—ฐ์‚ฐ๊ณผ ํ™œ์šฉ - ์ธ๋”” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ๋งˆ์ด๋„ˆ ๊ฐค๋Ÿฌ๋ฆฌ

[์‹œ๋ฆฌ์ฆˆ] ๊ฒŒ์ž„์ œ์ž‘ ยท GJK์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ๋‹ค์–‘ํ•œ ๋„ํ˜•์˜ ์ถฉ๋ŒํŒ์ • ๊ตฌํ•˜๊ธฐ ยท GJK-EPA ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค๊ธฐ ยท ๋ถ„๋ฆฌ์ถ•(SAT)์ถฉ๋Œ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค๊ธฐ ยท OBB

gall.dcinside.com


๋ฒกํ„ฐ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ๋ฒกํ„ฐ์˜ ์ •๊ทœํ™”์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์˜ ๊ธ€์˜ 6๋ฒˆ~8๋ฒˆ ๋ถ€๋ถ„์— ๋‚˜์™€์žˆ์–ด์š”




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

angle = Math.atan2($player_y-$object_y,$player_x-$object_x)


$object_move_x, $object_move_y = vector_lim($object_move_x, $object_move_y,ย $object_aim*Math.cos(angle),$object_aim*Math.sin(angle),2,5)


$object_x += $object_move_x

$object_y += $object_move_y


$object_angle = Math.atan2($object_move_y,$object_move_x)

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



๊ทธ๋ฆฌ๊ณ  ์œ„์— ์˜ฌ๋ ค๋†“์€ ์ฝ”๋“œ๊ฐ€, ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ๋ฒกํ„ฐ์˜ ๋ง์…ˆ์„ ์‚ฌ์šฉํ•ด์„œ ์ถ”๊ฒฉํ˜• ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์›€์ง์ด๋Š” ์ฝ”๋“œ์—์š”


$player_x,ย $player_y ๋Š” ๊ฐ๊ฐ ํ”Œ๋ ˆ์ด์–ด์˜ x y์ขŒํ‘œ๊ณ 

$object_x, $object_y ๋Š” ๊ฐ๊ฐ ์˜ค๋ธŒ์ ํŠธ์˜ x y์ขŒํ‘œ์—์š”


๊ทธ๋ฆฌ๊ณ ย $object_move_x, $object_move_y ๋Š” ๊ฐ๊ฐ ์˜ค๋ธŒ์ ํŠธ์˜ x์ถ•์—์„œ์˜ย ์ด๋™์†๋„๋ž‘ y์ถ•์—์„œ์˜ ์ด๋™์†๋„์—์š”ย 





์šฐ์„  ์•„ํฌํƒ„์  ํŠธ2(arctan2)๋กœ ์˜ค๋ธŒ์ ํŠธ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ํ˜„์žฌ ์ขŒํ‘œ๊ฐ’์„ ํ†ตํ•ด์„œย ์˜ค๋ธŒ์ ํŠธ์—์„œ ํ”Œ๋ ˆ์ด์–ด ๋ฐฉํ–ฅ์˜ย ๊ฐ๋„๋ฅผ ๊ตฌํ•ด์š”


๊ทธ๋‹ค์Œ ๊ทน์ขŒํ‘œ๊ณ„์˜ ๊ฐ๋„์™€ ๊ฑฐ๋ฆฌ ๊ณต์‹์œผ๋กœ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋†“์€ ๊ธธ์ด($object_aim ๊ฐ’, ์—ฌ๊ธฐ์„œ๋Š” 0.2์—์š”)์˜ ํ•ด๋‹น ๊ฐ๋„์˜ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•œ๋‹ค์Œ


์•ž์—์„œ ์„ค๋ช…ํ•œ ์˜ค๋ธŒ์ ํŠธ์˜ x y ์ถ•์—์„œ์˜ ์ด๋™์†๋„์—, ์ด๋ ‡๊ฒŒ ๊ตฌํ•œย ๋ฒกํ„ฐ๋ฅผ ์•ž์—์„œ ์„ค๋ช…ํ•œ vector_limํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋”ํ•ด์š”,ย 




๊ทธ๋Ÿฌ๋ฉด ์ตœ์ข…์ ์œผ๋กœย ์˜ค๋ธŒ์ ํŠธ์˜ ํ˜„์žฌ ์†๋„(๋ฒกํ„ฐ)์—์„œ, ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํ–ฅํ•ด ์•ฝ๊ฐ„ ์œ ๋„๋œ ์†๋„(๋ฒกํ„ฐ)๊ฐ€ย vector_limํ•จ์ˆ˜์—์„œ ์„ค์ •ํ•œ ๊ธธ์ด์˜ ๋ฒ”์œ„(์—ฌ๊ธฐ์„œ๋Š” ์ตœ์†Œ๊ฐ€ 2๊ณ  ์ตœ๋Œ€๊ฐ€ 5์—์š”) ์•ˆ์œผ๋กœย ๋‚˜์˜ค๊ฒŒ ๋˜์š”


์ฆ‰, ๊ฐ์†๊ณผ ๊ฐ€์†์„ ํ•˜๋ฉด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์— ์ตœ์†Œ์†๋„์™€ ์ตœ๋Œ€์†๋„๋ฅผ ์„ค์ •ํ• ์ˆ˜ ์žˆ๋Š”๊ฑฐ์—์š”




๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๊ตฌํ•œ ์˜ค๋ธŒ์ ํŠธ์˜ ์†๋„๋งŒํผ ์˜ค๋ธŒ์ ํŠธ์˜ ์ขŒํ‘œ๋ฅผ ์ด๋™์‹œํ‚ค๊ณ 


์˜ค๋ธŒ์ ํŠธ์˜ ์†๋„์— ์•„ํฌํƒ„์  ํŠธ2๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ์˜ ํ˜„์žฌ ๊ฐ๋„($object_angle)๋ฅผ ๊ตฌํ•˜๋Š”๊ฑฐ์—์š”


๊ทธ๋ฆฌ๊ณ  1ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ด๋Ÿฐ์‹์˜ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๋‹ˆ๊นŒ, ์ตœ์ข…์ ์œผ๋กœ๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐฉํ–ฅ๊ณผ ์†๋„๋ฅผย ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ์—์š”



https://gall.dcinside.com/m/game_dev/164492

๊ทน์ขŒํ‘œ๊ณ„์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ๋“ค - ์ธ๋”” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ ๋งˆ์ด๋„ˆ ๊ฐค๋Ÿฌ๋ฆฌ

[์‹œ๋ฆฌ์ฆˆ] ๊ฒŒ์ž„์ œ์ž‘ ยท GJK์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ ๋‹ค์–‘ํ•œ ๋„ํ˜•์˜ ์ถฉ๋ŒํŒ์ • ๊ตฌํ•˜๊ธฐ ยท GJK-EPA ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค๊ธฐ ยท ๋ถ„๋ฆฌ์ถ•(SAT)์ถฉ๋Œ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ€์–ด๋‚ด๋Š” ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค๊ธฐ ยท OBB

gall.dcinside.com


์•„ํฌํƒ„์  ํŠธ2์™€ ๊ทน์ขŒํ‘œ๊ณ„์˜ ๊ฐ๋„์™€ ๊ฑฐ๋ฆฌ ๊ณต์‹์€, ์œ„์— ์˜ฌ๋ ค๋†“์€ ๊ธ€์˜ 3๋ฒˆ๊ณผ 4๋ฒˆ์— ๋‚˜์™€์žˆ์–ด์š”







2. CCW์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•


๋‘๋ฒˆ์งธ๋Š” CCW์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•œ ๋ฐฉ๋ฒ•์ด์—์š”,


์ด ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์†๋„๋Š” ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•œ ์ฑ„๋กœ ๋ฐฉํ–ฅ๋งŒ ๋ณ€ํ•˜๋ฉด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ์–ด์š”



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

def side_angle(a,b)

t = Math.cos(a)*Math.cos(b)+Math.sin(a)*Math.sin(b)

if t > 1

t = 1

end

if t < 0

t = 0

end

return Math.acos(t)

end

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


์œ„์— ์˜ฌ๋ ค๋†“์€ ์ฝ”๋“œ๋Š” a์™€ b๋กœ ๋‘ ๊ฐ๋„๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๊ทธ ์‚ฌ์ด์˜ ๊ฐ๋„๋ฅผ 0~180๋„ ๋ฒ”์œ„๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์—์š”


๋ฒกํ„ฐ์˜ ๋‚ด์ ์„ ์ด์šฉํ•ด์„œ ๋‘ ๋ฒกํ„ฐย ์‚ฌ์ด์˜ ๊ฐ๋„๋ฅผ ๊ตฌํ•˜๋Š”๊ฑฐ์—์š”, ์œ„์— ์˜ฌ๋ ค๋†“์€ ๋ฒกํ„ฐ๋ฅผ ์„ค๋ช…ํ•œ ๊ธ€์˜ 19๋ฒˆ์— ๋‚˜์™€์žˆ๋Š” ๋‚ด์šฉ์ด์—์š”


ย 

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

def ccw(x1,y1,x2,y2,x3,y3)

return (x1*y2+x2*y3+x3*y1)-(y1*x2+y2*x3+y3*x1)

end

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



๊ทธ๋ฆฌ๊ณ  ์œ„์— ์˜ฌ๋ ค๋†“์€ ์ฝ”๋“œ๋Š” ccw์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฝ”๋“œ์—์š”,


(x1,y1,x2,y2,x3,y3)์œผ๋กœ ์„ธ ์ ์„ ์ž…๋ ฅํ•˜๋ฉด, 1์ ์—์„œ 2์ ์„ ํ–ฅํ•˜๋Š” ๋ฐฉํ–ฅ์„ย ๊ธฐ์ค€์œผ๋กœย 3์ ์ด ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ(+๋ฐฉํ–ฅ)์— ์žˆ๋Š”์ง€ ์‹œ๊ณ„๋ฐฉํ–ฅ(-๋ฐฉํ–ฅ)์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ์•„๋‚ผย ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—์š”


์—ญ์‹œ ์œ„์— ์˜ฌ๋ ค๋†“์€ ๋ฒกํ„ฐ๋ฅผ ์„ค๋ช…ํ•œ ๊ธ€์˜ 22๋ฒˆ์— ๋‚˜์™€์žˆ๋Š” ๋‚ด์šฉ์ด์—์š”




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

x1,y1 = $object_x,$object_yย 

x2,y2 = $object_x+5*Math.cos($object_angle),$object_y+5*Math.sin($object_angle)

x3,y3 = $player_x, $player_y


angle = Math.atan2($player_y-$object_y,$player_x-$object_x)

if side_angle(angle,$object_angle) <= $object_turn

$object_angle = angle

else

if ccw(x1,y1,x2,y2,x3,y3) > 0

$object_angle += $object_turn

else

$object_angle -= $object_turn

end

end


$object_x += $object_move*Math.cos($object_angle)

$object_y += $object_move*Math.sin($object_angle)

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



๊ทธ๋ฆฌ๊ณ  ์œ„์— ์˜ฌ๋ ค๋†“์€ ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ccw์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์›€์ง์ด๋Š”ย ์ฝ”๋“œ์—์š”


์šฐ์„  ccw์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉํ• ย (x1,y1,x2,y2,x3,y3)์˜ ๊ฐ’์„ ๊ตฌํ•ด์š”


1์ ์€ ์˜ค๋ธŒ์ ํŠธ์˜ ์ขŒํ‘œ๊ณ , 2์ ์€ ์˜ค๋ธŒ์ ํŠธ์˜ ํ˜„์žฌ ๊ฐ๋„๋กœ 5๋งŒํผ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ์˜ ์ (๊ฑฐ๋ฆฌ์˜ ๊ธธ์ด๋Š” ์ƒ๊ด€์—†์–ด์š”)์ด๊ณ ย 


3์ ์€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ขŒํ‘œ์—์š”



๊ทธ๋‹ค์Œ ์•„ํฌํƒ„์  ํŠธ2์— ์˜ค๋ธŒ์ ํŠธ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ขŒํ‘œ๊ฐ’์„ ๋„ฃ์–ด์„œ, ์˜ค๋ธŒ์ ํŠธ์—์„œ ํ”Œ๋ ˆ์ด์–ด ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๊ฐ๋„๋ฅผ ๊ตฌํ•ด์š”


๊ทธ๋ฆฌ๊ณ ย ์•ž์—์„œ ์„ค๋ช…ํ•œ side_angleํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œย ๊ทธ๋ ‡๊ฒŒ ์–ป์–ด์ง„ ๊ฐ๋„์™€ย ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฐ๋„ ์‚ฌ์ด์˜ ๊ฐ๋„๋ฅผ ๊ตฌํ•ด์š”


๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๊ทธ ๊ฐ’์ด ์˜ค๋ธŒ์ ํŠธ์˜ ํšŒ์ „์†๋„($object_turn, ์—ฌ๊ธฐ์„œ๋Š” 5๋„์—์š”) ๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์œผ๋ฉด, ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฐ๋„๋ฅผ ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ•œ ๊ฐ๋„, ์ฆ‰ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํ–ฅํ•œ ๊ฐ๋„๋กœ ๋ณ€๊ฒฝํ•ด์š”




๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๊ทธ ๊ฐ’์ด ์˜ค๋ธŒ์ ํŠธ์˜ ํšŒ์ „์†๋„๋ณด๋‹ค ํฌ๋‹ค๋ฉด


์•ž์—์„œ ๊ตฌํ•œย (x1,y1,x2,y2,x3,y3)๊ฐ’๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ccw์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ,ย 


ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์˜ค๋ธŒ์ ํŠธ์˜ +๋ฐฉํ–ฅ์— ์žˆ๋Š”์ง€, -๋ฐฉํ–ฅ์— ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๊ณ 


์˜ค๋ธŒ์ ํŠธ์˜ ๊ฐ๋„๋ฅผ ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœย ์˜ค๋ธŒ์ ํŠธ์˜ ํšŒ์ „์†๋„๋งŒํผ ๋ณ€๊ฒฝ์‹œ์ผœ์š”(+5 ๋˜๋Š” -5)




๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์•ž์—์„œ ์„ค๋ช…ํ•œ ๊ทน์ขŒํ‘œ๊ณ„์˜ ๊ฐ๋„์™€ ๊ธธ์ด ๊ณต์‹์œผ๋กœ


๊ทธ๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ฐ๋„๋กœ, ์˜ค๋ธŒ์ ํŠธ์˜ ์†๋„($object_move, ์—ฌ๊ธฐ์„œ๋Š” 3์ด์—์š”)๋งŒํผ ์˜ค๋ธŒ์ ํŠธ์˜ ์ขŒํ‘œ๋ฅผ ์ด๋™์‹œํ‚ค๋Š”๊ฑฐ์—์š”


๊ทธ๋ฆฌ๊ณ  1ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ด๋Ÿฐ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜๋‹ˆ๊นŒ, ์ตœ์ข…์ ์œผ๋กœ๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์†๋„๋Š” ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•œ์ฑ„๋กœ ๋ฐฉํ–ฅ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ์—์š”






์œ„์— ์˜ฌ๋ ค๋†“์€ ์˜์ƒ์€, ์•ž์—์„œ ์„ค๋ช…ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธ๊ฒŒ์ž„์—์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ ๊ฑฐ์—์š”


์ฒซ๋ฒˆ์งธ ๋ณด๋ผ์ƒ‰์ด ๋ฒกํ„ฐ์˜ ๋ง์…ˆ์„ ์‚ฌ์šฉํ•œ, ๋ฐฉํ–ฅ๊ณผ ์†๋„๊ฐ€ ๋ณ€ํ•˜๋ฉด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๊ณ 


๋‘๋ฒˆ์งธ ์—ฐ๋‘์ƒ‰์ด CCW์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ, ์†๋„๋Š” ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฉํ–ฅ๋งŒ ๋ณ€ํ•˜๋ฉด์„œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์—์š”





๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋ฉด ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฒฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”