# POJ2318 叉积判断点与直线的关系

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>

#define maxn 5000+10

typedef struct Point
{
int x,y;
}point;

typedef struct Line
{
point a,b;
}Line;

int ans[maxn];
int n;
Line line[maxn];

using namespace std;

int cross(point p0, point p1, point p2) //p0,p1是线段，p2是待判断的点
{
return (p2.x - p0.x)*(p1.y - p0.y)-(p1.x - p0.x)*(p2.y - p0.y);
}

void search(point toy)   //搜索并利用叉积进行判断
{
if(cross(line[0].b,line[0].a,toy)<0)
ans[0]++;
else if(cross(line[n-1].b,line[n-1].a,toy)>0)
ans[n]++;
else
{
for(int i=0;i<n;i++)
if(cross(line[i].b,line[i].a,toy)>0&&cross(line[i+1].b,line[i+1].a,toy)<0)
ans[i+1]++;
}
}

int main()
{
point toy;
int m,x1,y1,x2,y2;
int u,l;
int xj,yj;
while(scanf("%d",&n) && n!=0)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
{
scanf("%d%d",&u,&l);
line[i].a.x=u;
line[i].a.y=y1;
line[i].b.x=l;
line[i].b.y=y2;
}

for(int i=0;i<m;i++)
{
scanf("%d%d",&xj,&yj);
point toy;
toy.x=xj;
toy.y=yj;
search(toy);
}

for(int i=0;i<=n;i++)
printf("%d: %d\n",i,ans[i]);
cout<<endl;
}
}

#include <iostream>
#include <cstdio>
#include <cstring>

#define maxn 5000+10

struct point
{
int x,y;
};

struct Line
{
point a,b;
};

int n;
int ans[maxn];
int cnt[maxn];
Line line[maxn];
using namespace std;

int cross(point p0,point p1,point p2)
{
return  (p0.x-p2.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p0.y-p2.y);
}

void search(point toy)
{
for(int i=0;i<=n;i++)
{
if(cross(toy,line[i].a,line[i].b)>0 && cross(toy,line[i+1].a,line[i+1].b)<0)
ans[i]++;
}
}

int main()
{
int m,x1,y1,x2,y2;
int u,l,xj,yj;
point toy;
while(scanf("%d",&n) && n!=0)
{
memset(ans,0,sizeof(ans));
memset(cnt,0,sizeof(cnt));
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
line[0].a.x=x1; line[0].a.y=y1;   //将矩形的两高视为隔板
line[0].b.x=x1;line[0].b.y=y2;
line[n+1].a.x=x2; line[n+1].a.y=y1;
line[n+1].b.x=x2; line[n+1].b.y=y2;

for(int i=1;i<=n;i++)
{
scanf("%d%d",&u,&l);
line[i].a.x=u;
line[i].a.y=y1;
line[i].b.x=l;
line[i].b.y=y2;
}

for(int i=0;i<m;i++)
{
scanf("%d%d",&xj,&yj);
toy.x=xj;
toy.y=yj;
search(toy);
}
for(int i=0;i<=n;i++)
printf("%d: %d\n",i,ans[i]);
cout<<endl;
}
}

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>

#define maxn 5000+10

typedef struct Point
{
int x,y;
}point;

typedef struct Line
{
point a,b;
}Line;

int ans[maxn];
int n;
Line line[maxn];

using namespace std;

int cross(point p0, point p1, point p2) //p0,p1是线段，p2是待判断的点
{
return (p2.x - p0.x)*(p1.y - p0.y)-(p1.x - p0.x)*(p2.y - p0.y);
}

void binsearch(point toy)   //搜索并利用叉积进行判断
{
int l,r,mid;
l=0;
r=n-1;
while(l<r)
{
mid=(r+l)/2;
if(cross(line[mid].b,line[mid].a,toy)<0)
r=mid;
else
l=mid+1;
}
if(cross(line[l].b,line[l].a,toy)<0)
ans[l]++;
else
ans[l+1]++;
}

int main()
{
point toy;
int m,x1,y1,x2,y2;
int u,l;
int xj,yj;
while(scanf("%d",&n) && n!=0)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
{
scanf("%d%d",&u,&l);
line[i].a.x=u;
line[i].a.y=y1;
line[i].b.x=l;
line[i].b.y=y2;
}

for(int i=0;i<m;i++)
{
scanf("%d%d",&xj,&yj);
point toy;
toy.x=xj;
toy.y=yj;
binsearch(toy);
}

for(int i=0;i<=n;i++)
printf("%d: %d\n",i,ans[i]);
cout<<endl;
}
}

• 本文已收录于以下专栏：

## 利用叉积判断点和线的关系

• theArcticOcean
• 2016年01月10日 15:13
• 1376

## POJ1106->叉积判断点在直线的左右

POJ1106->叉积判断点在直线的左右题意： 给定平面上一些点的坐标，有一个半径固定，圆心固定且可以旋转的半圆形平面，求这个平面能覆盖到的最大点的数量。 题解： 由于圆心半径一定，所以有效的...
• SelinaFelton
• 2016年08月27日 23:33
• 451

## 判断一个点与直线的位置

• u010547283
• 2014年10月17日 18:00
• 994

## 点与线段的位置关系-算法

• H_OO_H
• 2014年11月12日 15:55
• 1252

## poj 2318 TOYS(叉积判断点是否在四边形内)

• u014552756
• 2016年02月16日 09:04
• 341

## poj2318(叉积判断点的位置+二分查找)

• u013509299
• 2014年03月09日 23:20
• 682

## 判断一个点与直线的相对位置

• qq_35392050
• 2017年05月03日 19:34
• 179

## Poj2318使用叉积判断点和线段的位置关系

• qq_23703403
• 2016年02月01日 22:16
• 68

## 如何判断直线之间和直线与平面之间的关系

• myfather103
• 2017年03月03日 14:19
• 765

## 叉积判断点在多边形内外 & poj2318

• theArcticOcean
• 2015年09月21日 21:02
• 939

举报原因： 您举报文章：POJ2318 叉积判断点与直线的关系 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)