MATLABでn角柱を3次元プロットする

MATLABでn角柱を3次元プロットする

概要

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角柱が出来上がります. vararginpatch に対するほかのオプションも渡せるようになっているので,色を変えたり透明度をいじったりも簡単にできます.

解説

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

Share Comments