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

本文介绍了如何使用叉积来确定一个点相对于直线或线段的位置,通过实例代码和POJ题目链接进行详细解释。

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

用叉积判断点在线的左侧还是右侧:

记住那句话,逆正顺负(因为参数的设置不同而不同)

9
3
-2
4

--------------------------------
Process exited with return value 0
Press any key to continue . . .

运行代码:

#include <iostream>  
#include <cstdio>  
#include <cstring>  
using namespace std;  
const int maxn=5e3+10;  
struct point {  
    int x,y;  
}; 
point p={6,2};
struct node{
    point p1,p2;
}edge[4];
int multi(point p0,point p1,point p2){  
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);  
}  
int m[4][4]={
1,3,2,1,
5,3,4,1,
7,3,7,1,
9,1,10,2  //特殊设置
};

int main(){
    for(int i=0;i<4;i++){
        edge[i].p1.x=m[i][0];
        edge[i].p1.y=m[i][1];
        edge[i].p2.x=m[i][2];
        edge[i].p2.y=m[i][3];
    }
    for(int i=0;i<4;i++)
    cout<<multi(edge[i].p1,edge[i].p2,p)<<endl;

    return 0;
}

当点在线段的上时,叉积是0而且点到两端点的而距离和等于线段的长度,如果大于就是在延长线上。当叉积是正数,逆时针方向,负数,顺时针方向。
这一切都和函数参数密切相关:
int multi(point p0,point p1,point p2){  
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);  
}
// ……
 cout<<multi(edge[i].p1,edge[i].p2,p)<<endl;

相关例题:

http://poj.org/problem?id=2318

代码参考:

http://blog.youkuaiyun.com/thearcticocean/article/details/48632391


有时需要我们求出线段相交的交点,曾经研究过: http://blog.youkuaiyun.com/thearcticocean/article/details/48765019

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值