快速计算两个直线的交点(可转换用于3d空间)

本文详细阐述了矢量计算在直线交点计算中的应用,包括算法实现与数学原理,适用于二维空间直线交点求解。

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

这里的方案使用矢量计算为基础的计算

原理图如下:


算法as3实现如下:

 //

/* *
            计算两条直线的 交点
            
            @param            lnV 直线A的法线,直线A的方程为: lnV.dot( tpv ) = ld
            @param            ld 直线A的参数距离
            @param            pAV 在直线B上的一点 pAV
            @param            pBV 在直线B上的一点 pBV
@param outV 为计算后得到的交点

*/
        public function calc2LineIntersectionV(lnV:Vector_2D, ld:Number, pAV:Vector_2D, pBV:Vector_2D,outV:Vector_2D):void{
            //
            var dis:Number = lnV.dot( pAV ) - ld;
            //
            var td:Number = lnV.dot( pBV ) - ld;
            //
            var k:Number = dis / (dis - td);
            //
            outV.x = pBV.x - pAV.x;
            outV.y = pBV.y - pAV.y;
            outV.mult( k );
            outV.x += pAV.x;
            outV.y += pAV.y;
        }
//


如上所示:

计算过pA与pB亮点的直线 A ,与 L (直线B)的交点。已知直线L的法向 lnV(单位矢量) 和 方程参数 ld,则直线L上任意点(tV)满足方程lnV.dot(tV ) = ld。

这里所说的点与法线等都用矢量表示。

关于Vector_2D: http://www.cnblogs.com/vilyLei/articles/1567703.html 

由以上方程可得: 

dis = lnV.dot( pA ) - ld,  dis(标量)的大小就是上图所示的较长的绿色线段的长度。

 

td = lnV.dot( pB ) - ld,  td(标量)的大小就是上图所示的较短的绿色线段的长度。

从上图可见:

dis 与 (dis - td) 的比例等于线段pA pV(交点)和线段pA pB的比例。

因此,  

outV.x = pBV.x - pAV.x;
outV.y = pBV.y - pAV.y;

计算出了:  线段pA pB 的矢量表示

又知道比例 k

所以就计算出了 线段pA pV(交点) 

代码为:  outV.mult( k );

根据矢量计算的法则,

通过:

 outV.x += pAV.x;

 outV.y += pAV.y;

就计算出了交点 outV。

次计算方式仅仅利用了基本的算术运算,计算过程没有新的对象产生,所以效能不低。将此方法简单扩展后,就可以用于计算过3d空间的两个点的直线,和给定法线与d值得平面相交的焦点了。

flash 演示:http://vilylei.purpgame.com/test/2d/test.html

转载于:https://www.cnblogs.com/vilyLei/articles/2191514.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值