假设粒子大小相对于系统尺度可以忽略不计,用点表示。检测粒子在一段直线轨迹上是否与固壁相撞。
% detectcollision.m
% detect the collision between a particle and obstructions
% particle moves from (x1,y1) to (x2,y2) in a line
% particle is represented with a point (radius=0)
% obstructions are defined in matrix 'elems', element=0: obstruction, element=1: void space
% output: ifcollide, 0: no collision, 1: collision
function ifcollide = detectcollision(x1,y1,x2,y2,elems)
ifcollide=0;
% upper boundary
[uby ubx]=size(elems);
uby=uby-1;
ubx=ubx-1;
if x2<0 || x2>ubx || y2<0 || y2>uby
ifcollide=1;
return
end
% y limits
maxy=floor(max(y2,y1));
miny=floor(min(y2,y1));
% moving direction in x
sgndx=sign(x1-x2);
if sgndx~=0
% equation of the trajectory: y=ax+c
a=(y2-y1)/(x2-x1);
c=-a*x1+y1;
if a>0
for xtrack=floor(x2):sgndx:floor(x1) % all integer x coodinates on the track
for ytrack=max(miny,ceil(xtrack*a+c-1)):min(maxy,floor((xtrack+1)*a+c)) % all integer y coordinates of elements penetrated by the line
if elems(ytrack+1,xtrack+1)==0
ifcollide=1;
return
end
end
end
else
for xtrack=floor(x2):sgndx:floor(x1)
for ytrack=max(miny,ceil((xtrack+1)*a+c-1)):min(maxy,floor(xtrack*a+c))
if elems(ytrack+1,xtrack+1)==0
ifcollide=1;
return
end
end
end
end
else
sgndy=sign(y1-y2);
if sgndy~=0
for ytrack=floor(y2):sgndy:floor(y1)
if elems(ytrack+1,floor(x1)+1)==0
ifcollide=1;
return
end
end
end
end