Qt模拟分子扩散与碰撞

假设某个封闭容器内有若干个分子,每个分子的颜色都不同,它们在容器内无规则的扩散,如何实现这个功能? 解决方案如下:

1. 容器可视为一个QWidget对象,每个分子可用一个圆点表示,它的结构体数据如下:

struct SColorCircle
{
    SColorCircle(QPoint pt, Qt::GlobalColor clr) : _pt(pt), _color(clr) {}
    
    QPoint              _pt;
    int                 _radius = 10;
    Qt::GlobalColor     _color;
};

2.重写QWidget继承类的paintEvent 函数,绘制分子;

void DiffusionWgt::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    int wid = width();
    int hgt = height();
    
    QPainter painter(this);
    painter.setPen(Qt::black);
    painter.drawRect(0, 0, wid - _frmWid, hgt - _frmWid);
    
    randPoints();
    
    foreach(const auto &e, _lstPoint)
    {
        painter.setPen(e._color);
        painter.setBrush(QBrush(e._color));
        painter.drawEllipse(e._pt.x(), e._pt.y(), e._radius, e._radius);
    }
}

void DiffusionWgt::randPoints()
{
    int wid = width();
    int hgt = height();
    
    qsrand(QTime(0, 0, 0).msecsTo(QTime::currentTime()));
    
    for (auto& e : _lstPoint)
    {
        QPoint& pt = e._pt;
        pt.setX(qrand() % wid);
        pt.setY(qrand() % hgt);
        
        if (pt.x() < _frmWid)
        {
            pt.setX(_frmWid);
        }
        
        if (pt.y() < _frmWid)
        {
            pt.setY(_frmWid);
        }
        
        if (pt.x() > wid - e._radius - 2 * _frmWid)
        {
            pt.setX(wid - e._radius - _frmWid);
        }
        
        if (pt.y() > hgt - e._radius - 2 * _frmWid)
        {
            pt.setY(hgt - e._radius - _frmWid);
        }
    }
}

3.添加一个定时器,实时刷新分子的位置.

资源下载路径如下:

https://download.csdn.net/download/ouyangxiaozi/21111456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏笋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值