Changing the color of balls after collision

조회 수: 5 (최근 30일)
Silas
Silas 2022년 6월 22일
답변: Silas 2022년 6월 22일
I have this elastic collision code that I found online and added some things to, and now I want to have the particles change from one color to a new color (say, red to blue, or vice versa) after each collision. I'm not sure how to do this, and maybe I have to rewrite most of the code, but does anyone have any idea how to do this?

채택된 답변

Silas
Silas 2022년 6월 22일
Here is the code:
%%Elastic Collision
clc
clearvars
close all
%-----------------------
N=5; % number of particles
L=10; %length of the box
dt=0.0003;
%X=zeros(2,N);
%V=zeros(2,N);
%R=0*rand(1,N)+0.2; %radius of each particle
%M=2*R; % mass of each particle
theta=0:2*pi/20:2*pi;
nstep=20000; % number of time steps or duration
pit=200; % number of iterations between two plots or speed
%%---------- manually initilizing position adn velocity
%position
X=[1 5 0 3 7;... % x pos %need to keep 2 row and only expand number of columns
3 2 4 5 -8]; % y pos
%velocity
V=[3 5 2 -10 -3;... % x
0 -5 -2 -3 -2]; % y
%Radius of each particule
R=[0.6 0.6 0.6 0.6 0.6] ;
%Mass of each particle
M=[1 1 1 1 1];
%
par1=V(:,1);
par2=V(:,2);
par3=V(:,3);
%auxiliary variables
Ax=zeros(N,N);
Ay=zeros(N,N);
Ar=zeros(N,N);
for i=1:N
for j=i:N
Ar(i,j)=R(1,i)+R(1,j);
end
end
hold on
axis equal
for i=1:N
x=X(1,i)+R(1,i)*cos(theta);
y=X(2,i)+R(1,i)*sin(theta);
plot(x,y,'color','b')
end
plotdomain(L)
grid on
grid minor
drawnow
pause(1)
for T=0:nstep
X=X+dt*V;
%check if particules collided with eachother
for i=1:N
Ax(i,:)=X(1,i)-X(1,:);
Ay(i,:)=X(2,i)-X(2,:);
end
Ax=triu(Ax);
Ay=triu(Ay);
Nrm=(Ax.^2+Ay.^2).^(0.5)-Ar-10^-5; % calculate the distance between each two particles
Nrm=triu(Nrm(1:N-1,2:N));
[row,col]=find(Nrm<0); % find the particles that collided
l=length(row);
%if particles collided calculate the new velocities
if l~=0
col=col+1;
for t=1:l
i=row(t,1);
j=col(t,1);
C1=(2*M(1,j)/(M(1,i)+M(1,j)))*dot(V(:,i)-V(:,j),X(:,i)-X(:,j))/(norm(X(:,i)-X(:,j))^2);
C2=(2*M(1,i)/(M(1,i)+M(1,j)))*dot(V(:,j)-V(:,i),X(:,j)-X(:,i))/(norm(X(:,i)-X(:,j))^2);
V(:,i)=V(:,i)-C1*(X(:,i)-X(:,j));
V(:,j)=V(:,j)-C2*(X(:,j)-X(:,i));
% change color upon collision % add here??
end
end
for i=1:N
%check if particules collided with side walls
if X(1,i)+R(1,i)>=L-10^-5 || X(1,i)-R(1,i)<=-L+10^-5
V(1,i)=-V(1,i);
end
%%check if particules collided with top and bottom walls
if X(2,i)+R(1,i)>=L-10^-5 || X(2,i)-R(1,i)<=-L+10^-5
V(2,i)=-V(2,i);
end
end
%plot
if T==pit*ceil(T/pit)
clf
hold on
axis equal
for i=1:N
x=X(1,i)+R(1,i)*cos(theta);
y=X(2,i)+R(1,i)*sin(theta);
plot(x,y,'color','b')
end
plotdomain(L)
title(T*dt)
grid on
grid minor
drawnow
pause(0.01)
end
end
function plotdomain(L)
plot([-L,-L],[-L,L],'color',[0 0 0])
plot([L,L],[-L,L],'color',[0 0 0])
plot([-L,L],[-L,-L],'color',[0 0 0])
plot([-L,L],[L,L],'color',[0 0 0])
plot(-L-0.1,-L-0.1,'color',[1 1 1])
plot(L+0.1,L+0.1,'color',[1 1 1])
end

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

제품


릴리스

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by