您的位置:首页 > 其它

POJ 2318 TOYS (矩形内判断点与线段关系,水)

2014-04-07 21:06 399 查看
第一道计算几何的题,非常水。。

感觉计算几何的题里会用到各种结构体。。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

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

typedef struct Segment {
Point a, b;
}Segment;

typedef struct Vector {
int x, y;
}Vector;

const int maxn = 5050;

Segment seg[maxn];

int scnt, pcnt[maxn];

int n, m, x1, y1, x2, y2;

void addSeg(int x1, int y1, int x2, int y2)
{
Segment &cur = seg[scnt];
cur.a.x = x1;
cur.a.y = y1;
cur.b.x = x2;
cur.b.y = y2;
scnt++;
}

int product(Vector s1, Vector s2)
{
return s1.x * s2.y - s1.y * s2.x;
}

int check(int x, int y, int num)
{
Segment &cur = seg[num];
int x1 = cur.a.x, x2 = cur.b.x, y1 = cur.a.y, y2 = cur.b.y;
Vector v1, v2;
v1.x = x1 - x2;
v1.y = y1 - y2;
v2.x = x - x2;
v2.y = y - y2;
return product(v2, v1);
}

void addToy(int x, int y)
{
if(x < x1 || x > x2 || y > y1 || y < y2)
return;
int low = 0, high = scnt-1;
while(low < high) {
int mid  = (low + high) / 2;
if(check(x, y, mid) > 0) {
if(check(x, y, mid+1) < 0) {
pcnt[mid]++;
return;
}
else low = mid + 1;
}
else{
if(check(x, y, mid-1) > 0) {
pcnt[mid-1]++;
return;
}
else high = mid - 1;
}
}
}

int main()
{
bool first = true;

while(~scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2) && n) {
if(first) first = false;
else printf("\n");
scnt = 0;
addSeg(x1, y1, x1, y2);
memset(pcnt, 0, sizeof(pcnt));
for(int i = 0; i < n; i++) {
int p, q;
scanf("%d%d", &p, &q);
addSeg(p, y1, q, y2);
}
addSeg(x2, y1, x2, y2);
for(int i = 0; i < m; i++) {
int x, y;
scanf("%d%d", &x, &y);
addToy(x, y);
}
for(int i = 0; i <= n; i++)
printf("%d: %d\n", i, pcnt[i]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: