2013-04-03 19 views
5

Próbuję utworzyć kalkulator, który oblicza obszar prostego czworoboku. Wiem, że każdy czworobok może być podzielony na dwa trójkąty i powinienem być w stanie obliczyć obszar na dwie części, bez względu na wszystko. Jestem w stanie to zrobić z matematyki, ale nie wiem, jak zaimplementować go w Pythonie.Oblicz pole czworoboku

Oto mój czworoboku klasy:

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) 

Teraz co jest mi potrzebne do wdrożenia metody get_area() który oblicza obszar mojego czworoboku, ale nie mam pojęcia jak to zrobić.

Oto w jaki sposób mogę to zrobić z papieru i długopis:

Area of a quadrilateral

Zasadniczo chciałbym tylko wiedzieć, dwa kąty i trzy boki, aby móc korzystać z tej techniki, aby obliczyć powierzchnię, ale nie przejmujmy się tym. Na razie znam wszystkie kąty i wszystkie strony, jak mam obliczyć obszar?

+2

To może być lepsze podejście do wykorzystania punktów 2D zamiast kątów i bocznych lengthes. Może to spowodować niepoprawny zestaw danych, gdy zmodyfikuje jedną stronę, ale nie dostosuje odpowiednich danych. Stosując punkty 2D, zależności (kąt i długość boku) są niejawne. –

+0

Awansuj na niesamowite zdjęcia! – Gerrat

+1

@Gerrat Pomaluj, wygraj! –

Odpowiedz

4

Wystarczy dostęp do boków i kątów bezpośrednio w dwóch wykazach masz:

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 

Biorąc pod uwagę Twój przykład jako sides = [3, 5, 5, 4] i angles = [90, 95, 75, 100] obszar następnie jest:

>>> 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

Tak też myślałem i próbowałem, ale daje to naprawdę NAPRAWDĘ dziwne rezultaty. W twoim przykładzie również pomyśl o bokach "[3, 5, 5, 4]" i obszarze będącym tylko '0.060806449423319364'? Niemożliwe. –

+4

Nr 'math.sin' oblicza w radianach, a nie w stopniach! – core1024

+0

@ core1024 Ahh, czuć się głupio, oczywiście ... Jak mogę to przekonwertować? –