附录1
function boid1(n,eta) %generates boids in a field
n=input('input n ');eta=input('input eta'); range =0.2; speed =0.03; TIME = 300; density =10; RUNS = 1;
fieldsize = sqrt(n/density); pos = fieldsize*rand(n,2); heading = 2*pi*rand(n,1); relposX = zeros(n); relposY = zeros(n); neighbours = zeros(n); RelHead = zeros(n,1); B = zeros(n,1);
newHeading = zeros(n,1); newPos = zeros(n,2); meanHeading = zeros(TIME,1); deviationMean = zeros(n,TIME); for run=1:RUNS for time=1:TIME for i=1:n for j=1:n
relposX(i,j) = abs(pos(i,1) - pos(j,1)); relposY(i,j) = abs(pos(i,2) - pos(j,2));
if(sqrt(relposX(i,j)^2 + relposY(i,j)^2) <= range) neighbours(i,j)=1; end end end for i=1:n for j=1:n
if(neighbours(i,j)==1)
relheading(i,j) = heading(j,1)-heading(i,1); end end end
RelHead = sum(relheading,2); for i=1:n
whileRelHead(i,1) < -pi
RelHead(i,1) = RelHead(i,1) + pi;
16
end
whileRelHead(i,1) > pi
RelHead(i,1) = RelHead(i,1) - pi; end end
noise = (rand(n,1)*eta) -eta/2;
newHeading(:,1) = heading(:,1) + RelHead(:,1)./sum(neighbours,2) + noise(:,1);
newPos(:,1) = pos(:,1) + cos(newHeading(:,1))*speed; newPos(:,2) = pos(:,2) + sin(newHeading(:,1))*speed; for k=1:n
whilenewPos(k,1) < 0
newPos(k,1) = newPos(k,1) + fieldsize; end
whilenewPos(k,1) >= fieldsize
newPos(k,1) = newPos(k,1) - fieldsize; end
whilenewPos(k,2) < 0
newPos(k,2) = newPos(k,2) + fieldsize; end
whilenewPos(k,2) >= fieldsize
newPos(k,2) = newPos(k,2) - fieldsize; end end
heading = newHeading; pos = newPos;
meanHeading(time,1) = mean(heading,1);
deviationMean(time,1) = mean(abs(meanHeading(time,1)-heading(:,1))); scatter(pos(:,1),pos(:,2), 'xr');
axis([0 fieldsize 0 fieldsize]); xlabel(time ); M(time) = getframe; end
runDev(:,run) = deviationMean(:,1); end
%plot(runDev)
movie2avi(M,'boidtest.avi', 'quality',100);
附录2
function boid1(n,eta) %generates boids in a field n=input('input n'); eta=input('input eta'); range =0.2;
17
speed =0.05; TIME = 300; density =10; RUNS = 1;
fieldsize = sqrt(n/density); pos = fieldsize*rand(n,3); heading = 2*pi*rand(n,1); relposX = zeros(n); relposY = zeros(n); relposZ = zeros(n); neighbours = zeros(n); RelHead = zeros(n,1); B = zeros(n,1);
newHeading = zeros(n,1); newPos = zeros(n,3); meanHeading = zeros(TIME,1); deviationMean = zeros(n,TIME); for run=1:RUNS for time=1:TIME for i=1:n for j=1:n
relposX(i,j) = abs(pos(i,1) - pos(j,1)); relposY(i,j) = abs(pos(i,2) - pos(j,2)); relposZ(i,j) = abs(pos(i,3) - pos(j,3));
if(sqrt(relposX(i,j)^2 + relposY(i,j)^2+relposZ(i,j)^2) <= range) neighbours(i,j)=1; end end end for i=1:n for j=1:n
if(neighbours(i,j)==1)
relheading(i,j) = heading(j,1)-heading(i,1); end end end
RelHead = sum(relheading,2); for i=1:n
whileRelHead(i,1) < -pi
RelHead(i,1) = RelHead(i,1) + pi; end
whileRelHead(i,1) > pi
RelHead(i,1) = RelHead(i,1) - pi; end
18
end
noise = (rand(n,1)*eta) -eta/2;
newHeading(:,1) = heading(:,1) + RelHead(:,1)./sum(neighbours,2) + noise(:,1);
newPos(:,1) = pos(:,1) + cos(newHeading(:,1))*speed; newPos(:,2) = pos(:,2) + sin(newHeading(:,1))*speed; newPos(:,3) = pos(:,3) + tan(newHeading(:,1))*speed;
for k=1:n
whilenewPos(k,1) < 0
newPos(k,1) = newPos(k,1) + fieldsize; end
whilenewPos(k,1) >= fieldsize
newPos(k,1) = newPos(k,1) - fieldsize; end
whilenewPos(k,2) < 0
newPos(k,2) = newPos(k,2) + fieldsize; end
whilenewPos(k,2) >= fieldsize
newPos(k,2) = newPos(k,2) - fieldsize; end
whilenewPos(k,3) < 0
newPos(k,3) = newPos(k,3) + fieldsize; end
whilenewPos(k,3) >= fieldsize
newPos(k,3) = newPos(k,3) - fieldsize; end end
heading = newHeading; pos = newPos;
meanHeading(time,1) = mean(heading,1);
deviationMean(time,1) = mean(abs(meanHeading(time,1)-heading(:,1))); scatter3(pos(:,1),pos(:,2),pos(:,3) ,'*r'); axis([0 fieldsize 0 fieldsize 0 fieldsize]); xlabel(time );ylabel('Y');zlabel('Z'); M(time) = getframe; end
runDev(:,run) = deviationMean(:,1); end
%plot(runDev)
movie3avi(M,'boidtest.avi', 'quality',100);
附录3
19
function boid1(n,eta) %generates boids in a field
n=input('input n ');eta=input('input eta'); range =0.2; speed =0.03; TIME = 300; density =10; RUNS = 1; m=3;
fieldsize = sqrt(n/density); pos2=fieldsize*rand(m,2); heading2=2*pi*rand(m,2); elposX2 = zeros(m); relposY2 = zeros(m); neighbours2 = zeros(m); RelHead2 = zeros(m,1); B = zeros(m,1);
newHeading2= zeros(m,1); newPos2 = zeros(m,2); meanHeading2= zeros(TIME,1); deviationMean2 = zeros(m,TIME); for run=1:RUNS
for time=1:TIME for i=1:m for j=1:m
relposX2(i,j) = abs(pos2(i,1) - pos2(j,1)); relposY2(i,j) = abs(pos2(i,2) - pos2(j,2));
if(sqrt(relposX2(i,j)^2 + relposY2(i,j)^2) <= range) neighbours2(i,j)=1; end end end for i=1:m for j=1:m
if(neighbours2(i,j)==1)
relheading2(i,j) = heading2(j,1)-heading2(i,1); end end end
RelHead2 = sum(relheading2,2); for i=1:m
while RelHead2(i,1) < -pi
20