粒子模拟:添加一行更改我所有的代码

问题描述 投票:0回答:0

我正在模拟粒子之间的碰撞。 我正在使用 Raylib。

enter image description here

所以,这是我的代码:

#include <iostream>
#include <raylib.h>
#include <math.h>
#include <array>
#include <vector>
using namespace std;

//functions to calculate with array for physical equations

array<float, 2> Moins(array<float, 2> arr1, array<float, 2> arr2)
{
    array<float, 2> arr0;
    for(int i=0; i<2; ++i) {
        arr0[i] = arr1[i] - arr2[i];
    }
    return arr0;
}

array<float, 2> Produits(array<float, 2> arr1, array<float, 2> arr2, float number)
{
    array<float, 2> arr0;
    for(int i=0; i<2; ++i) {
        arr0[i] = (arr1[i] - arr2[i])*number;
    }
    return arr0;
}

float ProduitVectoriel(array<float, 2> pos, array<float, 2> vel) {
    static float number = 0;
    number = pos[0]*vel[0] + pos[1]*vel[1];
    return number;
}

float Square(array<float, 2> l) {
    float s = 0;
    for (int i = 0; i < 2; i++) {
        s = s + pow(l[i], 2);
    } 
    return s;
}

// finish of functions to calculate with array for physical equations

class Ball
{
    public:
        array<float, 2> array_pos; 
        array<float, 2> array_vel;
        float radius;

    void Draw() {
        DrawCircle(array_pos[0], array_pos[1], radius, BLACK);
    }

    void Update() {
        array_pos[0] += array_vel[0];
        array_pos[1] += array_vel[1];

        if (array_pos[0] + radius >= GetScreenWidth()) 
        {array_vel[0] *= -1; array_pos[0] = GetScreenWidth() - radius;}
        if (array_pos[0] - radius <= 0) 
        {array_vel[0] *= -1; array_pos[0] = radius;};
        if (array_pos[1] + radius >= GetScreenHeight())
        {array_vel[1] *= -1; array_pos[1] = GetScreenHeight() - radius;}
        if (array_pos[1] - radius <= 0) 
        {array_vel[1] *= -1; array_pos[1] = radius;};
    }
    
};

float Random_vel() {
    return rand() % 4 + 2;
} 
float Random_pos() {
    return rand() % (GetScreenHeight()-100) + 100;
}


int main()
{
    int number_of_ball = 4;

    Ball myInstance[number_of_ball];

    const int screenWidth = 800;
    const int screenHeight = 800;

    InitWindow(screenWidth, screenHeight, "Particules");

    SetTargetFPS(60); 

    for(int i = 0; i < number_of_ball; i++)
    {
        float number_x = (i+1)*screenWidth/(number_of_ball+1);
        myInstance[i].array_pos = {number_x,Random_pos()};
        myInstance[i].array_vel = {Random_vel(), Random_vel()};
        myInstance[i].radius = 40;
    }

    while (!WindowShouldClose())
    {
        int fps = GetFPS();

        BeginDrawing();

        ClearBackground(WHITE);

        for(int i = 0; i < number_of_ball; i++)
        {
            myInstance[i].Update();
            myInstance[i].Draw();
        }


        for (int i = 0; i < number_of_ball; i++) {
            for(int j = 0; j < number_of_ball; j++) {
                if (CheckCollisionCircles(         //if collision between two particles
                Vector2{myInstance[i].array_pos[0], myInstance[i].array_pos[1]}, 
                myInstance[i].radius, 
                Vector2{myInstance[j].array_pos[0], 
                myInstance[j].array_pos[1]}, myInstance[j].radius) && i != j)
                {

                    cout << "Collision" << endl;

                    array<float, 2> array0 = Moins(myInstance[i].array_vel, myInstance[j].array_vel);
                    array<float, 2> array1 = Moins(myInstance[i].array_pos, myInstance[j].array_pos);
                    float number = ProduitVectoriel(array0, array1);
                    float d = Square(array1);
                    array<float, 2> array2 = Produits(myInstance[i].array_pos, myInstance[j].array_pos, (number/d));
                    array<float, 2> array3 = Moins(myInstance[i].array_vel, array2);

                    array<float, 2> array0_ = Moins(myInstance[j].array_vel, myInstance[i].array_vel);
                    array<float, 2> array1_ = Moins(myInstance[j].array_pos, myInstance[i].array_pos);
                    float number_ = ProduitVectoriel(array0_, array1_);
                    float d_ = Square(array1_);
                    array<float, 2> array2_ = Produits(myInstance[j].array_pos, myInstance[i].array_pos, (number_/d_));
                    array<float, 2> array3_ = Moins(myInstance[j].array_vel, array2_);

                //////////////////////////////////////////////////
                /// isue with this bloc of lines /////////////////
                   myInstance[i].array_vel[0] = array3[0];
                   myInstance[i].array_vel[1] = array3[1];
               
                   myInstance[j].array_vel[0] = array3_[0];
                 //myInstance[j].array_vel[1] = array3_[1]; //issue with this line
                //////////////////////////////////////////////////
                    
                }
            }
        }

        DrawText(TextFormat("%i", fps), 5, 5, 30, RED);

        EndDrawing();
    }
 
    CloseWindow(); 

    return 0;
}

我查看所有可能的球对,并检查是否发生碰撞。所以当两个球发生碰撞时,我做了很多计算来终止这两个球的新速度。 我的球是

myInstance[i]
myInstance[i]
。我可以访问速度坐标
myInstance[i].array_vel[0]
myInstance[i].array_vel[1]
。我的问题是当我放四行时:

myInstance[i].array_vel[0] = array3[0];
myInstance[i].array_vel[1] = array3[1];
myInstance[j].array_vel[0] = array3_[0];
myInstance[j].array_vel[1] = array3_[1]; //create issue

没有任何改变。没有速度改变。

//myInstance[i].array_vel[0] = array3[0]; //this code works because i don't change the 4 lines
myInstance[i].array_vel[1] = array3[1];
myInstance[j].array_vel[0] = array3_[0];
myInstance[j].array_vel[1] = array3_[1];

然而,当我只隐藏一条线时,四条线之一,任何一条,粒子之间都会发生碰撞。因此,当我有 3 行时,它可以正常工作(不是很好,因为缺少一个组件但可以工作),而当我放置第四行时,没有任何工作,也没有进行任何更改。我不明白为什么因为线条之间没有相互作用,所以它们是独立的。

我试图调试我所有的代码,但我找不到任何可能导致这个问题的东西,我在互联网上的研究并没有帮助我更多。

c++ arrays simulation particles raylib
© www.soinside.com 2019 - 2024. All rights reserved.