Cocos Creator - Intersection类

Cocos Creator 提供的 Intersection 类用于检测形状之间的相交情况,如线段、矩形、多边形和圆形的相交。本文详细介绍了 lineLine 方法,探讨了线性代数在判断两线段相交中的应用,并预告将逐步分析源码。

Cocos Creator辅助类Intersection

Intersection类

Intersection类是cocos creator提供的辅助类,用于测试形状与形状是否相交。其中包含:

  • lineLine 测试线段与线段是否相交
  • lineRect 测试线段与矩形是否相交
  • linePolygon 测试线段与多边形是否相交
  • rectRect 测试矩形与矩形是否相交
  • rectPolygon 测试矩形与多边形是否相交
  • polygonPolygon 测试多边形与多边形是否相交
  • circleCircle 测试圆形与圆形是否相交
  • polygonCircle 测试矩形与圆形是否相交
  • pointInPolygon 测试一个点是否在一个多边形中
  • pointLineDistance 计算点到直线的距离。## 新的改变

「本文将会持续更新,逐个分析源码,如果博主看得懂的话 ?」

lineLine

先给出lineLine函数的源代码:

function lineLine ( a1, a2, b1, b2 ) {
    // jshint camelcase:false

    var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);
    var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);
    var u_b  = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);

    if ( u_b !== 0 ) {
        var ua = ua_t / u_b;
        var ub = ub_t / u_b;

        if ( 0 <= ua && ua <= 1 && 0 <= ub && ub <= 1 ) {
            return true;
        }
    }

    return false;
}

这里用到了一些线性代数的知识。给定两个直线y = k1 * x + b1y=k2 * x + b2,排除特殊情况,我们假设两个直线的交点为(x1,y1)。那么我们可以得到如下方程:

y1 = k1 * x1 + b1
y1 = k2 * x1 + b2

根据矩阵的方法,我们可以利用行列式的方法求解。其中y1和x1是未知数,我们可以将其写成矩阵形式「csdn写矩阵的形式我在研究研究…」

y1 - k1 * x1 = b1
y1 - k2 * x1 = b2
1, -k1      y1        b1
          *         = 
1, -k2      x1        b2

联想矩阵的形式,感受下。回想线性代数的知识,解法等我研究好csdn写法再补上。可以参考维基百科Line-line Intersection词条。这里我们就可以理解为什么源代码中给出上面的一串加减乘除就可以判断两个直线是否相交了。
u_b判断两个直线是否平行,避免除以0的情况。

「文章持续更新…」

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值