HDU2528 几何+线段交点

题意:

给定一个凸多边形和一条直线

求这个多边形被切割后的面积

对于代码中的

d1=dblcmp(s1=cross( p.node[i],s,e ));//跨立
d2=dblcmp(s2=cross( p.node[i+1],s,e ));//跨立

不是很理解。。。求指教

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<math.h>
 5 #include<algorithm>
 6 using namespace std;
 7 const double eps=1e-8;
 8 const int maxn = 505;
 9 struct point{
10     double x,y;
11 };
12 struct ploy{
13     point node[ maxn ];
14     int n;
15 };
16 point left,right,s;
17 ploy p,p1,p2;
18 
19 double cross( point a,point b,point c ){
20     return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
21 }
22 
23 double ploy_area( ploy res ){
24     double ans=0;
25     res.node[ res.n ]=res.node[0];
26     for( int i=0;i<res.n;i++ ){
27         ans+=cross( s,res.node[i],res.node[i+1] );
28     }
29     return ans;
30 }
31 
32 int dblcmp(double a) {return a<-eps?-1:a>eps?1:0;}
33 
34 ploy cut( ploy p,point s,point e ){
35     point tmp;
36     ploy bb;
37     int cnt=0;
38     for( int i=0;i<p.n;i++ ){
39         int d1,d2;
40         double s1,s2;
41         d1=dblcmp(s1=cross( p.node[i],s,e ));//跨立
42         d2=dblcmp(s2=cross( p.node[i+1],s,e ));//跨立
43         if( d1>=0 ){
44             bb.node[ cnt ]=p.node[ i ];
45             cnt++;
46         }
47         if( d1*d2<0 ){
48             tmp.x=(s2*p.node[i].x-s1*p.node[i+1].x)/(s2-s1);
49             tmp.y=(s2*p.node[i].y-s1*p.node[i+1].y)/(s2-s1);
50             bb.node[ cnt ]=tmp;
51             cnt++;
52         }
53     }
54     bb.n=cnt;
55     bb.node[ cnt ]=bb.node[ 0 ];
56     return bb;
57 }
58 
59 int main(){
60     while( scanf("%d",&p.n),p.n ){
61         for( int i=0;i<p.n;i++ ){
62             scanf("%lf%lf",&p.node[ i ].x,&p.node[ i ].y);
63         }
64         p.node[ p.n ]=p.node[ 0 ];
65         scanf("%lf%lf%lf%lf",&left.x,&left.y,&right.x,&right.y);
66         s.x=s.y=0;
67         p1=cut( p,left,right );
68         p2=cut( p,right,left );
69         int res1,res2;
70         res1=int(fabs(ploy_area( p1 ))/2+0.5);
71         res2=int(fabs(ploy_area( p2 ))/2+0.5);
72         printf("%d %d\n",res1>res2?res1:res2,res1>res2?res2:res1);
73     }
74     return 0;
75 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2910824.html