求空间中线段上到已知直线距离最近的点

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

这个其实是求线段到直线之间的最近距离,求出最近距离位置在线段上的点。
如下图所示,一条线段和一条直线的解的限定区域为[0, 1] ×[-∞, ∞]。假设直线为直线L_1 (s)=P_1+s(d_1 ) ⃗,则线段对应直线方程L_2(s)=P_2+t(d_2 ) ⃗中t的范围为[0, 1]。如果在线段所在的无限直线上的最接近点的参数小于0或者大于1,那么就必须在线段的一端取得最近的点,即为线段一端的端点。

直线与线段之间的距离

 

根据上面的分析,线段上到直线距离最近的点为:(源码)

Ogre::Vector3 getClosestPointOnSegment(const Ogre::Vector3& lineBase,const Ogre::Vector3& lineDirection, const Ogre::Vector3& segmentBase,const Ogre::Vector3& segmentEnd)
{
    Ogre::Vector3 segmentDirection = segmentEnd - segmentBase;
    Ogre::Vector3 u = lineBase - segmentBase;
    Ogre::Real a = lineDirection.dotProduct(lineDirection);
    Ogre::Real b = lineDirection.dotProduct(segmentDirection);
    Ogre::Real c =segmentDirection.dotProduct(segmentDirection);
    Ogre::Real d = lineDirection.dotProduct(u);
    Ogre::Real e = segmentDirection.dotProduct(u);
    Ogre::Real det = a*c - b*b;
    Ogre::Real tDenom = det;

    Ogre::Real tNum;
    // check for (near) parallelism
    if (det < FLT_EPSILON)
    {
        // choose base point of the segmentif its direction is same direction of line
        if(segmentDirection.directionEquals(lineDirection,Ogre::Radian(Ogre::Math::PI/10))) 
        {
             returnsegmentBase;
        }
        else
       {
            returnsegmentEnd;
        }
    }
    else
    {
         // Find parameter values ofclosest points on each segment's infinite line.
        // Denominator assumed at this pointto be "det", which is always positive.
        tNum = a*e - b*d;
    }

    // check value of numerators to see if we're outside the[0,1],[0,1] domain
    if (tNum < 0)
    {
        return segmentBase; // t = 0;
    }
    else if (tNum > tDenom)
    {
         return (segmentBase +segmentDirection); //t = 1; because tNum = tDenom
    }
    else
    {
        // parameters of nearest points onrestricted domain
        return (segmentBase + tNum/tDenom *segmentDirection); // t = tNum / tDenom;
    }
}

其中当t小于0时,取t的值为0;当t大于1时,取t的值为1. 其中t为0时是线段的起始点,t为1时为线段的终止点。

参考《计算机图形学几何工具算法详解》

空间中任意两个直线段的最短距离,matlab实现 空间直线段最短距离计算公式: 直线段最短距离公式: %空间中任意两条直线之间的最短距离,p1p2是直线段p的两个端坐标,q1q2是直线段q的两个端坐标 function [d]=distance(p1,p2,q1,q2) s1=p2-p1;%方向向量 s2=q2-q1; res1=((s1*s2')*((p1-q1)*s2')-(s2*s2')*((p1-q1)*s1'))/((s1*s... 阅读详情

相关推荐

两条空间直线最近距离,以及他们最近距离线的两坐标

设有两空间线段 Ls,其起、终坐标为s0、s1,方向向量u⃗ =s1−s0 Lt,其起、终坐标为t0、t1,方向向量v⃗ =t1−t0 记两线段对应的直线为ls、lt,采用向量表示法如下: ls=s0+cs⋅u⃗ lt=t0+ct⋅v⃗ 当0≤cs、ct≤1时,上述两式表达 设最短距离分别为sj、tj,则有 sj=s0+sc⋅u⃗ tj=t0+sc⋅v⃗ 其...

liangsongjun的专栏 8086

线段_线段线段的最短距离,matlab代码

线段_线段线段的最短距离,matlab代码。自编的function,便于嵌入使用

计算空间中两线段之间的距离

最近在建立气凝胶的有限元模型中需要计算每两根纤维之间的距离,最初参考的两篇文章确实提供了一些数值方法的计算思路(文章1 && 文章2),但忽略了理论推导,导致在用参数 ttt 描述两线段的地方出现了一些错误!两篇文章都不能很好的准确表示两直线段。 ...

qq_45097594的博客 8530

空间两条直线的最短距离最近计算

直线的信息可以以两个端的形式给出,也可以以一个直线上的直线的方向向量给出。本文中假设这两条直线不共线,即这两条直线既不重合也不相交。 1.如果这两条直线是以两个端的形式给出,那么假设直线l0的两端为:P0、P1;直线l1的两端为Q0、Q1,;直线的最短距离直线l0我们可以用方程表示为:         (1) 直线段l1我们也可以用方程表示为:            

Hunter_pcx的博客 2万+

【千题案例】TypeScript获取两之间的距离 | 中 | 补 | 向量 | 角度

我们在编写一些瞄准、绘制、擦除等功能函数时,经常会遇到计算两之间的一些参数,那本篇文章就来讲一下两之间的一系列参数计算。

看世界,也找自己 2330

已知线段给定距离的另一坐标

已知线段给定距离的另一坐标

1845

线段的垂足

第一种: 设直线方程为ax+by+c=0,坐标为(m,n)     则垂足为((b*b*m-a*b*n-a*c)/(a*a+b*b),(a*a*n-a*b*m-b*c)/(a*a+b*b)) 第二种:计算线段最近 如果该线段平行于X轴(Y轴),则过point作该线段所在直线的垂线,垂足很容 易得,然后计算出垂足,如果垂足在线段上则返回垂足,否则返回离垂足近的端 ; 如果该线段不平行...

Devil不加V 2297

已知一条线段的两端A(x1,y1),B(x2,y2)及线段外的任意一P(px,py),设计一个程序找出线段距离p最近

#include&lt;stdio.h&gt; typedef struct { float x; float y; }Point; typedef struct { Point p1; Point p2; }Line_segment; void initLine (Line_segment &amp;L) { Point p; if(L.p1.x&gt;L.p2.x) { ...

qq_34752068的博客 4503

三维空间两条直线的最短距离最近及C++算法实现

在双目视觉立体空间重建中,会根据两个相机中的物体图像坐标,取给定坐标系的三维坐标。根据物体图像坐标、相机内参、给定坐标系的相机外参,取相机光轴线的方程,从而实现立体重建,本文主要是解决在已知三维空间两条直线其最短距离最近及算法实现。

momo0637的博客 1万+

三维空间直线/线段最短距离线段计算算法

三维空间直线距离计算

CCの技术宅 3万+

Unity3D C#数学系列之直线距离

1 引言 之前写的博客里面有好多坑没有填,以后慢慢填吧。 最近想到可以总结和数学相关的东西,自己觉得挺有意思的。目前想到的可以总结有: 空间中一到两所在直线距离 两条直线(各给出)的交 已知一个圆,并给出圆上一在圆上的切线 所在平面的法线方向 判断一是否在圆弧范围内 判断一是否在矩形内部 判断一是否在长方体、球体、圆柱体内部 网格绘制长方体、球体、胶囊体 这里,我们先看看"空间中一到两所在直线距离" 2 分析 ...

老王的博客 4338

空间两条直线之间的距离

1. 前言最近老板让写一段空间匹配的代码, 其中涉及到空间直线之间的距离,写起来满费劲的, 这里做一个记录。2. 处理思路空间直线之间的位置关系主要可以分为: 重合, 平行, 相交, 异面。2.1 异面情形(含相交): 已知空间中两线段,如果它们无限变粗,判断是否相交。(主要讨论不在同一平面的情况)线段AB 线段CD 问题的关键是出这两条任意直线之间的最短距离,以及在这个距离上的

zhyh1435589631的专栏 3万+

三维空间碰撞问题;空间中两直线的最短距离最近

已知空间中两线段,如果它们无限变粗,判断是否相交。(主要讨论不在同一平面的情况) 线段AB 线段CD 问题的关键是出这两条任意直线之间的最短距离,以及在这个距离上的两线最接近坐标,判断该是否在线段AB和线段CD上。 首先将直线方程化为对称式,得到其方向向量n1=(a1,b1,c1),n2=(a2,b2,c2). 再将两向量叉乘得到其公垂向量N=(x,y,z),在两直线

qq_18343569的博客 3279

PCL 空间中两条直线,如何计算最近的两个距离

无限直线最近 + 边界裁剪(clamp)

weixin_39354845的博客 282

高效率到曲线的最近距离和到曲线上的最近(C++)

此时,我们若p到其中一个向量的垂足h,起始指向垂足h也可以是个向量,此时我们将这个向量的模与线段向量的模的比值限制在[0, 1]之间,也就是让最近线段之间。p到线段距离就简单了,就先直线距离,再判断垂足是否在端之间,若在,则距离p到直线距离,若否,则为p到端间更近的那个距离。那再垂足矩阵就很容易了,就是起始矩阵+线段向量矩阵×t矩阵。曲线的离散表示形式是的坐标的顺序集合,因此我们到曲线的最近距离就变成了线段集的最近距离

qq_45189101的博客 868

如何计算线段最近距离

原地址:https://blog.csdn.net/happy__888/article/details/526154在二维/三维图形学系统当中,线段的拾取是一个经常使用的功能如何根据鼠标来判断线段是否被选择了,最主要的方法之一是通过线段的最小距离来判定的无论二维还是三维情况下,使用直线距离公式似乎是最直接的选择但是不要忘记直线公式计算的是直线之间的关系,而不是线段之间的关...

晴树的专栏 6531

Python空间中两条直线距离及各自最近

已知空间中有两条异面直线,它们各自必有一个距离另一条直线最近,并且最近的连接也分别垂直这两条直线

木盏 760
上一篇: 空间中直线之间距离介绍及原码
下一篇: 根据输入的字符串,判断并输出有效的字符串的长度,和该字符串。vc++
我叫刘鹏
博客等级 码龄19年 5粉丝 23原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值