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

แล้วผลลัพธ์จะเป็นจริง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน 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