-
Notifications
You must be signed in to change notification settings - Fork 0
/
assemblyAnimation.m
111 lines (80 loc) · 4.08 KB
/
assemblyAnimation.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
function assemblyAnimation (morphologicProp_struct, simVariables_struct, animationFileName)
fig1 = figure(1);
set(fig1, 'OuterPosition', [100, 50, 800, 800])
whitebg(fig1, 'w')
set(gcf,'paperunits','centimeters')
set(gcf,'papersize',[16,16])
set(gcf,'paperposition',[0,0,16,16])
numOfSegments = morphologicProp_struct.('numOfSegments');
type = morphologicProp_struct.('data').('local').('type');
parent = morphologicProp_struct.('data').('local').('parent');
x = morphologicProp_struct.('data').('local').('x');
y = morphologicProp_struct.('data').('local').('y');
z = morphologicProp_struct.('data').('local').('z');
radius = morphologicProp_struct.('data').('local').('radius');
proximal_position_x = morphologicProp_struct.('data').('local').('proximal_position_x');
proximal_position_y = morphologicProp_struct.('data').('local').('proximal_position_y');
proximal_position_z = morphologicProp_struct.('data').('local').('proximal_position_z');
elevation = simVariables_struct.('elevation');
azimute = simVariables_struct.('azimute');
geometryType = 'frustum';
frameCount = 0;
visualizationBoxLength = radius(1);
for i = 1:numOfSegments
if(type(i) == 1 && parent(i) == 1) % skiping compartments 2 and 3, used only to tell that soma is spherical
continue;
end
frameCount = frameCount + 1;
azimute = azimute + 1;
compartment_pos_x = x(i);
compartment_pos_y = y(i);
compartment_pos_z = z(i);
if(type(i) == 1)
[Xs,Ys,Zs] = sphere(20); % Compartment is soma
surface_handle(i) = surf(radius(i)*(Xs),radius(i)*(Ys),radius(i)*(Zs));
set(surface_handle(i),'FaceColor',[1 0 0],'FaceAlpha',0.5);
hold on;
else
if(abs(compartment_pos_x) > visualizationBoxLength)
visualizationBoxLength = abs(compartment_pos_x);
end
if(abs(compartment_pos_y) > visualizationBoxLength)
visualizationBoxLength = abs(compartment_pos_y);
end
if(abs(compartment_pos_z) > visualizationBoxLength)
visualizationBoxLength = abs(compartment_pos_z);
end
dx = compartment_pos_x - proximal_position_x(i);
dy = compartment_pos_y - proximal_position_y(i);
dz = compartment_pos_z - proximal_position_z(i);
d = sqrt(dx^2 + dy^2 + dz^2);
% ortogonal vector
vx = d*dy;
vy = -d*dx;
angle = -(180/pi) * acos(dz/d) + 180;
if strcmp(geometryType, 'cylinder')
[X,Y,Z] = cylinder(radius(i), 30);
elseif strcmp(geometryType, 'frustum')
[X,Y,Z] = cylinder([radius(i) radius(parent(i))], 30);
end
surface_handle(i) = surf((X + compartment_pos_x),(Y + compartment_pos_y),(d*Z + compartment_pos_z));
rotate(surface_handle(i), [vx vy 0], angle, [compartment_pos_x, compartment_pos_y, compartment_pos_z]);
end
view(azimute, elevation);
visualizationBoxLength = 1000;
xlim([-visualizationBoxLength visualizationBoxLength]);
ylim([-visualizationBoxLength visualizationBoxLength]);
zlim([-visualizationBoxLength visualizationBoxLength]);
set(gca, 'Position', [0, 0, 1, 1]);
frame = getframe(gcf);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,1028);
if i==1
imwrite(imind, cm, animationFileName,'gif', 'Loopcount',inf,'DelayTime',0.03);
else
imwrite(imind, cm, animationFileName,'gif','WriteMode','append','DelayTime',0.03);
end
axis off
drawnow;
end
end