• Remix
  • Share
  • New Entry

on 6 Nov 2023
  • 8
  • 63
  • 1
  • 2
  • 1466
drawframe(11);
Write your drawframe function below
function drawframe(frame,pre_fac_arr)
max_pre_fac = 2;
pre_fac = [linspace(1,max_pre_fac,24),linspace(max_pre_fac,1,24)]; % Array of scaling factors between spheres
if (mod(frame,length(pre_fac))==0)
idx = 1;
else
idx = mod(frame,length(pre_fac));
end
pre_fac = pre_fac(idx);
dp = 1; % Sphere radius
N = 161; % Number of spheres, now set to fill 3 layers
L = 2; % Scale plot axis
[X, Y, Z] = sphere;
X = X*dp/2; % Scale sphere size
Y = Y*dp/2; % Scale sphere size
Z = Z*dp/2; % Scale sphere size
x = zeros(1,N); % Initialize sphere centre points
y = zeros(1,N); % Initialize sphere centre points
z = zeros(1,N); % Initialize sphere centre points
cnt_layer = 1; % Sphere layer count
% Calculate angles and distances to determine the different
% centre points of the spheres without any collisions
ang_phi = 0;
ang_theta = 0;
r = cnt_layer*pre_fac*dp;
alpha = 2*acos((r^2 + r^2 - (dp/2)^2)/(2*r^2));
arclength = alpha*r;
num_theta = floor(abs(pi*r/(pre_fac*arclength)));
if (num_theta == 0)
dtheta = 1.1*pi;
else
dtheta = pi/(num_theta-1);
end
dphi = 2*pi;
for ii = 1:N-1
if ang_phi > 2*pi-0.1*dphi
ang_phi = 0;
ang_theta = ang_theta + dtheta;
if ang_theta > pi
ang_theta = 0;
cnt_layer = cnt_layer + 1;
r = cnt_layer*pre_fac*dp;
alpha = 2*acos((r^2 + r^2 - (dp/2)^2)/(2*r^2));
arclength = alpha*r;
num_theta = floor(abs(pi*r/(pre_fac*arclength)));
if (num_theta == 0)
dtheta = 1.1*pi;
else
dtheta = pi/(num_theta);
end
dphi = 2*pi;
else
r_c = 2*pi*r*sin(ang_theta);
alpha = 2*acos((r_c^2 + r_c^2 - (dp/2)^2)/(2*r_c^2));
arclength = alpha*r_c;
num_phi = floor(abs(2*pi*r*sin(ang_theta)/(arclength*pre_fac)));
if (num_phi == 0)
dphi = 2*pi;
else
dphi = 2*pi/(num_phi);
end
end
end
x(ii) = r*sin(ang_theta)*cos(ang_phi);
y(ii) = r*sin(ang_theta)*sin(ang_phi);
z(ii) = r*cos(ang_theta);
ang_phi = ang_phi + dphi;
end
surf(X,Y,Z);
hold on
for ii = 1:N
surf(X+x(ii),Y+y(ii),Z+z(ii))
end
hold off
axis equal
colormap spring
shading interp
xlim([-L*dp*cnt_layer L*dp*cnt_layer])
ylim([-L*dp*cnt_layer L*dp*cnt_layer])
zlim([-L*dp*cnt_layer L*dp*cnt_layer])
end
Animation
Remix Tree