νŠΉμ •ν•œ 점이 λ‹€κ°ν˜• μ•ˆμ— ν¬ν•¨λ˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” 방법에 λŒ€ν•œ κΈ€μ΄μ—μš”


그리고 저도 μˆ˜ν•™μ΄λ‚˜ ν”„λ‘œκ·Έλž˜λ°μ„ 잘 μ•„λŠ”κ²Œ μ•„λ‹ˆλΌ, ν‹€λ¦¬κ±°λ‚˜ 잘λͺ»λœ λ‚΄μš©μ΄ μžˆμ„μˆ˜λ„ μžˆμ–΄μš”


γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘





1. 점이 λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€ κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λŠ” 방법

2fec9e36ebd518986abce89545847d6f



μ²«λ²ˆμ§ΈλŠ” νŠΉμ • 점이 νŠΉμ • λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λŠ” λ°©λ²•μ΄μ—μš”


μœ„μ— μ˜¬λ €λ†“μ€ 그림처럼, μ–΄λ–€ 점이 νŠΉμ • λ‹€κ°ν˜• μ•ˆμ— ν¬ν•¨λœλ‹€λ©΄


μ΄λ•Œ ν•΄λ‹Ή μ μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 직선을 κ·Έμ—ˆμ„λ•Œ, κ·Έ 직선은 λ‹€κ°ν˜•μ˜ λͺ¨μ„œλ¦¬μ™€ ν™€μˆ˜λ²ˆ κ΅μ°¨ν•΄μš”


즉, 직선이 λ‹€κ°ν˜•κ³Ό 짝수번 λ§Œλ‚˜κ±°λ‚˜, μ•„μ˜ˆ λ§Œλ‚˜μ§€ μ•ŠμœΌλ©΄, ν•΄λ‹Ή 점은 λ‹€κ°ν˜• μ•ˆμ— ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•Šμ€κ±°μ—μš”




2fef9e36ebd518986abce89541897465



그리고 이 μ•Œκ³ λ¦¬μ¦˜μ€ μ•žμ˜ 그림처럼 λ³Όλ‘λ‹€κ°ν˜•μ—μ„œλ§Œμ΄ μ•„λ‹ˆλΌ μœ„μ— μ˜¬λ €λ†“μ€ 그림처럼 였λͺ©λ‹€κ°ν˜•에도 적용될수 μžˆμ–΄μš”


μ—­μ‹œ λ§ˆμ°¬κ°€μ§€λ‘œ 점이 λ‹€κ°ν˜• 내뢀에 ν¬ν•¨λ˜μ–΄μžˆλ‹€λ©΄ 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이 ν™€μˆ˜λ²ˆ λ§Œλ‚˜κ³ 


ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•ŠμœΌλ©΄ λ§Œλ‚˜μ§€ μ•Šκ±°λ‚˜ 짝수번 λ§Œλ‚˜κ²Œ λ˜μš”




2fee9e36ebd518986abce89543867d6c



그리고 μ΄λ•Œ νŠΉμ • μ μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이, λ‹€κ°ν˜•μ˜ λͺ¨μ„œλ¦¬μ™€ κ΅μ°¨ν•˜λŠ”μ§€λ₯Ό νŒλ³„ν•˜κΈ° μœ„ν•΄μ„œλŠ”


두가지 단계λ₯Ό 거치게 λ˜μš”


μ²«λ²ˆμ§ΈλŠ” ν•΄λ‹Ή 점의 yμ’Œν‘œκ°€, ν•΄λ‹Ή λͺ¨μ„œλ¦¬μ˜ yμ’Œν‘œμ˜ μƒν•˜ λ²”μœ„ 내에 μžˆλŠ”μ§€λ₯Ό μ²΄ν¬ν•˜λŠ”κ±°μ—μš”,


즉 μœ„μ˜ κ·Έλ¦Όμ—μ„œλŠ” y값이 y1κ³Ό y2사이에 μžˆμ–΄μ•Ό ν•΄μš”,




그리고 λ‘λ²ˆμ§ΈλŠ” ν•΄λ‹Ή λͺ¨μ„œλ¦¬μ˜ 두 μ–‘ 끝 점을 μ§€λ‚˜λŠ” μ§μ„ μ˜ 방정식을 κ΅¬ν•΄μ„œ, ν•΄λ‹Ή λ°©μ •μ‹μ—Β μ μ˜ yμ’Œν‘œλ₯Ό λŒ€μž…ν–ˆμ„λ•Œ λ‚˜μ˜€λŠ” x값이


μ›λž˜ 점의 x값보닀 μ»€μ•Όν•΄μš”, μ¦‰Β μ˜€λ₯Έμͺ½μ— μžˆμ–΄μ•Ό ν•΄μš”


즉, μœ„μ˜ κ·Έλ¦Όμ—μ„œ 점 (x1,y1) (x2,y2) λ₯Ό μ§€λ‚˜λŠ” μ§μ„ μ˜ 방정식을 κ΅¬ν•œλ‹€μŒ


κ·Έλ•Œ κ·Έ 방정식에 νŒŒλž€ 점의 yμ’Œν‘œλ₯Ό λŒ€μž…ν•΄μ„œ λ‚˜μ˜€λŠ” xκ°’, 즉 주황색 점의 x값이 νŒŒλž‘μƒ‰ 점의 x값보닀 μ»€μ•Όν•΄μš”






2. κΌ­μ§“μ μ˜ μ’Œν‘œλ₯Ό λͺ¨μ„œλ¦¬λ‘œ λ°”κΏ”μ£ΌλŠ” ν•¨μˆ˜

2fe99e36ebd518986abce8954783766cc1


μ—¬κΈ°μ„œλΆ€ν„°λŠ” μ‹€μ œλ‘œ μ‚¬μš©λ˜λŠ” μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…μ΄μ—μš”


μš°μ„ , μœ„μ— μ˜¬λ €λ†“μ€ 그림처럼 λ‹€κ°ν˜•μ˜ 각 κΌ­μ§“μ μ˜ μ’Œν‘œκ°€ λ°°μ—΄λ‘œ μ£Όμ–΄μ‘Œμ„λ•Œ


ν•΄λ‹Ή μ’Œν‘œλ₯Ό λͺ¨μ„œλ¦¬λ“€λ‘œ λ³€ν™˜ν•΄μ„œ λ°°μ—΄λ‘œ 좜λ ₯ν•΄μ£ΌλŠ” ν•¨μˆ˜μ—μš”



γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘

def sort(p)

line = Array.new

i = 0

until p[i] == nil

if p[i+1] == nil

line.push([p[i][0],p[i][1],p[0][0],p[0][1]])

else

line.push([p[i][0],p[i][1],p[i+1][0],p[i+1][1]])

end

i += 1

end

return line

end

γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘γ…‘


μœ„μ— μ˜¬λ €λ†“μ€ μ½”λ“œκ°€ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ½”λ“œμ—μš”, rubyν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μž‘μ„±ν•œκ±°μ—μš”


[ [x1,y1],[x2,y2],[x3,y3] ] ν˜•μ‹μ˜ λ°°μ—΄λ‘œ λ‹€κ°ν˜•μ˜ κΌ­μ§“μ μ˜ μ’Œν‘œλ₯Ό μž…λ ₯ν•˜λ©΄


[ [x1,y1,x2,y2],[x2,y2,x3,y3],[x3,y3,x1,y1] ] ν˜•μ‹μ˜ λ°°μ—΄λ‘œ λ‹€κ°ν˜•μ˜ 각각의 λͺ¨μ„œλ¦¬λ“€μ„ 좜λ ₯ν•΄μ€˜μš”


μ΄λ•Œ κΌ­μ§“μ λ“€μ˜ μ’Œν‘œλŠ” μ‹œκ³„λ°©ν–₯, ν˜Ήμ€ λ°˜μ‹œκ³„λ°©ν–₯으둜 μˆœμ„œλŒ€λ‘œ μž…λ ₯ν•΄μ•Όν•΄μš”





3. 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이 λͺ¨μ„œλ¦¬μ™€ κ΅μ°¨ν•˜λŠ”μ§€ νŒλ³„ν•˜λŠ” ν•¨μˆ˜


2fe89e36ebd518986abce8954182716a


λ‹€μŒμ€ μ μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이, λ‹€κ°ν˜•μ˜ νŠΉμ • λͺ¨μ„œλ¦¬μ™€ κ΅μ°¨ν•˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜μ—μš”


γ…‘γ…‘γ…‘γ…‘γ…‘

def line_x(x1,y1,x2,y2,y)

if x1 == x2

x1 += 0.001

end

if y1 == y2

y1 += 0.001

end

return (y-y1)*((x2-x1)/(y2-y1))+x1

end

γ…‘γ…‘γ…‘γ…‘γ…‘


μ²«λ²ˆμ§ΈλŠ” μœ„μ˜ 그림처럼 두 점(x1,y1) (x2,y2)κ°€ μ£Όμ–΄μ‘Œμ„λ•Œ


이 두 점을 μ§€λ‚˜λŠ” 방정식을 κ΅¬ν•΄μ„œ, κ·Έ 방정식에 νŠΉμ • y값을 λŒ€μž…ν–ˆμ„λ•Œ λ‚˜μ˜€λŠ” x값을 κ΅¬ν•΄μ£ΌλŠ” ν•¨μˆ˜μ—μš”


μœ„μ˜ κ·Έλ¦Όμ—μ„œ 첫번째 쀄이 두 점(x1,y1) (x2,y2)을 μ§€λ‚˜λŠ” μ§μ„ μ˜ 방정식이고


λ‘λ²ˆμ§Έ 쀄은 ν•΄λ‹Ή 방정식을 x = 의 ν˜•νƒœλ‘œ μ •λ¦¬ν•œκ±°μ—μš”, ν•¨μˆ˜μ—μ„œ μ‹€μ œλ‘œ μ΄μš©ν•˜λŠ”κ±΄ λ‘λ²ˆμ§Έ μ‹μ΄μ—μš”




그리고 μ΄λ•Œ x1=x2 κ±°λ‚˜ y1=y2λ©΄ 였λ₯˜κ°€ μƒκΈΈμˆ˜λ„ μžˆμ–΄μ„œ κ·ΈλŸ΄λ•Œλ§Œ x1κ³Ό y1에 λ―Έμ„Έν•œ 값을 λ”ν•΄μ„œ μ„œλ‘œ κ°™μ§€ μ•Šκ²Œ μ‘°μ •ν•˜λ„λ‘ ν–ˆμ–΄μš”


(x1,y1,x2,y2,y) ν˜•νƒœλ‘œ μž…λ ₯ν•˜λ©΄, (x1,y1) (x2,y2)λ₯Ό μ§€λ‚˜λŠ” μ§μ„ μ˜ yμ—μ„œμ˜ x값을 좜λ ₯ν•΄μ€˜μš”



γ…‘γ…‘γ…‘γ…‘γ…‘

def right_cross(x1,y1,x2,y2,x,y)

if y < [y1,y2].min || y > [y1,y2].max

return 0

end

if line_x(x1,y1,x2,y2,y) < x

return 0

end

return 1

end

γ…‘γ…‘γ…‘γ…‘γ…‘


그리고 μœ„μ— μ˜¬λ €λ†“μ€ ν•¨μˆ˜κ°€ 첫번째 ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이 λ‹€κ°ν˜•μ˜ λͺ¨μ„œλ¦¬μ™€ κ΅μ°¨ν•˜λŠ”μ§€λ₯Ό νŒλ³„ν•˜λŠ” ν•¨μˆ˜μ—μš”


μš°μ„  점의 y값이 λͺ¨μ„œλ¦¬μ˜ yκ°’ 사이 λ²”μœ„μ— μžˆλŠ”μ§€ μ²΄ν¬ν•œλ‹€μŒ


μ•žμ˜ ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ, λͺ¨μ„œλ¦¬μ˜ μ–‘ 끝 점을 μ§€λ‚˜λŠ” μ§μ„ μ˜Β λ°©μ •μ‹μ—Β μ μ˜Β y값을 λŒ€μž…ν•΄μ„œ λ‚˜μ˜¨Β x값이


μ›λž˜ 점의 x값보닀 였λ₯Έμͺ½μ— μžˆλŠ”μ§€λ₯Ό μ²΄ν¬ν•΄μš”


그리고 λ‘˜ λ‹€ ν•΄λ‹Ήλ˜λ©΄, μ μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이 λͺ¨μ„œλ¦¬μ™€ λ§Œλ‚œλ‹€κ³  νŒλ³„ν•˜λŠ”κ±°μ—μš”


(x1,y1,x2,y2,x,y) ν˜•μ‹μœΌλ‘œ λͺ¨μ„œλ¦¬μ˜ μ–‘ 끝 점의 μ’Œν‘œ(x1,y1,x2,y2)κ³Ό 점의 μ’Œν‘œ(x,y)λ₯Ό μž…λ ₯ν•˜λ©΄ λ˜μš”




4. 점이 λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€ κ΅¬ν•˜λŠ” ν•¨μˆ˜


γ…‘γ…‘γ…‘γ…‘γ…‘

def point_polygon(x,y,p)

line = sort(p)

i = 0

j = 0

until line[i] == nil

x1,y1,x2,y2 = line[i][0],line[i][1],line[i][2],line[i][3]

if right_cross(x1,y1,x2,y2,x,y) == 1

j += 1

end

i +=1

end

if j%2 == 0

return 0

else

return 1

end

end

γ…‘γ…‘γ…‘γ…‘γ…‘



그리고 이게 μ•žμ˜ ν•¨μˆ˜λ“€μ„ μ΄μš©ν•΄μ„œ μ΅œμ’…μ μœΌλ‘œ 점이 νŠΉμ • λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” ν•¨μˆ˜μ˜ μ½”λ“œμ—μš”


(x,y)에 κ΅¬ν•˜κ³ μž ν•˜λŠ” 점의 μ’Œν‘œλ₯Ό μž…λ ₯ν•˜κ³ , pμ• Β [ [x1,y1],[x2,y2],[x3,y3] ]Β ν˜•μ‹μœΌλ‘œ κ΅¬ν•˜κ³ μž ν•˜λŠ” λ‹€κ°ν˜•λ“€μ˜ μ’Œν‘œλ₯Ό μž…λ ₯ν•˜λ©΄


ν•΄λ‹Ή 점이 ν•΄λ‹Ή λ‹€κ°ν˜•μ— ν¬ν•¨λ˜μ–΄μžˆλ‹€λ©΄ 1을, ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ 0을 좜λ ₯ν•΄μ€˜μš”


μ΄λ•Œ μ—­μ‹œ κΌ­μ§“μ λ“€μ˜ μ’Œν‘œλŠ” μ‹œκ³„λ°©ν–₯ ν˜Ήμ€ λ°˜μ‹œκ³„λ°©ν–₯으둜 μˆœμ„œλŒ€λ‘œ μž…λ ₯ν•΄μ•Όν•΄μš”




μš°μ„  2μ—μ„œ μ΄μ•ΌκΈ°ν•œ ν•¨μˆ˜λ‘œΒ λ‹€κ°ν˜•μ˜ κΌ­μ§“μ μ˜ μ’Œν‘œλ“€μ„ λͺ¨μ„œλ¦¬λ‘œ λ°”κΎΈκ³ 


κ·Έ λ‹€μŒμ— 3μ—μ„œ μ΄μ•ΌκΈ°ν•œΒ ν•¨μˆ˜λ‘œ λ‹€κ°ν˜•μ˜ 각각의 λͺ¨μ„œλ¦¬λ“€λ§ˆλ‹€ μ£Όμ–΄μ§„ μ μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 그은 직선이 κ΅μ°¨ν•˜λŠ”μ§€λ₯Ό μ²΄ν¬ν•΄μš”


κ·Έλ ‡κ²Œν•΄μ„œ μ΅œμ’…μ μœΌλ‘œ κ΅μ°¨ν•œ νšŸμˆ˜κ°€ 짝수번(2둜 λ‚˜λˆ΄μ„λ•Œ λ‚˜λ¨Έμ§€κ°€ 0)이면 ν¬ν•¨λ˜μ–΄μžˆμ§€ μ•Šλ‹€κ³  νŒλ‹¨ν•˜κ³ 


ν™€μˆ˜λ²ˆ(2둜 λ‚˜λˆ΄μ„λ•Œ λ‚˜λ¨Έμ§€κ°€ 0이 μ•„λ‹κ²½μš°)이면 ν¬ν•¨λ˜μ–΄ μžˆλ‹€κ³  νŒλ‹¨ν•˜λŠ”κ±°μ—μš”






5. CCWμ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λŠ” 방법


2feb9e36ebd518986abce895478370694d




λ‘λ²ˆμ§Έλ‘œ 이야기할 방법은 CCWμ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•΄μ„œ νŠΉμ • 점이 νŠΉμ • λ‹€κ°ν˜• 내뢀에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” λ°©λ²•μ΄μ—μš”




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

λ²‘ν„°μ˜ μ—°μ‚°κ³Ό ν™œμš© - 인디 κ²Œμž„ 개발 λ§ˆμ΄λ„ˆ 가러리

[μ‹œλ¦¬μ¦ˆ] κ²Œμž„μ œμž‘ Β· GJKμ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œ λ‹€μ–‘ν•œ λ„ν˜•μ˜ μΆ©λŒνŒμ • κ΅¬ν•˜κΈ° Β· GJK-EPA μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν”Œλ ˆμ΄μ–΄λ₯Ό λ°€μ–΄λ‚΄λŠ” 였브젝트 λ§Œλ“€κΈ° Β· 뢄리좕(SAT)μΆ©λŒκ²€μ‚¬λ₯Ό μ‚¬μš©ν•΄μ„œ λ°€μ–΄λ‚΄λŠ” 였브젝트 λ§Œλ“€κΈ° Β· OBB

gall.dcinside.com



CCWμ•Œκ³ λ¦¬μ¦˜μ— λŒ€ν•œ μ„€λͺ…은 μœ„μ— μ˜¬λ €λ†“μ€ κΈ€μ˜ 22번 뢀뢄에 λ‚˜μ™€μžˆμ–΄μš”,Β 


μ—¬κΈ°μ„œ μ„€λͺ…ν•˜λŠ” 방법은 μœ„μ˜ κΈ€μ˜ 24λ²ˆμ— λ‚˜μ™€μžˆλŠ” μ‚Όκ°ν˜•μ˜ λ‚΄λΆ€ νŒλ³„μ„ λ‹€κ°ν˜•μ˜ 경우둜 ν™•μž₯ν•œκ±°μ—μš”




즉, μœ„μ— μ˜¬λ €λ†“μ€ 그림처럼


μ–΄λ–€ 점이 νŠΉμ • λ‹€κ°ν˜•μ˜ 내뢀에 있으면


λ‹€κ°ν˜•μ˜ κΌ­μ§“μ λ“€μ—μ„œ μˆœμ„œλŒ€λ‘œ ν•΄λ‹Ή 점에 CCWμ•Œκ³ λ¦¬μ¦˜μ„ μ‹€ν–‰ν–ˆμ„λ•Œ,


즉 1번-2번-νŒŒλž‘μ , 2번-3번-νŒŒλž‘μ , μ΄λŸ°μ‹μœΌλ‘œ 5번-1번-νŒŒλž‘μ κΉŒμ§€ μ „λΆ€ μ‹€ν–‰ν–ˆμ„λ•Œ


λͺ¨λ“  값듀이 0보닀 μ»€μ•Όν•΄μš”,Β 




그리고 μ΄λ•ŒΒ xμ’Œν‘œκ°€ 였λ₯Έμͺ½μ΄ +κ³ , yμ’Œν‘œκ°€ μœ„μͺ½μ΄ +μΌλ•Œ κΈ°μ€€μœΌλ‘œ


λ‹€κ°ν˜•μ˜ κΌ­μ§“μ λ“€μ˜ μ’Œν‘œλŠ” λ°˜μ‹œκ³„λ°©ν–₯으둜 μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ Έμžˆμ–΄μ•Όν•΄μš”


또, μ•žμ—μ„œ μ„€λͺ…ν•œ 첫번째 λ°©λ²•κ³ΌλŠ” λ‹€λ₯΄κ²Œ, 이 방법은 λ³Όλ‘λ‹€κ°ν˜•μΌλ•Œλ§Œ μ‚¬μš©ν• μˆ˜ μžˆμ–΄μš”, 첫번째 λ°©λ²•μ²˜λŸΌ 였λͺ©λ‹€κ°ν˜•μ—λŠ” μ‚¬μš©ν• μˆ˜ μ—†μ–΄μš”



γ…‘γ…‘γ…‘γ…‘γ…‘

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

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

end

γ…‘γ…‘γ…‘γ…‘γ…‘


γ…‘γ…‘γ…‘γ…‘γ…‘

def point_polygon2(x,y,p)

i = 0

until p[i] == nil

if p[i+1] == nil

x1,y1,x2,y2,x3,y3 = p[i][0],p[i][1],p[0][0],p[0][1],x,y

else

x1,y1,x2,y2,x3,y3 = p[i][0],p[i][1],p[i+1][0],p[i+1][1],x,y

end

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

return 0

end

i += 1

end

return 1

end

γ…‘γ…‘γ…‘γ…‘γ…‘



그리고 μœ„μ— μ˜¬λ €λ†“μ€ μ½”λ“œκ°€ μ΄λ ‡κ²Œ CCWμ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜λŠ” λ°©λ²•μ˜ μ½”λ“œμ—μš”


μ²«λ²ˆμ§ΈλŠ” CCWμ•Œκ³ λ¦¬μ¦˜μ˜ μ½”λ“œκ³ , λ‘λ²ˆμ§Έκ°€ μ‹€μ œλ‘œ 점이 λ‹€κ°ν˜•μ˜ 내뢀에 μžˆλŠ”μ§€λ₯Ό νŒλ³„ν•˜λŠ” μ½”λ“œμ—μš”


x,y둜 κ΅¬ν•˜λ €λŠ” 점의 μ’Œν‘œλ₯Ό μž…λ ₯ν•˜κ³ 


p에 [ [x1,y1],[x2,y2],[x3,y3] ]Β ν˜•νƒœλ‘œ λ‹€κ°ν˜•μ˜ κΌ­μ§“μ μ˜ 각각의 μ’Œν‘œλ₯Ό μž…λ ₯ν•˜λ©΄(단 μ΄λ•Œ λ°˜μ‹œκ³„λ°©ν–₯으둜 μˆœμ„œλŒ€λ‘œ μž…λ ₯ν•΄μ•Όν•΄μš”)


λ‹€κ°ν˜•μ˜ λͺ¨λ“  κΌ­μ§“μ λ“€μ—μ„œ μˆœμ„œλŒ€λ‘œ ν•΄λ‹Ή 점과 CCWμ•Œκ³ λ¦¬μ¦˜μ„ μ‹€ν–‰ν•΄μ„œ λ§Œμ•½ κ·Έ 값이 λͺ¨λ‘ 0보닀 크면 ν¬ν•¨λœλ‹€κ³  1을 좜λ ₯ν•˜κ³ 


λ§Œμ•½ 값이 0보닀 κ°™κ±°λ‚˜ μž‘μ€ κ²½μš°κ°€ μžˆλ‹€λ©΄ ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€κ³  νŒλ³„ν•˜κ³  0을 좜λ ₯ν•΄μš”






그리고 μœ„μ— μ˜¬λ €λ†“μ€ μ˜μƒμ΄ ν•΄λ‹Ή μ½”λ“œλ“€μ„ μ΄μš©ν•΄μ„œ μ‹€μ œλ‘œ μΈκ²Œμž„μ—μ„œ 점이 λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” μ˜μƒμ΄μ—μš”


μ²«λ²ˆμ§Έκ°€ 점이 λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œ 뢀뢄이고


λ‘λ²ˆμ§Έκ°€Β CCWμ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•œ λΆ€λΆ„μ΄μ—μš”


빨강색 점이 ν”Œλ ˆμ΄μ–΄κ°€ μ›€μ§μ΄λŠ” μ μ΄μ—μš”, ν•΄λ‹Ή 점이 λ‹€κ°ν˜•μ˜ 내뢀에 ν¬ν•¨λœλ‹€λ©΄ λ‹€κ°ν˜•κ³Ό 점 λ‘˜λ‹€ 반투λͺ…ν•˜κ²Œ ν‘œμ‹œλ˜μš”




그리고 μ΄λŸ°μ‹μœΌλ‘œ ν•˜λ©΄ 점이 λ‹€κ°ν˜•μ— ν¬ν•¨λ˜λŠ”μ§€λ₯Ό κ΅¬ν• μˆ˜ μžˆμ–΄μš”