用C++模拟的弹簧系统,可展示弹簧的振动和碰撞效果

这篇具有很好参考价值的文章主要介绍了用C++模拟的弹簧系统,可展示弹簧的振动和碰撞效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下是一个使用C++和OpenGL库的示例代码,绘制了一个基于物理模拟的弹簧系统,展示了弹簧的振动和碰撞效果:

#include <GL/glut.h>
#include <vector>

struct Particle {
    float x, y;
    float vx, vy;
    float radius;
    bool fixed;

    Particle(float _x, float _y, float _radius, bool _fixed)
        : x(_x), y(_y), radius(_radius), fixed(_fixed)
    {
        vx = 0.0f;
        vy = 0.0f;
    }

    void update(float dt)
    {
        if (!fixed) {
            x += vx * dt;
            y += vy * dt;
        }
    }

    void draw() const
    {
        glColor3f(1.0f, 1.0f, 1.0f);
        glBegin(GL_TRIANGLE_FAN);
        glVertex2f(x, y);
        for (int i = 0; i <= 360; i += 10) {
            float angle = static_cast<float>(i) / 180.0f * 3.14159f;
            glVertex2f(x + radius * cos(angle), y + radius * sin(angle));
        }
        glEnd();
    }
};

struct Spring {
    int particle1Idx, particle2Idx;
    float restLength;
    float k;

    Spring(int idx1, int idx2, float length, float stiffness)
        : particle1Idx(idx1), particle2Idx(idx2), restLength(length), k(stiffness)
    {}

    void applyForce(std::vector<Particle>& particles)
    {
        Particle& p1 = particles[particle1Idx];
        Particle& p2 = particles[particle2Idx];

        float dx = p2.x - p1.x;
        float dy = p2.y - p1.y;
        float d = sqrt(dx * dx + dy * dy);
        float force = k * (d - restLength);

        p1.vx += force * dx / d;
        p1.vy += force * dy / d;
        p2.vx -= force * dx / d;
        p2.vy -= force * dy / d;
    }
};

const int NUM_PARTICLES = 10;
std::vector<Particle> particles;
std::vector<Spring> springs;

void init()
{
    particles.push_back(Particle(-0.5f, 0.0f, 0.05f, true));
    for (int i = 1; i < NUM_PARTICLES - 1; i++) {
        particles.push_back(Particle(-0.5f + i * 0.1f, 0.0f, 0.05f, false));
    }
    particles.push_back(Particle(0.5f, 0.0f, 0.05f, true));

    for (int i = 0; i < NUM_PARTICLES - 1; i++) {
        springs.push_back(Spring(i, i + 1, 0.1f, 100.0f));
    }
}

void update(float dt)
{
    for (auto& p : particles)
        p.update(dt);

    for (auto& s : springs)
        s.applyForce(particles);
}

void draw()
{
    for (const auto& p : particles)
        p.draw();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    update(0.01f);
    draw();

    glutSwapBuffers();
}

void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Spring System");

    init();

    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutReshapeFunc(reshape);

    glutMainLoop();

    return 0;
}

以上代码通过使用OpenGL库创建了一个基于物理模拟的弹簧系统。系统中的粒子通过弹簧相互连接文章来源地址https://www.toymoban.com/news/detail-536926.html

到了这里,关于用C++模拟的弹簧系统,可展示弹簧的振动和碰撞效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示

    🐱作者:一只大喵咪1201 🐱专栏:《智能家居项目》 🔥格言: 你只管努力,剩下的交给时间! 网络子系统实现了,在我们整个项目框架中,网络子系统也输入子系统中输入设备的之一,所以现在要做的就是网络子系统接入到输入子系统中。 如上图所示,在输入子系统中增

    2024年02月08日
    浏览(44)
  • 【UE4 C++】08-生成抛射物来模拟攻击效果

    新建一个C++类,父类为Actor,命名为“ASMagicProjectile”   在“ASMagicProjectile.h”中添加如下代码:  在“ASMagicProjectile.cpp”中添加如下代码: 编译后在虚幻编辑器中新建一个蓝图,选择父类为我们刚创建的C++类“ASMagicProjectile”   这里命名为“BP_MagicProjectile” 打开“BP_Magic

    2024年02月16日
    浏览(45)
  • 【Unity】碰撞后缩小比例并与碰撞目标紧贴(吸附效果)

    玩家控制的大立方体 碰到小立方体时变成一样的大小,与小立方体分离后变为原来大小 首先创建一个Cube,改个名称,作为玩家控制的大立方体 然后创建几个小立方体,标签设置为 Cube,可以改个颜色,方便区分 然后给玩家挂上 下文的脚本,设置一下移动和旋转的速度 直接

    2024年02月11日
    浏览(39)
  • 这个牛逼的Python模块,能让你轻松模拟并记录键盘操作(附零基础学习资料)

    模拟键盘操作执行自动化任务,我们常用的有 pyautowin 等自动化操作模块。但是这些模块有一个很大的缺点,编译的时候非常依赖 windows 的C语言底层模块。 (文末送福利) 今天介绍的这个模块叫做 keyboard 它有一个最大的优点:纯Python原生开发,编译时完全不需要依赖C语言模

    2024年02月13日
    浏览(46)
  • 【unity细节】怎么让物体产生碰撞后不会被撞飞,但是有碰撞停止的效果

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 :unity细节和bug 物体和物体间进行碰撞,达到了碰撞效果但是,由于速度过快撞飞了,如果想要即达到碰撞的效果又不会被撞飞该怎么操纵 撞飞的原因就是由于力的相

    2024年02月15日
    浏览(40)
  • LeetCode735. 行星碰撞 -- 栈模拟

    行星碰撞 提示 中等 421 相关企业 给定一个整数数组 asteroids,表示在同一行的行星。 对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。 找出碰撞后剩下的所有行星。碰撞规

    2024年02月15日
    浏览(49)
  • Unity 模拟系统提示功能,制作提示框定时消失,不同类型的提示效果

    效果: 分析: 这里用到了对象池,时间一到便要回收提示框,再次使用要置顶显示内容 每个提示框都可以修改颜色,内容,存在的时间等信息 Scroll View能够根据内容的多少进行自适应高度 代码: 提示框功能 提示管理器 测试代码 其他: 发现一个可以利用Unity自身功能制作一个自适应文

    2024年02月16日
    浏览(43)
  • unity中实现碰撞效果(无废话),不用代码,简单好抄

     1.首先建立2个物理静态精灵并设置他们的颜色。 2.给两个物体添加碰撞器组件     3.给物体添加刚体属性将静态的改为Dynamic,这里可以两个都添加,也可以只添加其中一个物体的  4.将重力大小设置为0,不然运行的时候物体会直接掉下去  5.运行游戏并随便选择旁边刚刚创

    2024年01月17日
    浏览(77)
  • 万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】

            以下给出来四个常见的小程序个人主页,分别是商城系统个人主页,外卖系统个人主页,挂号系统个人主页,电影购票系统个人主页。包括完整的页面布局代码,完整的样式代码。使用的时候,只需要将页面代码和样式代码复制到自己项目对应的页面即可。而且可

    2024年02月11日
    浏览(67)
  • 基于微信驾校模拟考试小程序毕业设计成品作品全套(1)系统效果图

    博主介绍: 《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包