캐릭터의 기술중 삼각형 범위 안에 있는 적을 기절시키려 하는데 어떻게 구현할 수 있을까?
이는 부호 계산으로 감지할 수 있다.
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의 외부에 위치함을 알 수 있다.
'즐거운 게임 수학' 카테고리의 다른 글
특정 좌표가 타원형에 있는지 감지하기 (0) | 2023.06.06 |
---|---|
특정 좌표가 선 위에 있는지 감지하기 (0) | 2023.06.05 |
특정 좌표가 원 안에 있을 때 감지하기 (0) | 2023.06.05 |
선형 보간법(linear interpolation) (0) | 2023.06.05 |
특정 각도에서 일정 거리의 좌표 구하기 (0) | 2023.06.05 |