3. Feladat

class

Írj egy osztályt, melynek elemei két dimenziós alakzatok!

  • Az objektumok inicializálása egy olyan lista alapján történjen, melynek elemei valós számpárok (kételemű listák). Ezek a számpárok az adott alakzat csúcsainak koordinátái.
  • Legyen az osztálynak egy olyan metódusa, mely kiszámítja az alakzatok súlypontját és felületét, és aminek a neve 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.

Megoldás

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.

In [5]:
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:

In [6]:
derekszogu_haromszog = sokszog([0, 0], [3, 0], [0, 4])
derekszogu_haromszog.sulypont_szamolo()
Out[6]:
(1.0, 1.3333333333333333, 6.0)
In [7]:
szabalyos_haromszog = sokszog([0, 0], [1, 0], [0.5, 0.866])
szabalyos_haromszog.sulypont_szamolo()
Out[7]:
(0.49999999999999994, 0.2886666666666666, 0.433)
In [8]:
paralelogramma = sokszog([0, 0], [1, 0], [1.5, 2], [0.5, 2])
paralelogramma.sulypont_szamolo()
Out[8]:
(0.75, 1.0, 2.0)
In [10]:
negyzet = sokszog( [-1, -1], [1, -1], [1, 1], [-1, 1])
negyzet.sulypont_szamolo()
Out[10]:
(0.0, 0.0, 4.0)
In [ ]: