poj2318(叉积判断点的位置+二分查找)
2014-03-09 23:20
435 查看
作为一个计算几何入门者,个人感觉是个好题
给定两点(x1,y1)、(x2,y2)确定的直线和一点(x,y),判断点在直线的左边还是右边
代码如下:
给定两点(x1,y1)、(x2,y2)确定的直线和一点(x,y),判断点在直线的左边还是右边
代码如下:
#include<iostream> #include<algorithm> #include<string> #include<stack> #include<queue> #include<set> #include<map> #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<time.h> #include<math.h> #define eps 1e-9 #define pi acos(-1.0) #define N 5000+10 #define P system("pause") using namespace std; struct point { double x,y; }; double a ,b ; //记录每条直线 int c ;//记录每个块中玩具的数目 double cross(point A,point B)//叉积 { return A.x*B.y-A.y*B.x; } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int n,m,i; double x1,y1,x2,y2; while(scanf("%d",&n) && n) { memset(c,0,sizeof(c)); scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2); for(i=1;i<=n;i++) scanf("%lf%lf",&a[i],&b[i]); a[0]=x1;a[n+1]=x2; b[n+1]=x1; b[n+1]=x2; double x,y; for(i=0;i<m;i++) { scanf("%lf%lf",&x,&y); int left=0,right=n+1; while(left<right) //二分查找 这只是一种写法,个人喜欢这样写 { int mid=(left+right)/2; point v,w; // v.x=a[mid]-b[mid];v.y=y1-y2; v.x=a[mid]-x;v.y=y1-y; //w.x=x-b[mid];w.y=y-y2; w.x=b[mid]-x;w.y=y2-y; if(cross(w,v) > eps)//点在直线左边 right=mid; else left=mid+1; } c[left]++; } for(i=0;i<=n;i++) printf("%d: %d\n",i,c[i+1]); printf("\n"); } // P; return 0; }
相关文章推荐
- 叉积判断点在多边形内外 & poj2318
- poj 2318 点与线位置关系的判断 二分+叉积
- POJ2318->叉积判断点在线段的左右
- poj 1269 Intersecting Lines (叉积 判断两直线位置关系)
- POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
- 计算几何—Toy 叉积判断点与线段的相对位置
- POJ 2318 || TOYS (叉积判断左右位置进行折半查找
- POJ2318 叉积判断点与直线的关系
- POJ 2398 排序+叉积判断点与直线位置关系+统计
- poj2318_TOYS_叉积判断点在线段的哪一侧
- POJ1269_Intersecting Lines(几何/叉积判断直线位置关系)
- POJ 2318 叉积判断点与直线位置
- POJ 2318 TOYS(叉积判断点与线段的位置关系)
- POJ2318TOYS(叉积判断点与直线位置)
- poj 2398 叉积判断点位置
- Matlab判断某数组中是否包含某元素及其位置
- 怎样快速判断掩码第一个为1的Bit位置
- JS:判断URL地址,加载页面完成定位到页面某个选项卡的某个位置
- 给定一个字符串,判断该字符串中是否包含某个子串.如果包含, 求出子串的所有出现位置
- 《c程序设计语言》读书笔记-4.1-判断字符串在另一个字符串中的位置