概要
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;
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
を使ったりという(たぶん)マニアックなテクニックを使用しているので,気が向いたら追記します.