TIL: Typescrypt 공 튕기기.. (3) 서로 충돌하는 공의 반사각 - 220801

Lumpen·2022년 8월 2일
0

TIL

목록 보기
104/244
post-custom-banner

반사각 구하기

수학과 물리학.. 모른다
정석대로라면 삼각함수와 에너지 보존 등의 것을 구해서 해야겠지만
속도는 변하지 않는 설정으로 물리량을 무시하기 때문에
상대적으로 간단히..? 각도에 대해서만 구해보기로 했다

한 방향으로 움직이는 점이 다른 각도로 날아오는 힘에 부딛힌다는 컨셉으로 구해보았다..

각각의 공의 속도가 고정이기 때문에 물리량은 동일한 것으로 가정하면
그냥 입사각 반사각을 서로 교환하는 느낌이 되지 않을까 싶었다

// 계산된 각도 값을 받아 360 이상이면 360을 빼주고
// 0보다 작으면 360을 더해준다
// 계산된 결과 값이 390일 경우 360을 빼서 30도로 맞춰주는
 checkAngleRange(ang) {
    if (ang >= 360) {
      ang -= 360;
    } else if (ang < 0) {
      ang += 360;
    }
    return ang;
  }
// 공의 전 후 움직임으로 각도 계산
  ballAngle(ball: Ball) {
    const thisX = ball.x - (ball.x + ball.vx);
    const thisY = ball.y - (ball.y + ball.vy);
    const radian = Math.atan2(thisY, thisX);
    const degree = (radian * 180) / Math.PI;

    return degree;
  }
// 충돌 후 움직임 수정

  bounceBall(ab) {
    const distancX = Math.pow(this.x - ab.x, 2);
    const distancY = Math.pow(this.y - ab.y, 2);

    const After = {
      MoveBetween: Math.sqrt(distancX + distancY),
      Between: ab.radius + this.radius,
    };
	
    // 두 공의 움직임 각도 계산
    const thisAngle = this.ballAngle(this);
    const abAngle = this.ballAngle(ab);

    // 충돌 감지 구간 줄이기
    if (
      After.MoveBetween <= After.Between + 2 &&
      After.MoveBetween - After.Between > -2
    ) {
      // 충돌 후 변경된 각도
      let angle = abAngle + (thisAngle - abAngle) + 180;
	  
      // 0~360도로 변환
      angle = this.checkAngleRange(angle);
      
      // 각도에 따른 좌표 계산하여 스피드 - 추후 조정해야함
      const newX = Math.cos(angle) * this.speed;
      const newY = Math.sin(angle) * this.speed;
	  
      // 현재 움직임을 변경
      this.vx = newX;
      this.vy = newY;
    }
  }

다 좋은데 공의 부피에 서로 닿는 움직임을 가지게 될 경우
계속 충돌 감지가 되는 버그 발생..
아무래도 면적이 없는 점을 기준으로 생각한 것이기 때문에
당연한 결과일지도..
부피에 대한 고려를 하여 식을 다시 짜야하겠다

profile
떠돌이 생활을 하는. 실업자, 부랑 생활을 하는
post-custom-banner

0개의 댓글