สมมติว่าเรามีวงกลมที่แสดงเป็น (รัศมี, 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