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 }

 

转载于:https://www.cnblogs.com/xxx0624/archive/2013/02/13/2910824.html

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值