즐거운 게임 수학

특정 좌표가 선 위에 있는지 감지하기

2023. 6. 5. 20:22

FPS 게임에서 총으로 사격했을 때 총알의 궤적 안에 있는 적에게 대미지를 입히고자 한다. 어떻게 구현할 수 있을까?

 

 

이는 직선의 방정식을 이용하여 구현할 수 있다.

 

/// 두 함수 모두 동일한 동작을 한다.

// 직선의 방정식.
// 방정식은 ax + by + c = 0이며, 점의 좌표를 대입하여 계산된 값은 직선과 점 사이의 관계를 나타낸다.
function isPointInLine(pointX: number, pointY: number, x1: number, y1: number, x2:number , y2: number) {
  const a = y2 - y1;
  const b = x1 - x2;
  const c = x2 * y1 - x1 * y2;
  return a * pointX + b * pointY + c === 0;
}

// 기울기, Y절편을 이용한 방정식.
// 방정식은 y = mx + b이며, 이중 m은 기울기를,  b는 y의 절편을 의미한다.
function isPointInLine(pointX: number, pointY: number, x1: number, y1: number, x2: number, y2: number) {
  const slope = (y2 - y1) / (x2 - x1);
  const yIntercept = y1 - slope * x1;

  return pointY === slope * pointX + yIntercept;
}

 

직선의 방정식은 값이 0이면 점은 선 위에 위치함을 나타내고,  양수(+)면 점이 선의 한쪽에, 음수(-)면 점이 선의 다른쪽에 위치함을 알 수 있다.

 

console.log(isPointInLine(10, 10, -5, -5, 5, 5)); // true

하지만 위 함수들은 선 위에 존재하는지 확인하는 게 아닌, 기울어짐에 따른 결과만을 반환한다.

예시로 주어진 점의 위치가 두 선의 좌표를 벗어남에도 궤도가 같음으로 true를 반환한다.

 

이는 게임 상에서 일직선으로 발사되는 로켓 등의 투사체 궤도를 예상할 때 유용하게 쓰일 수 있지만 지금은 주어진 선 위에 존재하는지 확인하고자 함으로 아래와 같이 조건을 추가한다.

 

function isPointOnLine(pointX, pointY, x1, y1, x2, y2) {
  const a = y2 - y1;
  const b = x1 - x2;
  const c = x2 * y1 - x1 * y2;
  return (
    a * pointX + b * pointY + c === 0 &&
    pointX >= Math.min(x1, x2) &&
    pointX <= Math.max(x1, x2) &&
    pointY >= Math.min(y1, y2) &&
    pointY <= Math.max(y1, y2)
  );
}

조건을 통해 점이 선분의 좌표 범위 안에 있는지 확인하기만 하면 점이 주어진 선 위에 존재하는지 감지할 수 있게 된다.

'즐거운 게임 수학' 카테고리의 다른 글

특정 좌표가 타원형에 있는지 감지하기  (0) 2023.06.06
특정 좌표가 삼각형 안에 있는지 확인하기  (0) 2023.06.05
특정 좌표가 원 안에 있을 때 감지하기  (0) 2023.06.05
선형 보간법(linear interpolation)  (0) 2023.06.05
특정 각도에서 일정 거리의 좌표 구하기  (0) 2023.06.05
'즐거운 게임 수학' 카테고리의 다른 글
  • 특정 좌표가 타원형에 있는지 감지하기
  • 특정 좌표가 삼각형 안에 있는지 확인하기
  • 특정 좌표가 원 안에 있을 때 감지하기
  • 선형 보간법(linear interpolation)
S.H.S
S.H.S
한또리의 일기장
S.H.S
한또리의 일기장
전체
오늘
어제
  • 분류 전체보기 (35)
    • 개발 이야기 (1)
      • JavaScript (4)
      • TypeScript (0)
      • React (4)
      • Git (3)
      • Next.js (0)
      • Pattern Matching (1)
      • Terminal (1)
      • AWS (1)
      • Unity (0)
      • Python (0)
      • Ubuntu (0)
      • Aduino (0)
    • 즐거운 게임 수학 (9)
    • 개발자 면접 후기 (7)
    • 일상 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 각도
  • 패키지 관리자
  • 컴포넌트 렌더링
  • 컴포넌트 시각화
  • 계산
  • react
  • 이색테마
  • 프론트엔드 면접
  • 회사
  • 애니메이션
  • 신박함
  • 수염 자국
  • 컴포넌트 기반
  • git
  • code-owners
  • 원
  • 거리
  • 프론트엔드
  • 개발자
  • 수학

최근 댓글

최근 글

hELLO · Designed By 정상우.
S.H.S
특정 좌표가 선 위에 있는지 감지하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.