zoukankan      html  css  js  c++  java
  • D5-Android绘图之让图形动起来

    以前在Html利用js控制SVG或canvas进行运动模拟。浏览器自带window.requestAnimationFrame能不断执行渲染
    在这使用我的LogicCanvas中的NumGo进行不断渲染工作,用法详见:
    绘图部分基于我的LogicCanvas绘图库:基础使用在此
    喜欢的话可以到项目的github上看看,顺便给个star
    如果此篇看起来有些困难,可以先看一下其他D系列文章,尤其是:D4-Android绘图之和我一起画箭头
    本篇将介绍:反弹、自由落体、平抛、斜抛的物理场景模拟


    一、反弹

    9414344-d9adf559efb88f19.gif
    效果.gif
    1.构造函数初始化时:核心就是:位移=时间*速度
    //创建一个水平速度向量对象,并赋值水平速度为100px/s,竖直速度50px/s
    mVA = v2(100, -50);
    //创建一个位移向量对象
    mSA = v2(0, 0);
    
    mRunNum = new NumGo(false, 0, 100000).setOnUpdate(new NumGo.OnUpdate() {
        @Override
        public void onUpdate(float rate) {
            long frameTime = System.currentTimeMillis();
            float detaT = frameTime - lastFrameTime;//时间变化量
            Pos detaS = mVA.dotC(detaT / 500);//位移增量=速度*时间变化量
            Pos detaSB = mVB.dotC(detaT / 500);//位移增量=速度*时间变化量
            mSA = mSA.add(detaS);//位移总量 = 位移增量和
            mSB = mSB.add(detaSB);//位移总量 = 位移增量和
            //区域限定
            if (mSA.x > 200 || mSA.x < -200) {
                mVA = mVA.refX();//x反弹
                mAColor = ColUtils.randomRGB();//随机色
            }
            if (mSA.y > 200 || mSA.y < -200) {
                mVA = mVA.refY();//Y反弹
                mAColor = ColUtils.randomRGB();
            }
            
            invalidate();
            lastFrameTime = frameTime;//时刻更新
        }
    });
    
    2.成员变量:
        Pos coo = v2(500, 600);
        private NumGo mRunNum;
        private long lastFrameTime;
        private Pos mVA;
        private Pos mSA;
        private Shape mFA;
        private int mBColor = Color.RED;
        private int mAColor = Color.BLUE;
    
    2.抬起的事件:启动mRunNum
    lastFrameTime = System.currentTimeMillis();
    mRunNum.go();
    
    3.绘制的方法:OnDraw中:
            Painter painter = PainterEnum.INSTANCE.getInstance(canvas);
            mFA = sa.deepClone().r(20).ang(360).fs(mAColor).p(mSA).coo(coo);//绘制小球
            //绘制矩形区域
            Shape fr = new ShapeRect().x(440).y(440).r(1).fs(0x66B8F8F0).coo(coo).p(-220, -220);
            painter.draw(fr, mFA);
    

    二、自由落体:

    9414344-681d6a3c8a26ba3d.gif
    自由落体.gif
    加入加速度向量,初速度设为0:
     mG = v2(0, -10);
     mV = v2(0, 0);
    
    处理位移时将加速度叠加到速度上
    Pos detaV = mG.dotC(detaT);//速度变化量
    mV = mV.add(detaV);//速度增量和
    

    三、平抛运动:

    9414344-772019223ca8633c.gif
    平抛运动.gif
    增加水平初速度
     mV = v2(3000, 0);
    

    四、斜抛运动:

    9414344-42e72d70e374d6e0.gif
    斜抛运动.gif
    mV = v2(3000, -5000);//倾斜初速度
    

    后记、

    1.声明:

    [1]本文由张风捷特烈原创,转载请注明
    [2]欢迎广大编程爱好者共同交流
    [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    [4]你的喜欢与支持将是我最大的动力

    2.连接传送门:

    更多安卓技术欢迎访问:安卓技术栈
    我的github地址:欢迎star
    简书首发,腾讯云+社区同步更新
    张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

    3.联系我

    QQ:1981462002
    邮箱:1981462002@qq.com
    微信:zdl1994328

    4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
    9414344-c474349cd3bd4b82.jpg
    公众号.jpg
  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781897.html
Copyright © 2011-2022 走看看