题意:给出矩形的左上和右下的坐标,在矩形中有n个木棒,木棒之间不会相交,然后给出木棒上下端点的横坐标,这些木棒将矩形分成多个区域,接着有m个玩具,给出玩具的坐标。输出在每个区域中玩具的个数。
思路:叉积判断点是否在四边形区域内。
向量的叉积:
向量的叉积性质可以用来判断点在直线的某侧。进而可以解决点是否在三角形内,两个矩形是否重叠等问题。向量的叉积的模表示这两个向量围成的平行四边形的面积。
设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积;
即:P×Q = x1*y2 - x2*y1,其结果是一个伪矢量。
显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。
叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系: 若 P × Q > 0 , 则P在Q的顺时针方向。 若 P × Q < 0 , 则P在Q的逆时针方向。 若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
叉积的方向与进行叉积的两个向量都垂直,所以叉积向量即为这两个向量构成平面的法向量。
如果向量叉积为零向量,那么这两个向量是平行关系。因为向量叉积是这两个向量平面的法向量,如果两个向量平行无法形成一个平面,其对应也没有平面法向量。所以,两个向量平行时,其向量叉积为零。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
struct point{
int x,y;
};
point ux[5010],dx[5010],dot[5010];
int sum[5010];
int n,m,x1,x2,y1,y2;
int judge(point DOT,point A,point B){
//返回两个2D向量的2D叉积(即3D叉积的第三维,前两维为零)
//就是两个向量构成的平行四边形的面积大小(绝对值)
//利用该值的正负可以判断两个向量的顺逆时针相对位置
//这两个向量为DOT->A和DOT->B;
//坐标分别为(A.x-DOT.x,A.y-DOT.y)和(B.x-DOT.x,B.y-DOT.y);
//pxq=x1*y2-y1*x2;叉乘公式(2D)
return (A.x-DOT.x)*(B.y-DOT.y)-(A.y-DOT.y)*(B.x-DOT.x);
}
void find(point DOT){
int l=0,r=n+1;
int mid;
int ans=0;
while(l<=r){
mid=(l+r)>>1;
int temp=judge(DOT,ux[mid],dx[mid]);
if(temp<0){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
sum[ans-1]++;
}
int main(){
while(cin>>n&&n){
cin>>m>>x1>>y1>>x2>>y2;
for(int i=1;i<=n;i++){
cin>>ux[i].x>>dx[i].x;
ux[i].y=y1;
dx[i].y=y2;
}
ux[0].x=x1;
ux[0].y=y1;
dx[0].x=x1;
dx[0].y=y2;
ux[n+1].x=x2;
ux[n+1].y=y1;
dx[n+1].x=x2;
dx[n+1].y=y2;
for(int i=1;i<=m;i++){
cin>>dot[i].x>>dot[i].y;
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=m;i++){
find(dot[i]);
}
for(int i=0;i<=n;i++){
cout<<i<<": "<<sum[i]<<endl;
}
cout<<endl;
}
return 0;
}
// /\ | / |**、
// / \ | / | \
// / \ |/ | / _____ ____ | /
// /------\ |\ |__/ / \ \ /\ / / \ | /
// / \ | \ | / \ \ / \ / /______\ |/
// / \ | \ | \ / \ / \ / \ |
// / \ | \ | \_____/ \/ \/ \_____ |
/**
* ┏┓ ┏┓
* ┏┛┗━━━━━━━┛┗━━━┓
* ┃ ┃
* ┃ ━ ┃
* ┃ > < ┃
* ┃ ┃
* ┃... ⌒ ... ┃
* ┃ ┃
* ┗━┓ ┏━┛
* ┃ ┃ Code is far away from bug with the animal protecting
* ┃ ┃ 神兽保佑,代码无bug
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*/
// warm heart, wagging tail,and a smile just for you!
//
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// .' \| |// `.
// / \||| : |||// \
// / _||||| -:- |||||- \
// | | \\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//