from math import sqrt as sq
class krater:
    def __init__(self, x, y, r, nev):
        self.x = x
        self.y = y
        self.r = r
        self.nev = nev
        
    def __repr__(self): 
        return str((self.x, self.y, self.r, self.nev))

kraterek = []           # lista az adatok tárolására
# -------------------------------------------------------------------------------------
# 1. Olvassa be és tárolja el a bemeneti állomány tartalmát! Az állományban legfeljebb
#    100 kráter adatai szerepelnek.
# -------------------------------------------------------------------------------------
fbe = open('felszin_tpont.txt','r')
for sor in fbe:
    sor = sor.strip().split('\t')
    sor[0:3] = map(float,sor[0:3])
    kraterek.append(krater(sor[0],sor[1],sor[2],sor[3]))
fbe.close()
# -------------------------------------------------------------------------------------
# 2. Számolja meg, hogy hány kráter található a bemeneti állományban, és írja a 
#    képernyőre a kráterek számát!
# -------------------------------------------------------------------------------------
print('2. feladat')
print(f'A kráterek száma: {len(kraterek)}')
# -------------------------------------------------------------------------------------
# 3. Kérje be a felhasználótól egy kráter pontos nevét, majd írja ki a kráter adatait! 
#    A kiírás egy teljes mondat legyen, például: "A(z) Stephen Hawking középpontja 
#    X=3.45 Y=2.78 sugara R=0.35.". Ha a név nem szerepel a kráterek nevei között, 
# akkor írja ki: "Nincs ilyen nevű kráter.".
# -------------------------------------------------------------------------------------
print('3. feladat')
krater_nev = input('Kérem egy kráter nevét: ')
i = 0
while i < len(kraterek) and kraterek[i].nev != krater_nev:
    i += 1
if i < len(kraterek):
    print(f'A(z) {kraterek[i].nev} középpontja X={kraterek[i].x} Y={kraterek[i].y} sugara R={kraterek[i].r}.')
else:
    print('Nincs ilyen nevű kráter.')
# -------------------------------------------------------------------------------------
# 4. Vizsgálja meg a szonda által kapott adatokat, és adja meg a legnagyobb sugarú 
#    kráter sugarát és névadójának nevét! Amennyiben több legnagyobb kráter van, úgy
#    elég az egyiket megadnia.
# -------------------------------------------------------------------------------------
print('4. feladat')
# max_r = max(kraterek, key = lambda elem: elem.r)
# print(f'A legnagyobb kráter neve és sugara: {max_r.nev} {max_r.r}')
# rendezéssel, ezt egy későbbi feladatban fel tudjuk használni (7. feladatban)
rend = sorted(kraterek, key = lambda elem: elem.r, reverse = True)
print(f'A legnagyobb kráter neve és sugara: {rend[0].nev} {rend[0].r}')
# -------------------------------------------------------------------------------------
# 5. A következő feladatokban szüksége lesz arra, hogy kiszámítsa két kráter közép-
#    pontjának távolságát. Készítsen függvényt, amely a Pitagorasz-tétel felhaszná-
#    lásával kiszámítja két, koordinátákkal adott pont távolságát! 
#    A függvény bemenete a két pont, (x1, y1) és (x2, y2) koordinátái (valós számok), 
#    visszaadott értéke a távolságuk (valós szám). A függvény leírása a következő:
#           Függvény tavolsag(x1, y1, x2, y2 : Valós ) : Valós
#               tavolsag := Négyzetgyök((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
#           Függvény vége
# -------------------------------------------------------------------------------------
def tavolsag(x1, y1, x2, y2):
    return sq(pow((x2-x1),2)+pow((y2-y1),2))
# -------------------------------------------------------------------------------------
# 6. Két kráter nem fedi át egymást, nincs közös részük, ha középpontjaik távolsága 
#    nagyobb, mint a két kráter sugarának összege. Kérje be egy kráter nevét, és adja 
#    meg azoknak a krátereknek a nevét, amelyekkel a bekért kráternek nincs közös része!
#    A kiírásban szereplő kráterek nevei között egy vessző és egy szóköz legyen az 
#    elválasztás! Ha nincs ilyen kráter, akkor nem kell megjelenítenie semmit.
# -------------------------------------------------------------------------------------
print('6. feladat')
krater_nev = input('Kérem egy kráter nevét: ')
i = 0
while i < len(kraterek) and kraterek[i].nev != krater_nev:
    i += 1
if i < len(kraterek):       # megtaláltuk a megadott nevű krátert
    print('Nincs közös része:', end = ' ')
    x = kraterek[i].x
    y = kraterek[i].y
    r = kraterek[i].r
    for krater in kraterek:
        if krater.nev != krater_nev:
            if tavolsag(x, y, krater.x, krater.y) > r + krater.r:
                print(krater.nev, end = ', ') 
    print()           
else:
    print('Nincs ilyen nevű kráter.')
# -------------------------------------------------------------------------------------
# 7. Egy kráter tartalmaz egy másik krátert, ha a kisebb kráter teljes egészében a nagy
#    kráterben található. Ez körök esetében azt jelenti, hogy a két kör középpontjának 
#    távolsága kisebb, mint a nagyobb kör sugarának és a kisebb kör sugarának különb-
#    sége. Vizsgálja meg a krátereket, és írja ki azoknak a krátereknek a nevét, 
#    amelyek esetében a nagyobb kráter tartalmazza a kisebb krátert! Minden ilyen 
#    tartalmazást csak egyszer jelenítsen meg úgy, hogy megadja, hogy melyik kráter 
#    tartalmazza a másikat!
# -------------------------------------------------------------------------------------
print('7. feladat')
# sugár szerint csökkenően rendezett listán megyünk végig
for i in range(len(rend) - 1):
    for j in range(i + 1, len(rend)):
        if tavolsag(rend[i].x, rend[i].y, rend[j].x, rend[j].y) < (rend[i].r - rend[j].r):
            print(f'A(z) {rend[i].nev} kráter tartalmazza a(z) {rend[j].nev} krátert.')
# -------------------------------------------------------------------------------------    
# 8. A kráterek adatai alapján számítsa ki, hogy mekkora területűek az egyes kráterek, 
#    és készítsen egy terulet.txt szöveges állományt, amely tartalmazza a kráterek 
#    nevét és területét! A kör területe ?? = r2??, ahol r a kör sugara, ?? értéke két 
#    tizedesjegyre kerekítve 3.14. Az állomány minden egyes sorában egy kráter adatai
#    szerepeljenek: először a kráter területe két tizedesjegyre kerekítve, majd egy 
#    tabulátor karakter, majd a kráter neve!
# -------------------------------------------------------------------------------------
print('8. feladat - terulet.txt')
fki = open('terulet.txt','w')
pi = 3.14
for krater in kraterek:
    print(f'{pow(krater.r,2)*pi:.2f}\t{krater.nev}')                # mehet képernyőre is
    print(f'{pow(krater.r,2)*pi:.2f}\t{krater.nev}', file = fki)
fki.close()
