Írj egy osztályt, melynek elemei két dimenziós alakzatok!
sulypont_szamolo
! A metódus térjen vissza egy három számból álló listával, ezek közül az első kettő a súlypont koordinátája, a harmadik pedig a felület értéke. Az osztálynak egy változója van, a csucsok
amely a csúcsok koordinátáit tartalmazza. Egy sokszog típusú objektum inicializálakor az argumentumként megadott kételemű listákból álló lista írodik bele a csucsok
változóba. Mivel fontos, hogy ez egy kételemű listákból álló lista legyen, ezért ha argumentumként nem azt kap, hibát kell dobjon.
A konstruktoron kívül, a sokszog osztálynak még egy metódusa van, a sulypont_szamolo()
függvény, amely a sokszög súlypontjának koordinátáit, és a sokszög területét számolja ki, a wikipédián található képlet alapján:
A sokszög területe: $$ A = \frac{1}{2} \sum_{i = 0}^{n-1} \left(x_i y_{i+1} - x_{i+1} y_i \right) $$
A súlypontjának $x$ koordinátája: $$ C_x = \frac{1}{6A} \sum_{i = 0}^{n-1} \left( x_i + x_{i+1} \right) \left(x_i y_{i+1} - x_{i+1} y_i \right) $$
A súlypontjának $y$ koordinátája: $$ C_y = \frac{1}{6A} \sum_{i = 0}^{n-1} \left( y_i + y_{i+1} \right) \left(x_i y_{i+1} - x_{i+1} y_i \right) $$
Az összegzést legegyszerűbb egy for-ciklus segítségével elvégezni, de hogy ne dobjon kivételt, amikor az utolsó és az első csúcs koordinátáival számolunk, ezért nem a 0. és a $n-1$. indexek között összegzünk, hanem a -1. és a $n-2$. között.
class sokszog:
'''Egy síkbeli sokszöget képvisel'''
def __init__(self, *args):
'''Kételemű listák listájaként várja a sokszög csúcsainak koordinátáit'''
for arg in args:
if type(arg) != list or len(arg) != 2:
raise ValueError("Nem kételemű lista")
self.csucsok = args
def sulypont_szamolo(self):
'''Kiszámolja a sokszög sulypontjának koordinátáit, és területét'''
A = 0
for i in range(-1, len(self.csucsok) - 1):
A += 0.5*(self.csucsok[i][0]*self.csucsok[i + 1][1] - self.csucsok[i + 1][0]*self.csucsok[i][1])
Cx = 0
Cy = 0
for i in range(-1, len(self.csucsok) - 1):
Cx += 1/(6*A)*(self.csucsok[i][0] + self.csucsok[i + 1][0])*(self.csucsok[i][0]*self.csucsok[i + 1][1] - self.csucsok[i + 1][0]*self.csucsok[i][1])
Cy += 1/(6*A)*(self.csucsok[i][1] + self.csucsok[i + 1][1])*(self.csucsok[i][0]*self.csucsok[i + 1][1] - self.csucsok[i + 1][0]*self.csucsok[i][1])
return Cx, Cy, A
Ezután nézzünk néhány elemibb példát, amivel leellenőrizhetjük a helyes működést:
derekszogu_haromszog = sokszog([0, 0], [3, 0], [0, 4])
derekszogu_haromszog.sulypont_szamolo()
szabalyos_haromszog = sokszog([0, 0], [1, 0], [0.5, 0.866])
szabalyos_haromszog.sulypont_szamolo()
paralelogramma = sokszog([0, 0], [1, 0], [1.5, 2], [0.5, 2])
paralelogramma.sulypont_szamolo()
negyzet = sokszog( [-1, -1], [1, -1], [1, 1], [-1, 1])
negyzet.sulypont_szamolo()