Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วงกลมและสี่เหลี่ยมผืนผ้าทับซ้อนกันใน C++


สมมติว่าเรามีวงกลมที่แสดงเป็น (รัศมี, xc, yc) ที่นี่ (xc, yc) คือพิกัดศูนย์กลางของวงกลม นอกจากนี้เรายังมีสี่เหลี่ยมที่จัดแนวแกนซึ่งแสดงเป็น (x1, y1, x2, y2) โดยที่ (x1, y1) คือพิกัดของมุมล่างซ้าย และ (x2, y2) คือพิกัดของมุมบนขวา มุมของสี่เหลี่ยม เราต้องตรวจสอบก่อนว่าวงกลมกับสี่เหลี่ยมทับซ้อนกันหรือไม่

ดังนั้นหากอินพุตเป็นแบบ

วงกลมและสี่เหลี่ยมผืนผ้าทับซ้อนกันใน C++

แล้วผลลัพธ์จะเป็นจริง

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน eval() ซึ่งจะใช้ a, b, c,

  • ส่งกลับค่าสูงสุดของ b และค่าต่ำสุดของ a และ c

  • จากวิธีหลัก ให้ทำดังนี้ −

  • cdx :=eval(cx, ซ้าย, ขวา), cdy :=eval(cy, ล่างสุด, บนสุด)

  • rwid :=ขวา - ซ้าย rh :=บน - ล่าง

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

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

  • sqrRadius :=(r * r)

  • คืนค่าจริงเมื่อ disSq <=sqrRadius มิฉะนั้นเป็นเท็จ

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#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