这里的方案使用矢量计算为基础的计算
原理图如下:
算法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(标量)的大小就是上图所示的较长的绿色线段的长度。
从上图可见:
dis 与 (dis - td) 的比例等于线段pA pV(交点)和线段pA pB的比例。
因此,
outV.y = pBV.y - pAV.y;
计算出了: 线段pA pB 的矢量表示
又知道比例 k
所以就计算出了 线段pA pV(交点)
代码为: outV.mult( k );
根据矢量计算的法则,
通过:
outV.x += pAV.x;
就计算出了交点 outV。
次计算方式仅仅利用了基本的算术运算,计算过程没有新的对象产生,所以效能不低。将此方法简单扩展后,就可以用于计算过3d空间的两个点的直线,和给定法线与d值得平面相交的焦点了。
flash 演示:http://vilylei.purpgame.com/test/2d/test.html