Cocos Creator - Intersection类

Cocos Creator辅助类Intersection

  • Intersection类
    • lineLine

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的情况。

「文章持续更新…」

你可能感兴趣的:(Cocos,Creator,JavaScript)