Pagini recente » Cod sursa (job #862352) | Cod sursa (job #3148397) | Cod sursa (job #137835) | Cod sursa (job #455517) | Cod sursa (job #1805712)
#include <bits/stdc++.h>
namespace geometry{
double determinant(const std::vector<std::vector<double> > &a){
double result=0;
result+=a[0][0]*a[1][1]*a[2][2];
result+=a[1][0]*a[2][1]*a[0][2];
result+=a[2][0]*a[0][1]*a[1][2];
result-=a[0][2]*a[1][1]*a[2][0];
result-=a[1][2]*a[2][1]*a[0][0];
result-=a[2][2]*a[0][1]*a[1][0];
return result;
}
class Triangle{
public:
Triangle(std::pair<double,double> p1,std::pair<double,double> p2,
std::pair<double,double> p3){
this->p1=p1;
this->p2=p2;
this->p3=p3;
}
double get_signed_area() {
std::vector<std::vector<double> > a(3,std::vector<double>(3,0));
a[0][0]=a[1][0]=a[2][0]=1;
a[0][1]=p1.first,a[0][2]=p1.second;
a[1][1]=p2.first,a[1][2]=p2.second;
a[2][1]=p3.first,a[2][2]=p3.second;
return determinant(a);
}
std::pair<double,double> p1,p2,p3;
};
}
class Poligon{
public:
Poligon(const std::vector<std::pair<double,double> >& points){
this->points=std::vector<std::pair<double,double> > (points);
}
double get_area(){
double area=0;
for(int i=0;i<points.size();++i){
geometry::Triangle T({0,0},points[i],points[(i+1)%points.size()]);
area +=T.get_signed_area();
}
return area;
}
bool is_point_inside(std::pair<double,double> P){
bool sign=sign_of_direction(points[0],points[1],P);
for(int i=0,len=points.size();i<len;++i)
if (sign_of_direction(points[i],points[(i+1)%len],P)!=sign){
return false;
}
return true;
}
bool is_convex(){
bool sign=sign_of_direction(points[0],points[1],points[2]);
for(int i=0,len=points.size();i<len;++i)
if (sign_of_direction(points[i],points[(i+1)%len],
points[(i+2)%len])!=sign){
return false;
}
return true;
}
private:
bool sign_of_direction(std::pair<double,double> p1,
std::pair<double,double> p2,std::pair<double,double> p3){
double area=(geometry::Triangle(p1,p2,p3)).get_signed_area();
return area<0;
}
std::vector<std::pair<double,double> > points;
};
double mdl(double val){
return val<0?-val:val;
}
#include <iomanip>
int main(){
std::vector<std::pair<double,double> > A;
std::ifstream f("aria.in");
std::ofstream g("aria.out");
int nrp;
f>>nrp;
while (nrp--){
double x,y;
f>>x>>y;
A.push_back({x,y});
}
g<<std::fixed;
g<<std::setprecision(7);
Poligon poligon(A);
g<<mdl(poligon.get_area()/2.0);
}