首页 > 其他分享 >向量点乘判断点是否在线段上

向量点乘判断点是否在线段上

时间:2023-11-04 17:22:21浏览次数:29  
标签:判断 线段 float pb pa ab Vector2 向量

几种要考虑的情况

1) 点p和线段断点a, b重叠,pa•ab=pa.x*pa.y+ab.x*ab.y=0

2) pa, pb共线,则pa×pb=0

2-1) p在线段ab上,此时pa, pb的夹角为180度,cos(180)=-1,pa•ab=-|pa|*|ab|

2-2) p在线段ab外,此时pa, pb的夹角为0度,cos(0)=1,pa•ab=|pa|*|ab|

4) pa, pb不共线,cos(钝角)<0, cos(直角)=0, cos(锐角)>0

  

 

可以看到1)和4)中的直角,点乘结果都是0,所以1)我们得单独判断,否则无法区分

 

 

//点是否在线段上
public static bool IsPointOnSegment2(Vector2 p, Vector2 a, Vector2 b)
{
    //点和线段端点重合时
    var pa = a - p;
    float paSqrLen = pa.sqrMagnitude;
    if (Mathf.Approximately(paSqrLen, 0))
        return true;

    var pb = b - p;
    float pbSqrLen = pb.sqrMagnitude;
    if (Mathf.Approximately(pbSqrLen, 0))
        return true;

    float dot = Vector2.Dot(pa, pb);
    float dotSqr = dot * dot;
    if (Mathf.Approximately(dotSqr, -(paSqrLen * pbSqrLen))) //p在线段上, pa和pb的夹角为180度, cos(180)=-1
        return true;

    //pa和pb的夹角为0度, 钝角, 90度, 锐角点情况
    return false;
}

 

参考

【数学基础】玩法常用几何计算汇总 - 知乎 (zhihu.com),是否可以用点乘来判断的思考

 

标签:判断,线段,float,pb,pa,ab,Vector2,向量
From: https://www.cnblogs.com/sailJs/p/17809543.html

相关文章

  • 【数值分析】向量和矩阵的范数
    向量范数一范数:\(||x||_1=|x_1|+|x_2|+\dots+|x_n|\)二范数:\(||x||_2=\sqrt{|x_1|^2+|x_2|^2+\dots+|x_n|^2}\)p范数:\(||x||_p=\sqrt[p]{|x_1|^p+|x_2|^p+\dots+|x_n|^p},\quadp\in[1,\infty)\)\(\infty\)范数:\(||x||_p=\max......
  • 点到线段的距离2
    几种要考虑的情况1)点和线段两端重叠的情况2)点在线段两侧的情况  p在另一侧的情况以此类推3)点在线段中间的情况   //点到线段的距离publicstaticfloatPointToSegmentDistance2(Vector2p,Vector2a,Vector2b){//点和线段端点重合varap=p......
  • 【风电预测】基于阿基米德算法优化最小二乘支持向量机AOA-lssvm实现数风电预测附matla
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 【lssvm回归预测】基于天鹰算法优化最小二乘支持向量机AO-lssvm实现数据回归预测附mat
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 树状数组用线段树来写
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=5e5+10;inta[N],tag[N<<2];struct{ struct{ intl,r,sum; }tr[N<<2]; voidpush_up(inti){ tr[i].sum=tr[i<<1].sum+tr[i<<1|1].sum; } voidbuild(inti......
  • C# 判断时间是否在指定时间段内,判断班别时间
    protectedboolgetTimeSpan(stringtimeStr){//判断当前时间是否在工作时间段内string_strWorkingDayAM="07:00";string_strWorkingDayPM="19:00";TimeSpandspWorkingDayAM=DateTime.Parse(_strWorkingDayAM).TimeOfDay;TimeSpands......
  • java判断按键是否按下
    Java判断按键是否按下的实现1.简介在Java中,可以使用java.awt.event.KeyEvent类来判断按键是否按下。本文将为刚入行的小白介绍如何实现Java判断按键是否按下的方法。2.实现步骤以下是实现Java判断按键是否按下的步骤:步骤 描述步骤1 创建一个KeyListener对象步骤2 实现KeyList......
  • 816. 模糊坐标(来判断一个数是否是一个合法数字)
     对于一个整数来说其为一个合法数字前提是没有前导0对于一个小数可以分解一下其整数部分和小数部分,整数部分和上条一致,小数部分末尾不能为0 对于本题:我们可以先枚举逗号的位置,在对于左右两边枚举小数点的位置然后将两边拼起来就行。 deffindSplit(s:str)->List[st......
  • Mysql判断表是否存在的思路
    $checkTableExist="SELECTTABLE_NAMEas'table_name'FROMINFORMATION_SCHEMA.TABLESWHERETABLE_SCHEMA='数据库名称'andTABLE_NAMElike'%这里写自己的表名%'";//上面的写法是模糊查询,也可以写成=$tables=Db::query($checkTableExist);$tableDat......
  • 如何判断我计算的圆周率pi是否准确?
    内容来自DOChttps://q.houxu6.top/?s=如何判断我计算的圆周率pi是否准确?我正在尝试各种方法来编写一个程序,该程序按顺序给出圆周率的位数。我尝试了泰勒级数方法,但它被证明收敛速度极慢(当我过了一段时间将我的结果显示与在线值进行比较时)。无论如何,我正在尝试更好的算法。因......