zoj 1010 几何题

#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;

struct point
{
 double x,y;
};

int n,i;
point a[1000];

double xmult(double x1,double y1,double x2,double y2)
{
 return (x1*y2-y1*x2); 
}
double min(double a,double b)
{
 return a<=b?a:b;
}
double max(double a,double b)
{
 return a>=b?a:b;
}
bool between(point i,point m,point n)
{
 if(i.x>=min(m.x,n.x)
  &&i.y>=min(m.y,n.y)
  &&i.x<=max(m.x,n.x)
  &&i.y<=max(m.y,n.y))
  return true;
 return false;
}

double same_side(point i, point j, point m, point n)
{
 double mnx=n.x-m.x;
 double mny=n.y-m.y;
 
 double imx=m.x-i.x;
 double imy=m.y-i.y;

 double jmx=m.x-j.x;
 double jmy=m.y-j.y;
 
 double t1=xmult(imx,imy,mnx,mny);
 double t2=xmult(jmx,jmy,mnx,mny);
 if(t1==0 && between(i,m,n))
  return -1;
 if(t2==0 && between(j,m,n))
  return -1;
 return t1*t2;
}
// bool same_side(point p1,point p2,point p3,point p4)
// {
//  double dx,dy,dx1,dy1,dx2,dy2;
//  dx = p4.x-p3.x, dy = p4.y-p3.y;
//  dx1 = p1.x-p3.x, dy1 = p1.y-p3.y;
//  dx2 = p2.x-p4.x, dy2 = p2.y-p4.y;
//  return xmult(dx,dy,dx1,dy1)*xmult(dx,dy,dx2,dy2)>0.0;
// }
//判p1p2与p3p4相交
// bool intersect(point p1,point p2,point p3,point p4)
// {
//  return (!same_side(p1,p2,p3,p4) && !same_side(p3,p4,p1,p2));
// }

bool intersect(point i,point j,point m, point n)
{
 if(same_side(i,j,m,n)<0.0 && same_side(m,n,i,j)<0.0)
  return true;
 else
  return false;
}
double area_polygon()
{
 double s1=0;
 for(int i=0;i<n;i++)
 {
  s1+=xmult(a[i].x,a[i].y,a[(i+1)%n].x,a[(i+1)%n].y);
 }
 return fabs(s1/2);
}
void solve()
{
 if(n<3)
 {
  cout<<"Impossible"<<endl;
  return;
 }
 for(int i=0;i<=n-1;i++)
 {
  int k=(i+1)%n;
  for(int j=(i+1)/n;j<=i-2;j++)
  {
   if(intersect(a[i],a[k],a[j],a[j+1]))
   {
    cout<<"Impossible"<<endl;
    return;
   }
  }
 }
 cout<<setiosflags(ios::fixed)<<setprecision(2)<<area_polygon()<<endl;
}

int main()
{
 int i;
 int cs=0;
#ifdef ONLINE_JUDGE
#else
 ifstream cin("1.txt");
#endif
 while(cin>>n && n)
 {
  for(i=0;i<n;i++)
   cin>>a[i].x>>a[i].y;
  cout<<"Figure "<<++cs<<": ";
  solve();
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值