首页 > 其他分享 >点到线段的距离2

点到线段的距离2

时间:2023-11-03 22:56:05浏览次数:40  
标签:ab 线段 距离 ap var 点到 Vector2

几种要考虑的情况

1) 点和线段两端重叠的情况

2) 点在线段两侧的情况

  

p在另一侧的情况以此类推

3) 点在线段中间的情况

  

 

//点到线段的距离
public static float PointToSegmentDistance2(Vector2 p, Vector2 a, Vector2 b)
{
    //点和线段端点重合
    var ap = p - a;
    if (Mathf.Approximately(ap.sqrMagnitude, 0)) //float.Epsilon
        return 0;

    var bp = p - b;
    if (Mathf.Approximately(bp.sqrMagnitude, 0))
        return 0;

    //点在线段两端
    var ab = b - a;
    if (Vector2.Dot(ap, ab) <= 0) //夹角在[90, 180]时, 距离为ap的长度
        return ap.magnitude;

    var ba = -ab;
    if (Vector2.Dot(ba, bp) <= 0) //夹角在[90, 180]时, 距离为bp的长度
        return bp.magnitude;

    //点在线段中间, 先用叉乘求出三角形面积, s*2=|ap×ab|
    float s2 = ap.x * ab.y - ap.y * ab.x;

    //再根据s*2=底*高, 求出高
    float result = s2 / ab.magnitude;
    return result;
}

 

标签:ab,线段,距离,ap,var,点到,Vector2
From: https://www.cnblogs.com/sailJs/p/17807476.html

相关文章

  • 树状数组用线段树来写
    #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......
  • 倒计时丨距离RestCloud新品发布仅有6天!
    6天倒计时,RestCloud零代码集成自动化平台重磅发布⏰11月9日14:00,期待您的参与!点击报名:http://c.nxw.so/dfaJ9......
  • PCB设计安规丨电气间隙与爬电距离要点
    在PCB设计中,爬电距离和电气间隙是两个非常重要的安规要求。它们都涉及到PCB上元件之间的安全距离,以确保在元件故障时,不会发生短路或其他安全问题。爬电距离是指两个连接的元件之间的距离,通常是通过在两个元件之间的连接线之间添加足够的空间来实现的。电气间隙是指在PCB板上元件......
  • 点到直线距离
    直线方程的一般式:ax+by+c=0点p(x1,y1)到直线的距离:  //点到直线的距离(一般式表示直线)publicstaticfloatPointToLineDistance(Vector2point,floata,floatb,floatc){//直线一般式:ax+by+c=0//点到直线的距离公式:|ax+by+c|/sqrt(a^2+b^2)f......
  • F. Unique Occurrences(线段树分治+可撤销并查集)
    F.UniqueOccurrences假如我们删除所有权值为x的边,那么所有权值为x的边对答案的贡献就是\(\sumsz[u]*sz[v]\)sz表示两个联通块的大小,且(u,v)的边权为x我们可以用可撤销并查集来进行处理,简单来说就是将一条边的存在时间看作区间,然后挂到线段树上,然后遍历到每个叶子的时候进行......
  • Opencascad(C++)-建模-创建有界直线段
    文章目录1、前言2、用gp_Lin创建一条直线2.1gp_Lin类成员函数2.2创建一条直线2.3运行结果3、创建一条有界的直线段3.1功能说明3.2函数说明3.2创建直线段的代码3.3测试效果1、前言在Opencascad开发时,经常会遇到创建直线的情况,采用gp_Line创建的直线段是无界的,如果想创建......
  • 线段树二分
    修改操作可以很简单的在线段树上打标记即可。常规做法直接二分R然后区间查询gcd,复杂度是仨log。upded:其实也是俩log,线段树查询区间gcd是单log。注意到你会将区间拆分成log个子区间,直接查询他们的gcd即可,直接查询为什么不会多乘个log呢。注意到对两个数\(x,y\)做......
  • 音乐智能体登场!我和杰伦的距离或许只差一个 MusicAgent!
    作者|付奶茶、ZenMoore利用AI完成音乐处理是一个多样化的领域,涵盖了数十种任务,从生成(例如音色合成)到音乐理解(例如音乐分类)。对于初学者、业余爱好者来说,很难精通、掌握所有任务来满足对于音乐处理上的需求。受到大型语言模型(LLMs)在任务自动化方面上的启发,北京大学和微软亚洲研究......
  • 可持久化线段树学习笔记
    可持久化线段树前置知识:动态开点线段树基本介绍可持久化线段树可以维护多个版本信息。举个例子:你需要维护这样的一个长度为\(N\(1\len\le10^6)\)的数组,支持如下几种操作在某个历史版本上修改某一个位置上的值访问某个历史版本上的某一位置的值每次操作后生成一......
  • 第 116 场双周赛(双指针,背包问题,线段树+lz标记)
     本题为双指针和贪心。当我们遇到奇数个0或1时,直接将下一位改变即可。classSolution{public:intminChanges(strings){intn=s.size();intres=0;intl=0,r=-1;while(r++<n-1){if(s[l]==s[r])......