如何判断一个点是否在直线上_求直线和平面的交点,并判断可见性[通俗易懂]

如何判断一个点是否在直线上_求直线和平面的交点,并判断可见性[通俗易懂]这个问题需要用到向量的叉积性质,下面先从百度截一些语句来介绍一下用向量的叉积来判断一个点是否在线段上百度百科传送门:http://baike.baidu.com/link?url=TEpSD0T

累加器传送门:

(计算几何)判断一个点是否在线段上

这个问题需要用到向量的叉积性质,下面先从百度截一些语句来介绍一下


用向量的叉积来判断一个点是否在线段上

百度百科传送门:http://baike.baidu.com/link?url=TEpSD0TEPEzQhiRj1NhV1xQo6DojftoJaSyHFszURLK0y3rIkk972lKgssE-WdWYoDUzA5s9K6KNJzgfx315dlx8R1DH78XATQHSJv1LT06aYQJ53dO19r0XGNiJDomu2sang5UaxHuKrUlGsoDzu_1vTgq_wlntBN67pazqcbG
向量积,数学中又称外积、叉积,物理中称矢积、叉乘,是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量和垂直。
计算是这样的,对于向量a(x1,y1),b(x2,y2)
他们的叉积a×b=x1y2-y1x2
叉积是一个向量,表示的是有向面积,方向可以用右手定则来判断,比如要用a×b,就要把a旋转到b,如果四指为旋转方向,拇指所指的方向就是叉积的方向
我们可以发现
这里写图片描述
如果向量AP×AB的叉积为正,则向量AP在向量AB的顺时针方向,反之为逆时针方向,当两个向量的乘积为0的时候,A,B,P三点共线

回到我们要干的事情,如果叉积为零,可以证明一个点在线段所在的直线上,那么怎么证明在线段上呢?只需要让该点位于线段在坐标系中围成的长方形中就行了,如图所示
这里写图片描述

所以大家知道该怎么判断了吧

然后上代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>

using namespace std;

const double eps=1e-10;
struct Point{
    double x,y;
}Q,P1,P2;

typedef Point P; 

P operator - (P a,P b){
    P p;
    p.x=a.x-b.x;
    p.y=a.y-b.y;
    return p;
}

double operator *(P a,P b){
    return a.x*b.y-b.x*a.y; 
}

int main(){
    scanf("%lf%lf%lf%lf%lf%lf",&Q.x,&Q.y,&P1.x,&P1.y,&P2.x,&P2.y);
    if(fabs((Q-P1)*(Q-P2))<eps){
        if(min(P1.x,P2.x)-eps<=Q.x&&Q.x-eps<=max(P1.x,P2.x)){
            if(min(P1.y,P2.y)-eps<=Q.y&&Q.y-eps<=max(P1.y,P2.y)){
                printf("YES\n");
                return 0;
            }
        }
    }
    printf("NO\n");
    return 0;
}

今天的文章如何判断一个点是否在直线上_求直线和平面的交点,并判断可见性[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65292.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注