
概要
MATLAB で \(n\) 角柱をプロットする方法が意外と出てこなかったので書きます.
関数
まず書いてしまいます.
function h = prism(n, varargin)
ang = reshape([1;1]*(0:n-1)*2*pi/n,1,[])';
vert = [cos(ang) sin(ang) repmat([-1;1]/2,n,1)];
fac = [1:2:2*n-1; 2:2:2*n; % cap
mod(repmat([1 0 2 3],n,1)+repmat(2*(0:n-1)',1,4),2*n)+ones(n,4) NaN*ones(n,n-4)];
h = patch('Vertices',vert,...
'Faces',fac,...
'FaceVertexCData',[0.2 0.2 0.8],...
'LineStyle', 'none',...
'FaceColor','flat',varargin{:});
end
使い方としては,
clear
close all
view(3);
set(gcf,'Renderer','OpenGL');
axis vis3d
axis([-2 2 -2 2 -2 2])
light('Position',[-0.5 -0.5 2],'Style','infinite');
prism(7)
camproj perspective, rotate3d on
のようにすると,以下のような7角柱が出来上がります.
varargin
で patch
に対するほかのオプションも渡せるようになっているので,色を変えたり透明度をいじったりも簡単にできます.

解説
基本的には頂点を vert
に作ってそれの結ぶ順を fac
に列挙しているだけなので,そんなに難しいことはしていません.
NaN
を入れるとそこは無視してくれるとか,1,1,2,2,3,3,...
のような列を生成するのに reshape
を使ったりという(たぶん)マニアックなテクニックを使用しているので,気が向いたら追記します.