การตรวจสอบ Convex Hull (รูปหลายเหลี่ยม凸)
กำหนดจุดมุมเรียงตามเข็มนาฬิกา ตรวจสอบว่ามุมภายในทุกมุม ≤ 180° (Convex)
อัลกอริทึม
- วนตรวจสอบมุมของทุก 3 จุดติดต่อกัน
- ถ้ามีมุม > 180° → ไม่ใช่ Convex → คืน False
- ถ้าทุกมุม ≤ 180° → เป็น Convex → คืน True
ตัวอย่างโค้ด
import math
def get_angle(a, b, c):
angle = math.degrees(math.atan2(c[1]-b[1], c[0]-b[0]) - math.atan2(a[1]-b[1], a[0]-b[0]))
return angle + 360 if angle < 0 else angle
def solve(points):
n = len(points)
for i in range(len(points)):
p1 = points[i-2]
p2 = points[i-1]
p3 = points[i]
if get_angle(p1, p2, p3) > 180:
return False
return True
points = [(3,4), (4,7),(7,8),(11,6),(12,3),(10,1),(5,2)]
print(solve(points))
ผลลัพธ์
True
ความแตกต่างจาก Concave
Convex: ทุกมุม ≤ 180° | Concave: มีมุม > 180° อย่างน้อย 1 มุม