2013-04-03 24 views
5

Sto provando a creare un calcolatore che calcola l'area di un quadrilatero semplice. So che ogni quadrilatero può essere diviso in due triangoli, e dovrei essere in grado di calcolare l'area in due parti, non importa quale. Sono in grado di farlo in matematica, ma non so come implementarlo in Python.Calcola l'area di un quadrilatero

Ecco la mia classe quadrilatero:

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) 

Ora quello che serve è quello di implementare un metodo get_area() che calcola l'area del mio quadrilatero, ma non ho idea di come fare.

Ecco come lo farei con una carta e una penna:

Area of a quadrilateral

Fondamentalmente ho solo bisogno di sapere due angoli e tre lati di essere in grado di utilizzare questa tecnica per calcolare l'area, ma non preoccupiamoci di questo. Per ora, conosco tutti gli angoli e tutti i lati, come faccio a calcolare l'area?

+2

potrebbe essere un approccio migliore per utilizzare i punti 2D invece angoli e lunghezze laterali. Potrebbe risultare in un set di dati non valido quando si modifica un lato ma non si regolano i dati corrispondenti. Utilizzando i punti 2D, le relazioni (angolo e lunghezza laterale) sono implicite. –

+0

upvote per una fantastica foto! – Gerrat

+1

@Gerrat Paint per la vittoria, yay! –

risposta

4

Basta accedere ai lati e gli angoli direttamente nelle due liste si dispone:

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 

Dato il vostro esempio come sides = [3, 5, 5, 4] e angles = [90, 95, 75, 100], l'area poi è:

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

Sì, questo è quello che ho pensato anch'io e l'ho provato, ma sta dando dei risultati davvero strani. Anche nel tuo esempio, pensa ai lati '[3, 5, 5, 4]' e l'area è solo '0.060806449423319364'? Non possibile. –

+4

No. 'math.sin' calcola in radianti anziché in gradi! – core1024

+0

@ core1024 Ahh, mi sento stupido ora, naturalmente ... Come posso convertirlo? –