Code covered by the BSD License

# geom3d

### David Legland (view profile)

19 Jun 2009 (Updated )

Library to handle 3D geometric primitives: create, intersect, display, and make basic computations

### Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

drawCube(cube, varargin)
```function varargout = drawCube(cube, varargin)
%DRAWCUBE Draw a 3D centered cube, eventually rotated
%
%   drawCube(CUBE)
%   Displays a 3D cube on current axis. CUBE is given by:
%   [XC YC ZC SIDE THETA PHI PSI]
%   where (XC, YC, ZC) is the CUBE center, SIDE is the length of the cube
%   main sides, and THETA PHI PSI are angles representing the cube
%   orientation, in degrees. THETA is the colatitude of the cube, between 0
%   and 90 degrees, PHI is the longitude, and PSI is the rotation angle
%   around the axis of the normal.
%
%   CUBE can be axis aligned, in this case it should only contain center
%   and side information:
%   CUBE = [XC YC ZC SIDE]
%
%   The function drawCuboid is closely related, but uses a different angle
%   convention, and allows for different sizes along directions.
%
%   Example
%   % Draw a cube with small rotations
%     figure; hold on;
%     drawCube([10 20 30  50  10 20 30], 'FaceColor', 'g');
%     axis equal;
%     view(3);
%
%   meshes3d, polyhedra, createCube, drawCuboid
%

% ------
% Author: David Legland
% e-mail: david.legland@grignon.inra.fr
% Created: 2011-06-29,    using Matlab 7.9.0.529 (R2009b)
% Copyright 2011 INRA - Cepia Software Platform.

% default values
theta = 0;
phi   = 0;
psi   = 0;

%% Parses the input
if nargin == 0
% no input: assumes cube with default shape
xc = 0;	yc = 0; zc = 0;
a = 1;

else
% one argument: parses elements
xc  = cube(:,1);
yc  = cube(:,2);
zc  = cube(:,3);
a   = cube(:,4);

% parses orientation if present
k   = pi / 180;
if size(cube, 2) >= 6
theta = cube(:,5) * k;
phi   = cube(:,6) * k;
end
if size(cube, 2) >= 7
psi   = cube(:,7) * k;
end
end

%% Compute cube coordinates

% create unit centered cube
[v, f] = createCube;
v = bsxfun(@minus, v, mean(v, 1));

% convert unit basis to cube basis
sca     = createScaling3d(a);
rot1    = createRotationOz(psi);
rot2    = createRotationOy(theta);
rot3    = createRotationOz(phi);
tra     = createTranslation3d([xc yc zc]);

% concatenate transforms
trans   = tra * rot3 * rot2 * rot1 * sca;

% transform mesh vertices
[x, y, z] = transformPoint3d(v, trans);

%% Process output
if nargout == 0
% no output: draw the cube
drawMesh([x y z], f, varargin{:});

elseif nargout == 1
% one output: draw the cube and return handle
varargout{1} = drawMesh([x y z], f, varargin{:});

elseif nargout == 3
% 3 outputs: return computed coordinates
varargout{1} = x;
varargout{2} = y;
varargout{3} = z;
end

```