0001 function varargout = drawEllipsoid(elli, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 nPhi = 32;
0043
0044
0045 nTheta = 16;
0046
0047
0048 drawEllipses = false;
0049 ellipseColor = 'k';
0050 ellipseWidth = 1;
0051
0052 drawAxes = false;
0053 axesColor = 'k';
0054 axesWidth = 2;
0055
0056
0057
0058
0059
0060 if nargin == 0
0061
0062 elli = [0 0 0 5 4 3 0 0 0];
0063 end
0064
0065
0066 options = {'FaceColor', 'g', 'linestyle', 'none'};
0067
0068 while length(varargin) > 1
0069 switch lower(varargin{1})
0070 case 'nphi'
0071 nPhi = varargin{2};
0072
0073 case 'ntheta'
0074 nTheta = varargin{2};
0075
0076 case 'drawellipses'
0077 drawEllipses = varargin{2};
0078
0079 case 'ellipsecolor'
0080 ellipseColor = varargin{2};
0081
0082 case 'ellipsewidth'
0083 ellipseWidth = varargin{2};
0084
0085 case 'drawaxes'
0086 drawAxes = varargin{2};
0087
0088 case 'axescolor'
0089 axesColor = varargin{2};
0090
0091 case 'axeswidth'
0092 axesWidth = varargin{2};
0093
0094 otherwise
0095
0096 options = [options varargin(1:2)];
0097 end
0098
0099 varargin(1:2) = [];
0100 end
0101
0102
0103
0104
0105
0106 xc = elli(:,1);
0107 yc = elli(:,2);
0108 zc = elli(:,3);
0109 a = elli(:,4);
0110 b = elli(:,5);
0111 c = elli(:,6);
0112 k = pi / 180;
0113 ellPhi = elli(:,7) * k;
0114 ellTheta = elli(:,8) * k;
0115 ellPsi = elli(:,9) * k;
0116
0117
0118
0119
0120
0121 sca = createScaling3d(a, b, c);
0122 rotZ = createRotationOz(ellPhi);
0123 rotY = createRotationOy(ellTheta);
0124 rotX = createRotationOx(ellPsi);
0125 tra = createTranslation3d([xc yc zc]);
0126
0127
0128 trans = tra * rotZ * rotY * rotX * sca;
0129
0130
0131
0132
0133
0134 theta = linspace(0, pi, nTheta+1);
0135 phi = linspace(0, 2*pi, nPhi+1);
0136
0137
0138 sintheta = sin(theta);
0139 x = cos(phi') * sintheta;
0140 y = sin(phi') * sintheta;
0141 z = ones(length(phi),1) * cos(theta);
0142
0143
0144 [x, y, z] = transformPoint3d(x, y, z, trans);
0145
0146
0147
0148
0149 if drawEllipses
0150
0151 nVertices = 120;
0152 t = linspace(0, 2*pi, nVertices+1);
0153
0154
0155 xc1 = cos(t');
0156 yc1 = sin(t');
0157 zc1 = zeros(size(t'));
0158
0159
0160 xc2 = cos(t');
0161 yc2 = zeros(size(t'));
0162 zc2 = sin(t');
0163
0164
0165 xc3 = zeros(size(t'));
0166 yc3 = cos(t');
0167 zc3 = sin(t');
0168
0169
0170 [xc1, yc1, zc1] = transformPoint3d(xc1, yc1, zc1, trans);
0171 [xc2, yc2, zc2] = transformPoint3d(xc2, yc2, zc2, trans);
0172 [xc3, yc3, zc3] = transformPoint3d(xc3, yc3, zc3, trans);
0173 end
0174
0175
0176
0177 if drawAxes
0178 axesEndings = [-1 0 0; +1 0 0; 0 -1 0; 0 +1 0; 0 0 -1; 0 0 +1];
0179 axesEndings = transformPoint3d(axesEndings, trans);
0180 end
0181
0182
0183
0184
0185 ellipseOptions = {'color', ellipseColor, 'LineWidth', ellipseWidth};
0186 axesOptions = {'color', axesColor, 'LineWidth', axesWidth};
0187
0188
0189 if nargout == 0
0190
0191 surf(x, y, z, options{:});
0192
0193 if drawEllipses
0194 plot3(xc1, yc1, zc1, ellipseOptions{:});
0195 plot3(xc2, yc2, zc2, ellipseOptions{:});
0196 plot3(xc3, yc3, zc3, ellipseOptions{:});
0197 end
0198
0199 if drawAxes
0200 drawEdge3d([axesEndings(1,:), axesEndings(2,:)], axesOptions{:});
0201 drawEdge3d([axesEndings(3,:), axesEndings(4,:)], axesOptions{:});
0202 drawEdge3d([axesEndings(5,:), axesEndings(6,:)], axesOptions{:});
0203 end
0204
0205 elseif nargout == 1
0206
0207 varargout{1} = surf(x, y, z, options{:});
0208 if drawEllipses
0209 plot3(xc1, yc1, zc1, ellipseOptions{:});
0210 plot3(xc2, yc2, zc2, ellipseOptions{:});
0211 plot3(xc3, yc3, zc3, ellipseOptions{:});
0212 end
0213
0214 elseif nargout == 3
0215
0216 varargout{1} = x;
0217 varargout{2} = y;
0218 varargout{3} = z;
0219 if drawEllipses
0220 plot3(xc1, yc1, zc1, ellipseOptions{:});
0221 plot3(xc2, yc2, zc2, ellipseOptions{:});
0222 plot3(xc3, yc3, zc3, ellipseOptions{:});
0223 end
0224
0225 elseif nargout == 4 && drawEllipses
0226
0227 varargout{1} = surf(x, y, z, options{:});
0228 varargout{2} = plot3(xc1, yc1, zc1, ellipseOptions{:});
0229 varargout{3} = plot3(xc2, yc2, zc2, ellipseOptions{:});
0230 varargout{4} = plot3(xc3, yc3, zc3, ellipseOptions{:});
0231
0232 end
0233