# 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;
}
} 

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

## POJ 2318 || TOYS (叉积判断左右位置进行折半查找

• FXXKI
• 2015-03-23 23:42
• 277

## POJ2318->叉积判断点在线段的左右

POJ2318->计算几何题意： 已知n条线段把一个区域分成了n+1部分，给出一些点的坐标，求每个小区域中有多少个点。 题解： 利用叉积，线段两个端点为p1p2，记玩具坐标为p0，那么如果(p...

## POJ 2318 TOYS 计算几何（点与直线关系）

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10668   Accepted...

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

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

## POJ 2318 TOYS（叉积+二分）

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)