hdoj1086 You can Solve a Geometry Problem too(数学几何题)

来源:互联网 发布:linux列出所有用户 编辑:程序博客网 时间:2024/04/29 02:27

来源:http://acm.hdu.edu.cn/showproblem.php?pid=1086

有两种思路

1.求出某一直线的方程式,将另一线段两端点代入判断正负。

2.叉乘的思想

这里用的是叉乘的方法(写这个得细心些)

代码如下

#include<stdio.h>#include<string>#include<math.h> #include<iostream>using namespace std;#define Max 0x7ffffffdouble Max1(double a,double b){ a=(a>b)?a:b; return a ;}double Min1(double a,double b){ a=(a<b)?a:b; return a ;}struct point{double x,y;};struct line{point a,b;};double xmulti(point a1,point a2,point a3){return (a1.x-a3.x)*(a2.y-a3.y)-(a1.y-a3.y)*(a2.x-a3.x);}int judge(line l1,line l2){if(Max1(l1.a.x,l1.b.x)>=Min1(l2.a.x,l2.b.x)&&Max1(l1.a.y,l1.b.y)>=Min1(l2.a.y,l2.b.y)&&Max1(l2.a.x,l2.b.x)>=Min1(l1.a.x,l1.b.x)&&Max1(l2.a.y,l2.b.y)>=Min1(l1.a.y,l1.b.y)&&xmulti(l1.a,l2.b,l2.a)*xmulti(l1.b,l2.b,l2.a)<=0&&xmulti(l2.a,l1.b,l1.a)*xmulti(l2.b,l1.b,l1.a)<=0)return 1;return 0;}int main(){int n,i,j,cnt;    line l[101];while(~scanf("%d",&n)&&n){for(i=0;i<n;i++){scanf("%lf%lf%lf%lf",&l[i].a.x,&l[i].a.y,&l[i].b.x,&l[i].b.y);}cnt=0;for(i=0;i<n;i++)for(j=i+1;j<n;j++){if(judge(l[i],l[j]))cnt++;}printf("%d\n",cnt);}return 0;}


阅读全文
0 0
原创粉丝点击