즐거운 게임 수학

특정 좌표가 삼각형 안에 있는지 확인하기

S.H.S 2023. 6. 5. 22:31

캐릭터의 기술중 삼각형 범위 안에 있는 적을 기절시키려 하는데 어떻게 구현할 수 있을까?

 

히어로즈 오브 더 스톰의 데커드 기술, 삼각형 안에 있는 적을 기절시킨다.

 

이는 부호 계산으로 감지할 수 있다.

 

function isPointInTriangle(
  pointX: number,
  pointY: number,
  x1: number,
  y1: number,
  x2: number,
  y2: number,
  x3: number,
  y3: number
) {
  const a = (x1 - pointX) * (y2 - y1) - (x2 - x1) * (y1 - pointY);
  const b = (x2 - pointX) * (y3 - y2) - (x3 - x2) * (y2 - pointY);
  const c = (x3 - pointX) * (y1 - y3) - (x1 - x3) * (y3 - pointY);
  return (a >= 0 && b >= 0 && c >= 0) || (a <= 0 && b <= 0 && c <= 0);
}

 

삼각형 ABC의 각 꼭지점의 좌표는 (x1, y1), (x2, y2), (x3, y3)이다.
우리가 알고 싶은 것은, 점 P의 좌표가 (pointX, pointY)일 때, 점 P가 삼각형 ABC의 내부에 있는지 아닌지를 알고 싶다.

삼각형 내부/외부 판별을 위해 부호를 이용하면 된다. 부호는 양수, 음수, 또는 0의 값을 뜻한다.

함수 내부에서 사용되는 변수 a, b, c는 주어진 점 P와 삼각형의 변 사이의 부호를 계산하는 값이며,
변수 a는 점 P와 삼각형의 변 (x1, y1) - (x2, y2) 사이의 부호를 계산한다.

만약 a가 양수이면 점 P는 변 (x1, y1) - (x2, y2)의 왼쪽에 위치함을 의미하며,

반대로 a가 음수이면 오른쪽에 위치함을 의미한다.

변수 b는 점 P와 삼각형의 변 (x2, y2) - (x3, y3) 사이의 부호를 계산하고 

변수 c는 점 P와 삼각형의 변 (x3, y3) - (x1, y1) 사이의 부호를 계산한다.

주어진 점 P가 삼각형 ABC의 내부에 위치하려면, 변수 a, b, c가 모두 같은 부호를 가져야 하며,
만약 a, b, c 중 하나 이상의 변수가 0이거나 양수이고, 나머지 변수가 0이거나 음수라면, 주어진 점 P는 삼각형 ABC의 외부에 위치함을 알 수 있다.