0932 - Aria Poligon Simplu

De la Universitas MediaWiki

Cerinţa

Se dau coordonatele în plan pentru n puncte. Să se afișeze valoarea ariei poligonului pe care acestea îl formează.

Date de intrare

Fișierul de intrare ariapoligonsimpluin.txt conține pe prima linie numărul de vârfuri ale poligonului, notat cu n. Pe următoarele n linii se găsesc câte două numere separate printr-un spațiu, reprezentând abscisa respectiv ordonata câte unui vârf. Acestea sunt date într-un sens de parcurgere a laturilor poligonului.

Date de ieșire

Fișierul de ieșire ariapoligonsimpluout.txt va conține pe prima linie un număr real, cu exact o zecimală, reprezentând valoarea cerută.

Restricţii şi precizări

  • Numerele din fișierul de intrare sunt întregi cuprinse între -1001 și 1001.
  • Poligonul nu este neapărat convex dar nu se autointersectează.

Exemplu 1

ariapoligonsimpluin.txt
4
0 0
1 0
1 1
0 1
ariapoligonsimpluout.txt
Datele de intrare corespund restrictiilor impuse
1.0


Exemplu 2

ariapoligonsimpluin.txt
4
0 0
1 0
1 5000
0 1
ariapoligonsimpluout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

def calculeaza_arie(puncte):
    # Calculează aria unui poligon dat prin coordonatele punctelor sale.

    n = len(puncte)
    arie = 0.0
    for i in range(n):
        j = (i + 1) % n
        arie += puncte[i][0] * puncte[j][1]
        arie -= puncte[j][0] * puncte[i][1]
    arie = abs(arie) / 2.0
    return arie


def main():
    with open('ariapoligonsimpluin.txt', 'r') as fin, open('ariapoligonsimpluout.txt', 'w') as fout:
        n = int(fin.readline().strip())
        puncte = []
        for _ in range(n):
            x, y = map(int, fin.readline().split())
            puncte.append((x, y))

        # Verifică dacă datele de intrare respectă restricțiile
        if not all(-1001 <= x <= 1001 and -1001 <= y <= 1001 for x, y in puncte):
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
            return

        fout.write("Datele de intrare corespund restrictiilor impuse\n")

        arie = calculeaza_arie(puncte)
        fout.write(f"{arie:.1f}\n")


if __name__ == "__main__":
    main()