[canvas] 碰撞

碰撞检测的方法

判断物体与物体之间是否有重叠,这里使用物体的外接矩形边界来确定。

判断物体与物体之间的距离,当距离小于某个值时,满足碰撞条件,物体产生碰撞效果。

771172-20161223170042995-378034224.png

771172-20161223170055557-1723756155.png

771172-20161223170106370-948726073.png

光线投射法

画一条与物体速度向量相重合的线,
然后再从待检测物体出发,绘制第二条线,根据两条线的交点位置来判定是否发生碰撞。

771172-20161223170125386-313423544.png

#1是与小球速度向量相重合的线,
#2线是从待测物体触发绘制的第二条线。
在小球的飞行过程中,程序不断地擦出并重回从小球到1,2号交点处的连线。

771172-20161223170140761-2034135816.png

771172-20161223170150354-1016399410.png

771172-20161223170159745-773107989.png

771172-20161223170207370-511362262.png

小球落入桶中的条件:
1号线与2号线的交点在同口的左边沿与右边沿之间。
小球位于2号线下方。

斜截式

y = kx + b

k表示斜率, 
b表示与y轴的截距,也就是直线与y轴交点的纵坐标。

寻找两条直线的交点,
就是寻找同时满足两条直线方程的点,
我们假设这个点为(X0, Y0),
两条直线方程分别为 y = (k1)X + b1, y = (k2)X + b2

交点就是同时满足的点,那么就有:

(k1)X0 + b1 = (k2)X0 + b2
X0(k1 - k2) = b2 - b1
 
X0 = (b2 - b1)/(k1 - k2)
Y0 = (k1b2 - k2b1)/(k1 - k2)

该方法也有弊端,当小球做水平运动或是垂直运动时,
其斜率为0或是无穷,这时用该方法就不适用了。


catchBall = {
    intersectionPoint: {x:0, y:0},
    
    isBallInBucket: function () {
        if(lastBallPosition.left === ball.left ||
           lastBallPosition.top === ball.top){
            return;
        }
        
        //(x1, y1) = Last ball position
        //(x2, y2) = Current ball position
        //(x3, y3) = Bucket left
        //(x4, y4) = Bucket right
        
        var x1 = lastBallPosition.left,
            y1 = lastBallPosition.top,
            x2 = ball.left,
            y2 = ball.top,
            x3 = bucket_left + bucket_width/4,
            y3 = bucket_top,
            x4 = bucket_left + bucket_width,
            y4 = y3;
        
        //(x1, y1)到(x2, y2)的斜率
        var k1 = (ball.top - lastBallPosition.top)/(ball.left - lastBallPosition.left);
        
        //(x3, y3)到(x4, y4)的斜率
        var k2 = (y4 - y3) / (x4 - x3);
        
        //截距b1
        var b1 = y1 - k1*x1;
        
        //截距b2
        var b2 = y3 - k2*x3;
        
        this.intersectionPoint.x = (b2 - b1) / (k1 - k2);
        this.intersectionPoint.y = k1 * this.intersectionPoint.x + b1;
        
        return intersectionPoint.x > x3 &&
               intersectionPoint.x < x4 &&
               ball.top + ball.height > y3 &&
               ball.left + ball.width < x4;
        
    }
}

分离轴定理(SAT)

分离轴定理只适用于凸多边形,也就是所有内角均小于180度的多边形。
比如矩形,三角形等。
而如果有一个内角大于180度,就如吃豆人的形状,就不适合使用该定理。

把受测的两个物体置于一睹墙前面,然后用光线照射它们,
根据阴影部分是否香蕉来判断二者有没有相撞。

碰到了

771172-20161223170226011-544806962.png

没碰到

771172-20161223170237323-4928346.png

转载于:https://www.cnblogs.com/qingmingsang/articles/6215441.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值