2013-04-03 65 views
5

Tôi đang cố tạo một máy tính tính diện tích tứ giác đơn giản. Tôi biết rằng mỗi tứ giác có thể được chia thành hai hình tam giác, và tôi sẽ có thể tính toán diện tích ở hai phần bất kể cái gì. Tôi có thể làm điều này trong toán học, nhưng tôi không biết làm thế nào để thực hiện nó với Python.Tính diện tích tứ giác

Đây là lớp tứ giác của tôi:

class Quadrilateral(Shape): 
    def __init__(self, name): 
     # in clockwise order: angles[0], sides[0], angles[1], sides[1], ... 
     self.sides = [5] * 4 
     self.angles = [90] * 4 
     super().__init__(self, name) 

Bây giờ những gì tôi cần là để thực hiện một phương pháp get_area() mà tính diện tích tứ giác của tôi, nhưng tôi không có ý tưởng như thế nào.

Đây là cách tôi sẽ làm điều đó với một giấy và một cây bút:

Area of a quadrilateral

Về cơ bản tôi sẽ chỉ cần phải biết hai góc và ba mặt để có thể sử dụng kỹ thuật này để tính toán diện tích, nhưng đừng lo lắng về điều đó. Bây giờ, tôi biết tất cả các góc và tất cả các bên, làm cách nào để tính toán diện tích?

+2

Đây có thể là cách tiếp cận tốt hơn để sử dụng điểm 2D thay cho góc và chiều dài phụ. Nó có thể dẫn đến một tập hợp dữ liệu không hợp lệ khi có một mặt nhưng không điều chỉnh dữ liệu tương ứng. Sử dụng các điểm 2D, các mối quan hệ (góc và chiều dài bên) là ngầm định. –

+0

upvote cho một pic tuyệt vời! – Gerrat

+1

@Gerrat Sơn để giành chiến thắng, yay! –

Trả lời

4

Chỉ cần truy cập vào hai bên và góc độ trực tiếp trong hai danh sách bạn có:

import math 

area1 = 0.5 * self.sides[0] * self.sides[1] * math.sin(math.radians(self.angles[1])) 
area2 = 0.5 * self.sides[2] * self.sides[3] * math.sin(math.radians(self.angles[3])) 
area = area1 + area2 

Với ví dụ của bạn như sides = [3, 5, 5, 4]angles = [90, 95, 75, 100], khu vực này sau đó là:

>>> import math 
>>> sides = [3, 5, 5, 4] 
>>> angles = [90, 95, 75, 100] 
>>> area1 = 0.5 * sides[0] * sides[1] * math.sin(math.radians(angles[1])) 
>>> area2 = 0.5 * sides[2] * sides[3] * math.sin(math.radians(angles[3])) 
>>> area1 + area2 
17.31953776581017 
+0

Vâng đây là những gì tôi nghĩ quá và tôi đã thử nó, nhưng nó cho một số kết quả kỳ lạ thực sự. Trong ví dụ của bạn quá, suy nghĩ về các bên '[3, 5, 5, 4]' và khu vực đang được chỉ '0.060806449423319364'? Không thể. –

+4

Không. 'Math.sin' tính bằng radian thay vì độ! – core1024

+0

@ core1024 Ahh, cảm thấy ngu ngốc bây giờ, tất nhiên ... Làm thế nào để chuyển đổi nó? –

Các vấn đề liên quan