Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 원과 사각형 겹침

<시간/>

(반지름, xc, yc)로 표시되는 원이 있다고 가정합니다. 여기서 (xc, yc)는 원의 중심 좌표입니다. 또한 (x1, y1, x2, y2)로 표시되는 축 정렬 직사각형이 있습니다. 여기서 (x1, y1)은 왼쪽 하단 모서리의 좌표이고 (x2, y2)는 오른쪽 상단의 좌표입니다. 직사각형의 모서리. 원과 직사각형이 겹치는지 확인해야 합니다.

따라서 입력이 다음과 같으면

C++에서 원과 사각형 겹침

그러면 출력이 true가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • eval() 함수를 정의하면, b, c,

    가 필요합니다.
  • b의 최대값과 및 c의 최소값을 반환

  • 기본 방법에서 다음을 수행하십시오 -

  • cdx :=eval(cx, 왼쪽, 오른쪽), cdy :=eval(cy, 아래쪽, 위쪽)

  • rwid :=오른쪽 - 왼쪽, rh :=위쪽 - 아래쪽

  • dx :=cx - cdx, dy :=cy - cdy

  • disSq :=(dx * dx) + (dy * dy)

  • 제곱 반경 :=(r * r)

  • disSq <=sqrRadius이면 true를 반환하고, 그렇지 않으면 false

    를 반환합니다.

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int eval(int a, int b, int c){
      return max(b, min(a, c));
   }
   bool checkOverlap(int r, int cx, int cy, int left, int bottom, int right, int top){
      double cdx = eval(cx, left, right);
      double cdy = eval(cy, bottom, top);
      double rwid = right - left;
      double rh = top - bottom;
      double dx = cx - cdx;
      double dy = cy - cdy;
      double disSq = (dx * dx) + (dy * dy);
      double sqrRadius = (r * r);
      return (disSq <= sqrRadius);
   }
};
main(){
   Solution ob;
   cout << (ob.checkOverlap(1, 0, 0, 1, -1, 3, 1));
}

입력

1, 0, 0, 1, -1, 3, 1

출력

1