2020-09-16QT写一个简单的元胞自动机(6)

目录


  1. QTimer介绍
  2. QTimer使用
  3. 车辆运动算法
  4. 最终模型展示

1. QTimer介绍


QTimer类为计时器提供了高级编程接口。要使用它,需要创建一个QTimer,将其timeout()信号连接到适当的插槽函数,并调用start()。从那时起,它将以恒定的间隔发出timeout()信号,槽函数每收到一次信号就会执行一次。


2. QTimer使用

2.1 单次触发的计时器

QTimer可以弄个单次触发的计时器


使用静态cheng
//Example:
        QApplication app(argc, argv);
        QTimer::singleShot(600000, &app, SLOT(quit()));
              ...
        return app.exec();

2.2 按设置好的时间间隔触发的计时器

        QTimer *timer = new QTimer(this); //设置父对象this,挂接到对象树上,这样程序结束时会自动释放空间
        connect(timer, &QTimer::timeout, this, QOverload<>::of(&AnalogClock::update));//将Qtimer定时发出的信号和槽函数连接起来,
//一旦收到timeout信号,就执行槽函数
        timer->start(1000);//启动计时器,并设置信号发出间隔1000ms

注:如果有多个计时器,通过TimerID来引用,这儿不说了

2.3 用计时器来更新场景

// .h定义计时器
QTimer *timer; //定义计时器

//.cpp 计时器在构造函数中设置
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timer= new QTimer(this);  // 在类的构造函数中初始化timer
    connect(timer,&QTimer::timeout, this, &Widget::on_updateScene_timeout);
    //connect(发出信号的是谁,谁的哪种信号,谁接受信号,谁的什么函数接受信号)
    //on_updateScene_timeout是我自定义的槽函数

    timer->setInterval(100); //设置,每间隔100ms发出一次信号
}

计时器的启动和暂停放在开始和暂停按钮的槽函数中


image.png

3. 车辆运动算法

sceneUpdate()函数需要考虑两点:1更新顺序的问题,2如何更新

3.1更新顺序我们可以随机选取车辆更新,需要使用到洗牌算法

C++有个random_shuffle就可以随机打乱,但qt用不了

#include <algorithm>
#include <vector>
#include <ctime>
......
    srand((unsigned int)time(NULL));
    vector<int> v;
    for(int i = 0 ; i < 10;i++)
    {
        v.push_back(i);
    }
random_shuffle(v.begin(), v.end());//顺序打乱

洗牌算法实现

void Widget::sceneUpdate()
{
    // 1选择,2 算法更新
    //洗牌算法,决定谁先更新,0-numV随机排序再依次更新
    QVector<int> orderContainer;
    for (int i=0;i<numV;i++) {
        orderContainer.append(i); //初始化序列容器

    }
    //费雪耶兹置乱算法
    for(int i=numV-1; i>0; i--)
    {
        int rand=QRandomGenerator::global()->bounded(0,i+1); //[0,i] 内生成随机整数
        if(rand==i) continue;
        orderContainer.swapItemsAt(i,rand); //QVector用来交换两个位置元素的算法
    }
   qDebug()<<orderContainer;//测试使用


}

测试结果

算法参考链接

3.2 车辆更新

考虑车辆最大速度为5,使用NS模型对车辆进行更新

#define speedMax 5 //车辆最大速度,单位元胞

话不多说,对于车辆的更新直接上代码

       int speedA =(veContainer[order]->speed+1);
       int desiredSpeed = (speedA > speedMax) ? speedMax:speedA;
       int speedLast; //定义最终速度,用来放最后得到的速度

       //用desiredSpeed查看空间,也就是用此速度会不会遇到障碍
       int x= veContainer[order]->pos.x();
       int i = desiredSpeed;// 使用i来进行车辆运动遇障判断
       while(i!=0)//每往车前判断一格,就i自减,直到i为0
       {
           if(x==sL) x=0; //过了右侧边界,从左侧继续判断
           if(scene[++x][sW/2]==1) break;//一旦有障碍,就跳出此循环
           i--;
       }
       if(i!=0){//上面的循环,不正常退出
           speedLast=desiredSpeed -i;
       }
       else{
           speedLast=desiredSpeed;
       }

       // 确认速度后进行车辆的更新,包括(原来元胞的占有去掉,车辆对象的信息更新,占据新的元胞)
       //定义一个NotShowOccupied函数,和showOccupied差不多,只是赋值由1变为0
       notShowOccupied(veContainer[order]->pos.x());
       veContainer[order]->speed=speedLast;

       int pos = veContainer[order]->pos.x()+speedLast; //原位置加速度得到现在的位置
       int posLast = (pos >= sL)? (pos-sL) : pos; //考虑右边界,得到车辆最终速度
       veContainer[order]->pos.setX(posLast); //使用QPoint的方法来设置x坐标
       showOccupied(posLast);//scene数组也更新一下

4. 最终模型展示

1

2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351