qibbxxt 发表于 2010-8-23 10:42:27

一个小球碰撞的模拟

最近看本老外的书,上面提到一个例子:一个球静止躺在一个方形的桌上,球被撞击一下,然后无限的运动,问在什么情况下,小球可以回到原来的点,老外给出的方法就是把平面区域展开的方法,给了一个例子,但是我模拟了下,感觉不对(按老外的观点NN次就可以回到原点,但是模拟的结果不是,我运行了2*NN次,大致回到那个位置,但是好像不在那个点,不知是不时计算精度的问题),以下是我的程序,我愿意和有兴趣的读者一起讨论,

clear; clc; close all
step = 0.01;
N=1000;
xdir=1;
ydir=1;
xlow=1;
xup=2;
hold on
grid on
set(gca,'GridLineStyle','-');
daspect();
% = meshgrid((xlow+.1):step:(xup-.1));
% pos=unidrnd(numel(x));
% x0=x(pos);
% y0=y(pos);
x0=1.2;
y0=1.5;
xs=x0;ys=y0;
x2=x0;
y2=y0;
tanfz=3;
tanfm=7;
% tanfz=randint(1,1,);
% tanfm=randint(1,1,);
tany=tanfz/tanfm;
axis();
plot(x0,y0,'go','markersize',5);
h=plot(x0,y0,'r.','markersize',20);
h1=plot(x0,y0,'g.','markersize',20);
set(gca,'xtick',0:1:16,'ytick',0:1:8);
gc=gcd(tanfz,tanfm);
NN=tanfm/gc/step;
for i=1:2*NN
    x1=x0;
    y1=y0;
    x3=x2;
    y3=y2;
    x0=x0+xdir*step;
    y0=y0+ydir*step*tany;
    x2=x2+step;
    y2=y2+step*tany;
    if x0>=xup || x0<=xlow
      xdir = -xdir;
    end
    if y0>=xup || y0<=xlow
      ydir = -ydir;
    end
    set(h,'xdata',x0,'ydata',y0);
    set(h1,'xdata',x2,'ydata',y2);
    plot(,,'k-','linewidth',1);
    plot(,,'y--','linewidth',1);
    pause(0.001);
    if dist(,)<eps
      break
    end
end
页: [1]
查看完整版本: 一个小球碰撞的模拟