我正在模拟粒子之间的碰撞。 我正在使用 Raylib。
所以,这是我的代码:
#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 行时,它可以正常工作(不是很好,因为缺少一个组件但可以工作),而当我放置第四行时,没有任何工作,也没有进行任何更改。我不明白为什么因为线条之间没有相互作用,所以它们是独立的。
我试图调试我所有的代码,但我找不到任何可能导致这个问题的东西,我在互联网上的研究并没有帮助我更多。