clear all; clc; close all;
%% 画五角星
A = ones(2,5);
A(:,1) = [0 1]';
theta = 2*2*pi/5;
for i=2:5
A(:,i) = [cos(theta) sin(theta); -sin(theta) cos(theta)]*A(:, i-1);
end
A = [A A(:,1)];
%% 转换到3D空间内
B = [zeros(1,6); A];
plot3(B(1,:), B(2,:), B(3,:), 'linewidth', 3, 'color', 'y');
set(gcf, 'color', 'k')
set(gca,'nextplot','replacechildren');
axis off
axis equal
view(0,0);
%% 开始旋转
N = 100;
agl = linspace(0, 2*pi, N+1);
agl(end) = [];
F = moviein(N);
D = B;
for k = 1:N;
C = [cos(agl(k)) sin(agl(k)) 0;
-sin(agl(k)) cos(agl(k)) 0;
0 0 1];
for m = 1:6
D(:,m) = C*B(:,m);
end
plot3(D(1,:), D(2,:), D(3,:), 'linewidth', 3, 'color', 'y');
F(k) = getframe;
end
movie(F,5,30);
===================趁老板不在,赶紧来更新了===========================
先上运行结果图吧:
很像一个火锅炉啊~~
主文件main.m:
%---------------------------------------------------------main.m-------------------------------------------------------
clear all; clc; close all;
%% 计算顶点坐标
A = repmat([0 1]', 1, 5);
th = 2*2*pi/5;
for k = 2:6
A(:,k) = [cos(th) sin(th); -sin(th) cos(th)]*A(:,k-1);
end
%% 调用函数计算锥面并绘制
figure; hold on
axis equal
n = 50;
% 第一个锥面,火锅炉的中轴
R1 = abs(A(1,5) - A(1,2))/2;
H1 = abs(A(2,1) - A(2,2));
[X1 Y1 Z1] = conic(R1,H1,n);
Z1 = Z1 - abs(A(2,2));
surfl(X1,Y1,Z1)
% 第二个锥面,火锅炉里汤的水面(其实是个平面)
R2 = abs(A(1,3) - A(1,4))/2;
H2 = 0;
[X2 Y2 Z2] = conic(R2,H2,n);
Z2 = Z2 + abs(A(2,3));
surfl(X2,Y2,Z2)
% 第三个锥面,火锅炉装汤的部分(下表面)
R3 = abs(A(1,3) - A(1,4))/2;
H3 = -R3*tan(36/180*pi);
[X3 Y3 Z3] = conic(R3,H3,n);
Z3 = Z3 + abs(A(2,3));
surfl(X3,Y3,Z3)
% 第四个锥面,最下面的那个小锥面
R4 = abs(A(1,5) - A(1,2))/2;
H4 = R4*tan(36/180*pi);
[X4 Y4 Z4] = conic(R4,H4,n);
Z4 = Z4 - abs(A(2,2));
surfl(X4,Y4,Z4)
% 设定显示细节
view(-130,20)
shading interp
material dull
colormap copper
alpha 0.7
axis off
set(gcf, 'color', [120 120 120]/255)
%-----------------------------------------------------End of main.m---------------------------------------------------------------
绘制圆锥面的函数conic.m:
%-----------------------------------------------------conic.m-------------------------------------------------------------------------
function [X Y Z] = conic(R,H,n)
% 计算底面半径R,高度为H的圆锥面的点坐标
% n越大,分割越精细,显示效果越好,但是数据量大,会卡
% 当H为0时,可以绘制一个平面
r = linspace(0,R,n);
th = linspace(0,2*pi,n);
[RA TH] = meshgrid(r,th);
Z = zeros(n,n);
X = Z;
Y = Z;
for k = 1:n
for m = 1:n
X(k,m) = RA(k,m)*sin(TH(k,m));
Y(k,m) = RA(k,m)*cos(TH(k,m));
Z(k,m) = H/R*(R-RA(k,m));
end
end
%-----------------------------------------------------End of conic.m-------------------------------------------------------------