[poj2318]TOYS(直线与点的位置关系)

本文介绍了一道计算几何入门题目,通过叉积来判断向量间的关系,包括顺时针、逆时针及共线情况。使用C++实现了一个具体的算法案例,通过叉积判断一系列点相对于已知线段的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题关键:计算几何入门题,通过叉积判断。

两个向量的关系:

P*Q>0,Q在P的逆时针方向;

P*Q<0,Q在P的顺时针方向;

P*Q==0,Q与P共线。

实际就是用右手定则判断的。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
struct point{
    int x,y;  
};
int n,m,x1,x2,y11,y2; 
struct Line{
    point a,b;
}A[5010];
double operator*(point p1,point p2){return p1.x*p2.y-p2.x*p1.y;}
point operator-(point A,point B){return {A.x-B.x,A.y-B.y};}
int pos[5010];
bool judge(point t,int mid){//叉积 
    point tt=A[mid].b-A[mid].a; 
    int ans=tt*(t-A[mid].a);
    return ans<=0;
}

int erfen(point xx){  
    int l=0,r=n;  
    while(l<r){
        int mid=(l+r)>>1;  
        if(judge(xx,mid))  r=mid;
        else l=mid+1; 
    }
    return r;
}

int main(){ 
    while(scanf("%d",&n)!=EOF&&n){  
        scanf("%d%d%d%d%d",&m,&x1,&y11,&x2,&y2);  
        for(int i=0;i<n;i++){
            int xd,xu;
            scanf("%d%d",&xu,&xd);
            A[i]={{xu,y11},{xd,y2}};
        }
        memset(pos,0,sizeof pos);
        for(int i=0;i<m;i++){
            int xx,yy;
            scanf("%d%d",&xx,&yy);
            point t={xx,yy};
            int ans=erfen(t);
            pos[ans]++;
        }
        for(int i=0;i<=n;i++){  
            printf("%d: %d\n",i,pos[i]); 
        }
        printf("\n");
    }  
    return 0;  
}  

 

转载于:https://www.cnblogs.com/elpsycongroo/p/8723586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值