Cod sursa(job #2478114)

Utilizator lucianistratiIstrati Lucian lucianistrati Data 21 octombrie 2019 17:51:53
Problema Aria Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.49 kb
#include <iostream>
#include <math.h>
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
typedef struct
{
    double x,y;
}punct;
const int inf=1e9;
const double pi=3.1415;
vector<punct> v,I,J;
double det;
double a1,b1,c1,a2,b2,c2,X,Y;
double dist(punct a,punct b)
{
    return (sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y)));
}

double side(punct a,punct b,punct c)
{
    return ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x));
}
void patrulater()
{
    punct a,b;
    a.x=v[0].x;
    a.y=v[0].y;
    b.x=v[1].x;
    b.y=v[1].y;
    if((side(a,b,v[2])<0 && side(a,b,v[3])>0) || (side(a,b,v[2])>0 && side(a,b,v[3])<0))
    {
        I.push_back(a);
        I.push_back(b);
        J.push_back(v[2]);
        J.push_back(v[3]);
        return;
    }
    a.x=v[0].x;
    a.y=v[0].y;
    b.x=v[2].x;
    b.y=v[2].y;
    if((side(a,b,v[1])<0 && side(a,b,v[3])>0) || (side(a,b,v[1])>0 && side(a,b,v[3])<0))
    {
        I.push_back(a);
        I.push_back(b);
        J.push_back(v[1]);
        J.push_back(v[3]);
        return;
    }
    a.x=v[0].x;
    a.y=v[0].y;
    b.x=v[3].x;
    b.y=v[3].y;
    if((side(a,b,v[2])<0 && side(a,b,v[1])>0) || (side(a,b,v[2])>0 && side(a,b,v[1])<0))
    {
        I.push_back(a);
        I.push_back(b);
        J.push_back(v[1]);
        J.push_back(v[2]);
        return;
    }
    a.x=v[1].x;
    a.y=v[1].y;
    b.x=v[2].x;
    b.y=v[2].y;
    if((side(a,b,v[0])<0 && side(a,b,v[3])>0) || (side(a,b,v[0])>0 && side(a,b,v[3])<0))
    {
        I.push_back(a);
        I.push_back(b);
        J.push_back(v[0]);
        J.push_back(v[3]);
        return;
    }
    a.x=v[1].x;
    a.y=v[1].y;
    b.x=v[3].x;
    b.y=v[3].y;
    if((side(a,b,v[0])<0 && side(a,b,v[2])>0) || (side(a,b,v[0])>0 && side(a,b,v[2])<0))
    {
        I.push_back(a);
        I.push_back(b);
        J.push_back(v[0]);
        J.push_back(v[2]);
        return;
    }
    a.x=v[2].x;
    a.y=v[2].y;
    b.x=v[3].x;
    b.y=v[3].y;
    if((side(a,b,v[0])<0 && side(a,b,v[1])>0) || (side(a,b,v[0])>0 && side(a,b,v[1])<0))
    {
        I.push_back(a);
        I.push_back(b);
        J.push_back(v[0]);
        J.push_back(v[1]);
        return;
    }
}
 double arie(punct a,punct b,punct c)
{
    double p,arie,len_a,len_b,len_c;
    len_a=dist(a,b);
    len_b=dist(b,c);
    len_c=dist(a,c);
    p=(len_a+len_b+len_c)/2;
    arie=sqrt(p*(p-len_a)*(p-len_b)*(p-len_c));
    return arie;
}
int comparator(double dif1,double dif2)
{
    if(abs(dif1-dif2)<0.001)
        return 1;
    else
        return 0;
}
bool triunghi()
{
        int i,max=0;
        punct last_p,a,b,c;
        last_p.x=v[3].x;
        last_p.y=v[3].y;
        a.x=v[0].x;
        a.y=v[0].y;
        b.x=v[1].x;
        b.y=v[1].y;
        c.x=v[2].x;
        c.y=v[2].y;

    if(comparator(arie(a,b,c),arie(a,b,last_p)+arie(a,c,last_p)+arie(b,c,last_p))==1 && (arie(b,c,last_p)==0 || arie(a,c,last_p)==0 || arie(b,a,last_p)==0))
    {
        cout<<"Punctul ("<<last_p.x<<", "<<last_p.y<<") este pe o latura a triunghiului\n";return true;
    }
    if(comparator(arie(a,b,c),arie(a,b,last_p)+arie(a,c,last_p)+arie(b,c,last_p))==1 && (arie(b,c,last_p)!=0 && arie(a,c,last_p)!=0 && arie(b,a,last_p)!=0))
    {
        cout<<"Punctul ("<<last_p.x<<", "<<last_p.y<<") este strict in interiorul triunghiului\n"; return true;
    }
    else {
        cout<<"Punctul ("<<last_p.x<<", "<<last_p.y<<") este in afara triunghiului\n"; return false;
    }

}
int apartine(double X,double Y)
{
    return (((a1*X+b1*Y+c1)==0) && ((a2*X+b2*Y+c2)==0));
}
void circumscriptibil()
{
    patrulater();
    punct a,b,c,d;
    double d1,d2,d3,d4;
    a=I[0];
    b=J[0];
    c=I[1];
    d=J[1];
    d1=dist(a,b);
    d2=dist(b,c);
    d3=dist(c,d);
    d4=dist(d,a);
    cout<<a.x<<" "<<a.y<<"\n";
    cout<<b.x<<" "<<b.y<<"\n";
    cout<<c.x<<" "<<c.y<<"\n";
    cout<<d.x<<" "<<d.y<<"\n";

    if(d1+d3==d2+d4)
        cout<<"E circumscriptibil";
    else
        cout<<"Nu este!";
}
int main()
{
    ifstream fin("maxsubsum.in");
    punct t;
    int i;
    for(i=1;i<=4;i++)
    {
        fin>>t.x>>t.y;
        v.push_back(t);
    }
    //Ecuatia A1A2
    a1=v[0].y-v[1].y;
    b1=v[1].x-v[0].x;
    c1=v[0].x*v[1].y-v[1].x*v[0].y;
    //Ecuatia A3A4
    a2=v[2].y-v[3].y;
    b2=v[3].x-v[2].x;
    c2=v[2].x*v[3].y-v[3].x*v[2].y;
    if(triunghi()==false)
    {
    circumscriptibil();}
    fin.close();
    return 0;
}