Pagini recente » Cod sursa (job #1621915) | Cod sursa (job #1384095) | Cod sursa (job #99968) | Cod sursa (job #2756949) | Cod sursa (job #1805705)
#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];
}
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;
}
std::pair<double,double> p1,p2,p3;
};
double get_signed_area(Triangle T) {
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]=T.p1.first,a[0][2]=T.p1.second;
a[1][1]=T.p2.first,a[1][2]=T.p2.second;
a[2][1]=T.p3.first,a[2][2]=T.p3.second;
return determinant(a);
}
}
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=1;i<points.size();++i){
geometry::Triangle T({0,0},points[i-1],points[i]);
area +=geometry::get_signed_area(T);
}
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::get_signed_area(geometry::Triangle(p1,p2,p3));
return area<0;
}
std::vector<std::pair<double,double> > points;
};
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){
int x,y;
f>>x>>y;
A.push_back({x,y});
}
Poligon poligon(A);
g<<poligon.get_area();
}