당 판정 알고리즘(2D 사각형×사각형)

당 판정은 표준으로 잘 들어가 있기 때문에, 알고리즘까지 생각한 적이 없는 사람도 꽤 있다고 생각합니다. 이번에는 조금 끈질긴 원리를 생각해 보겠습니다.
복잡하고 빠른 것은 더 있다고 생각합니다만, 이것은 가장 간단한 알고리즘인가라고 생각합니다.

이번은 사각형 x 사각형이므로 직사각형 (읽기 "구케")라고도 불린다고 생각합니다.
여기에서는 구형을 「사각형」이라고 부릅니다.

당 판정에 필요한 정보



우선 당첨 판정에 사용하는 정보를 리스트 업 합니다.

■ 중심 위치 (x, y)
■ 가로폭 (width)
■ 높이 (height)

이것이 갖추어져 있으면 당 판정을 할 수 있어, 라고 하는 이야기입니다.
아직 아무것도 이야기가 진행되지 않으므로 우선 가라앉아 갑시다.

「가로의 조건」과 「세로의 조건」이 있다




그림을 보자. "빨강"과 "파랑"이라고합니다.

옆에 대해



1. 우선 거리를 내자
위치를 바탕으로 거리를 내립니다.
거리 = (빨간색 X - 파란색 X)의 절대 값
입니다.

왜 절대치인가 하면, 마이너스로 하고 싶지 않기 때문입니다.
빨강(3,10), 파랑(5,20)의 경우 2
빨강(30,2), 파랑(18,2)의 경우 12
그리고 어떤 경우에도 동일하게 취급할 수 있습니다.

2. 두 개의 폭 ÷ 2를 더한다
그것은 빨강 .width/2 + 파랑 .width/2
에서 낼 수 있습니다.

3 . 1과 2 비교
자, 1과 2를 사용하면 충돌 상태를 감지 할 수 있다고 생각하지 않습니까?
1 < 2일 때입니다.
이것은 말로 늘어놓아도 힘줄에 떨어지지 않는다고 생각하므로, 이미지 해 보세요.
1 < 2일 때 충돌입니다.

세로 정보



옆에 대해 'x'나 'width'를 다루고 있던 것을 'y'나 'height'로 바꿀 뿐입니다.

결정하자.



「세로에 대해」 「가로에 대해」 양쪽 충돌 검출할 수 있으면 충돌입니다.

JavaScript & Canvas로 표현하는 데 필요한 지식



원리의 이야기가 끝났으므로 앞으로는 표현해 나갈 것입니다.

알다시피, 절대 값을 내는 표준 함수 Math.abs()가 필요합니다.
var absNum = Math.abs(-10); // 10

그리고 Canvas에서 사각형을 표현한다면 rect()가 필요합니다.
rect (x, y, width, height)로 렌더링 됩니다.
rect (100,100,10,10); //(100,100)に幅、高さ10の四角を描く

자, 해보자.

index.html
<script>
function setup(){
  var canvas = document.getElementById('MyCanvas');
  if (canvas.getContext){
    ctx = canvas.getContext('2d');

    //赤い四角
    var red = {
      x : 100,
      y : 100,
      width : 80,
      height : 100
    };

    //青い四角
    var blue = {
      x : 160,
      y : 180,
      width : 100,
      height : 130
    };


    // 当たり判定
    if(
      Math.abs(red.x - blue.x) < red.width/2 + blue.width/2 //横の判定
      &&
      Math.abs(red.y - blue.y) < red.height/2 + blue.height/2 //縦の判定
    ){
      console.log("hit"); // hit
    }

    //rectの基準点は左上になっているので、描画時に基準点を真ん中にしてます。
    ctx.rect(red.x - red.width/2,red.y - red.height/2,red.width,red.height);
    ctx.rect(blue.x - blue.width/2,blue.y - blue.height/2,blue.width,blue.height);

    ctx.fill();

  }
}

</script><html><head><style type="text/css">canvas { background:#FAFAFA;}</style></head><body onload="setup();"><canvas id="MyCanvas" width="500" height="500"></canvas></body></html>


왜 "차이의 절대치"인가? 아게인



「차이의 절대치」를 내는 것의 혜택은 4개의 패턴에 대응할 수 있는 것이군요.
아래의 4개의 패턴 모두 할 수 있는 것을 이미지 해 봅시다. 할 수 있을 것 같네요.



좋은 웹페이지 즐겨찾기