hdu2528 Area 直線與多邊形交點

點擊打開hdu2528

這個題目看完題目後就應該知道是要求渠道與校區的交點,也就是求一條直線與多邊形的交點,題目有一個重要的信息的——渠道一定會通過校園,那麼題目就不用考慮特殊情況,

直接求直線與多邊形交點就可以過。

求的時候,先要判斷線段與直線是否相交,再求交點,這裏的線段就是多邊形的每條邊。判斷的話可以利用直線與線段求交點的模板。我這裏是利用直線的方向向量,就是題目給出的兩個點,這裏記作向量ab,先用向量ab與多邊形的每一對相鄰的點求叉乘,因爲相鄰的兩個點求出的叉乘相乘爲負數,那麼肯定該線段與直線相交,在求交點。

 #include<stdio.h>
 #include<string.h>
 #include<stdlib.h>
 #include<math.h>
 #include<algorithm>
 using namespace std;
 const double eps=1e-8;
 const int maxn = 505;
 struct point
 {
     double x,y;
 };
 struct ploy
 {
     point node[ maxn ];
     int n;
 };
 point left,right,s;
 ploy p,p1,p2;

 double cross( point a,point b,point c )
 {                                          ///叉乘
     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
 }

 double ploy_area( ploy res ){///求多邊形面積
     double ans=0;
     res.node[ res.n ]=res.node[0];
     for( int i=0;i<res.n;i++ ){
         ans+=cross( s,res.node[i],res.node[i+1] );
     }
     return ans;
 }

 int dblcmp(double a) {return a<-eps?-1:a>eps?1:0;}///精度判斷

 ploy cut( ploy p,point s,point e )
 {
     point tmp;
     ploy bb;
     int cnt=0;
     for( int i=0;i<p.n;i++ )
    {
         int d1,d2;
         double s1,s2;
         d1=dblcmp(s1=cross( p.node[i],s,e ));//跨立
         d2=dblcmp(s2=cross( p.node[i+1],s,e ));//跨立
         if( d1>=0 )
         {
             bb.node[ cnt ]=p.node[ i ];
             cnt++;
         }
         if( d1*d2<0 )
         {
             tmp.x=(s2*p.node[i].x-s1*p.node[i+1].x)/(s2-s1);
             tmp.y=(s2*p.node[i].y-s1*p.node[i+1].y)/(s2-s1);
             bb.node[ cnt ]=tmp;
             cnt++;
         }
     }
     bb.n=cnt;
     bb.node[ cnt ]=bb.node[ 0 ];
     return bb;
 }

 int main()
 {
     while( scanf("%d",&p.n),p.n )
    {
         for( int i=0;i<p.n;i++ )
         {
             scanf("%lf%lf",&p.node[ i ].x,&p.node[ i ].y);
         }
         p.node[ p.n ]=p.node[ 0 ];

         scanf("%lf%lf%lf%lf",&left.x,&left.y,&right.x,&right.y);

         s.x=s.y=0;
         p1=cut( p,left,right );
         p2=cut( p,right,left );
         int res1,res2;
         res1=int(fabs(ploy_area( p1 ))/2+0.5);
         res2=int(fabs(ploy_area( p2 ))/2+0.5);

         printf("%d %d\n",res1>res2?res1:res2,res1>res2?res2:res1);
     }
     return 0;
 }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章