Cod sursa(job #2489738)

Utilizator mirceaisherebina mircea mirceaishere Data 9 noiembrie 2019 11:36:58
Problema Aria Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <iomanip>
#include <math.h>
using namespace std;
ifstream fin("aria.in");
ofstream fout("aria.out");

/// aria este |DET|/2
/// triunghiuri asemenea -> y3-y1 = x3-x1
///                         y2-y1   x2-x1

/// inmultim pe diagonala -> (y3-y1)*(x2-x1) - (y2-y1)*(x3-x1)

/// acesta este determinantul DET
/// daca DET a 3 puncte este 0 acestea sunt coliniare
/// (aria triungiului format de ele fiind 0)

int n, xx1, xx2, xx3, xx4, yy1, yy2, yy3, yy4, x[100010], y[100010];
double suma;

int det(int x1, int y1, int x2, int y2, int x3, int y3){
    return (y3-y1)*(x2-x1) - (y2-y1)*(x3-x1);
}

int detFataDeZEro(int x2, int y2, int x3, int y3){
    return y3*x2-y2*x3;
}

int main(){
    /// Aria unui poligon se calculeaza alegand orice punct - pentru simplificare (0,0)
    /// si facand determinantul acelui punct cu toate laturile poligonului
    /// unele "arii" (det/2) vor avea semn negativ, iar altele pozitiv
    /// adunandu-le si facand modulul vom obtine aria poligonului
    /// pentru un poligon cu n laturi Aria=|d12+d23+...+dn1|/2

    fin>>n;
    for(int i=1; i<=n; i++){
        fin>>x[i]>>y[i];
    }
    if(n<=2){
        fout<<setprecision(5)<<fixed;
        fout<<0;
        return 0;
    }
    for(int i=3; i<=n; i++){
        suma+=det(x[1], y[1], x[i-1], y[i-1], x[i], y[i]);
    }
    suma=max(suma, -suma)/2;
    fout<<setprecision(5)<<fixed;
    fout<<suma;
}