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 }

 

你可能感兴趣的:(HDU)