Code covered by the BSD License  

Highlights from
Polytopes

image thumbnail
from Polytopes by Bill McKeeman
Display regular and semi regular geometric figures.

vertices(varargin)
% FILE:    vertices.m
% PURPOSE: mXn array of vertices for named polytopes
%          center on the origin with unit edge
% NAMES:   nnntttt where nnn is the number of ttt is unambiguous
% name Schlafli   popular
% 3edge   s3   (triangle)
% 5edge   s5   (pentagon)
% 4face   s34  tetrahedron (start of simplex series)
% 6face   s43  cube        (start of measure series)
% 8face   s34  octahedron  (start of cross series)
% 12face  s53  dodecahedron
% 20face  s35  icosahedron
% 5cell   s333 hypertetrahedron (4-simplex)
% 16cell  s334 hyperoctahedron  (4-cross)
% 8cell   s433 hypercube        (4-measure)
% 24cell  s343 (unique and nameless)
% 120cell s533 hyperdodecahedron
% 600cell s355 hypericosahedron

function v = vertices(varargin)

  if nargin == 1                       % figure name
    name = varargin{1};
  elseif nargin == 2                   % d,nf description
    switch varargin{1}
      case {2, '2'}, bound = 'edge';
      case {3, '3'}, bound = 'face';
      case {4, '4'}, bound = 'cell';
      otherwise, error('no such dimension');
    end
    count = varargin{2};
    if ~ischar(count), count = num2str(count); end
    name = [count bound];
  end
  
  if numel(name) > 4 && strcmp(name(end-3:end), 'edge')
    vct = str2double(name(1:end-4));     % polygon
    a = 2*pi*(1:vct)/vct;
    v = [sin(a); cos(a)]';
    e = v(1,:) - v(2,:);                 % an edge
    v = v/sqrt(e*e');                    % unit edges
  else
    r2 = sqrt(2);
    r5 = sqrt(5);
    gr = (1+r5)/2;                       % golden ratio
    switch name
      
    case {'4face', 'tetrahedron', 's33', '3simplex'}
      v = perms([1 0 0 0]/r2, 'cycles');
    case {'6face', 'cube', 's43', '3measure'}
      v = perms([1 1 1]/2, 'signs');
    case {'8face', 'octahedron', 's34', '3cross'}
      v = perms([1 0 0]/r2, 'cycles', 'signs', 'unique');
    case {'12face', 'dodecahedron', 's53'}
      v1 = perms([0 1 gr^2], 'cycles');
      v = perms([v1; [1 1 1]*gr]/2, 'signs', 'unique');
    case {'20face', 'icosahedron', 's35'}
      v = perms([1 0 gr]/2, 'cycles', 'signs', 'unique');
      
    case {'5cell', 'hypertetrahedron', 's333', '4simplex'}
      v = perms([1 0 0 0 0]/r2, 'cycles');
    case {'8cell', 'hypercube', 's433', '4measure'}
      v = perms([1 1 1 1]/2, 'signs');
    case {'16cell', 'hyperoctahedron', 's334', '4cross'}
      v = perms([1 0 0 0]/r2, 'cycles', 'signs', 'unique');
    case {'24cell', 's343'}
      v = perms([1 1 0 0]/r2, 'signs', 'all', 'unique');   % 24 cell
    case {'120cell', 'hyperdodecahedron', 's533'}
      vs1 = perms([...
        2    2     0     0; 
       r5    1     1     1; 
       gr    gr    gr    gr^-2; 
       gr^2  gr^-1 gr^-1 gr^-1], 'unique');
      vs2 = perms([...
       gr^2  gr^-2 1     0; 
       r5    gr^-1 gr    0; 
       2     1     gr    gr^-1], 'even');
      v = perms([vs1; vs2]*gr^2/2, 'signs', 'unique');   % 120 cell 
    case {'600cell', 'hypericosahedron', 's335'}
      vs1 = perms([2 0 0 0; 1 1 1 1], 'cycles');
      vs2 = perms([gr 1 gr^-1 0], 'even');
      v = perms([vs1; vs2]*gr/2, 'signs', 'unique');     % 600 cell
    otherwise,
      error(['bad input ' name]);
    end
  end


Contact us at files@mathworks.com