สมมติว่าเรามีจุดนอกของรูปหลายเหลี่ยมในลำดับตามเข็มนาฬิกา เราต้องเช็คจุดพวกนี้ว่านูนตัวเรือหรือไม่
จากแผนภาพนี้ เป็นที่ชัดเจนว่าสำหรับจุดสามจุดที่ต่อเนื่องกันนั้นมุมภายในจะต้องไม่เกิน 180° ดังนั้นหากมุมทั้งหมดไม่เกิน 180° รูปหลายเหลี่ยมจะเป็นตัวเรือนูน
ดังนั้น ถ้าอินพุตเหมือนกับคะแนน =[(3,4), (4,7),(7,8),(11,6),(12,3),(10,1),(5,2 )] จากนั้นผลลัพธ์จะเป็น True
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- n :=ขนาดของคะแนน
- สำหรับ i ในช่วง 0 ถึงขนาดของจุด ทำ
- p1 :=points[i-2] เมื่อ i> 1 มิฉะนั้น points[n-2]
- p2 :=points[i-2] เมื่อ i> 0 มิฉะนั้น points[n-1]
- p3 :=คะแนน[i]
- ถ้ามุมระหว่างจุด (p1, p2, p3)> 180 แล้ว
- คืนค่าเท็จ
- คืนค่า 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))
อินพุต
[(3,4), (4,7),(7,8),(11,6),(12,3),(10,1),(5,2)]
ผลลัพธ์
True