一、 问题描述
绘制以z=f(y)为母线绕z或y轴的旋转曲面,要求:
用户自行决定曲面网格的疏密;
用户输入旋转轴;
用图像给生成的曲面贴上纹理,图像预载入或用户输入
二、 求解思路
利用cylinder函数,输入母线和范围,即可使用surf函数画出旋转图
绕y轴时,直接使用原函数,利用linspace函数将区间分割为等间距的点后,带入母线函数中。
绕z轴时,使用原函数的反函数,先将用户输入的字符串解读,定义符号变量,产生符号函数,再利用finverse输出反函数的内含函数,后面的操作如图。
本程序可以解决单调或者半侧单调的函数绕y轴或者绕z轴或者不单调函数绕y轴的情况,对于不单调的函数绕z轴的情况,由于无法求得正确的反函数,在画绕z轴时将失效
此外,本程序在输入时也考虑了用户输入含变量x的情况,对于可以操作的情况,本程序以允以支持,对于无法操作的情况(输入函数的自变量,变量和绕的轴都不相同),本程序将允以拒绝
三、 程序代码
clear;
clc;
close all
qidian=pi/2;
zhongdian=2*pi+pi/4;
jiange=10;
s=input("输入函数表达式:如('z=y.^2')");
[xall,p]=strsplit(s,'=');
x1=cell2mat(xall(1));
x2=cell2mat(xall(2));
pat=['x','y','z'];
for i=1:3
k1=contains(x1,pat(i));
if k1==1
judge1=pat(i);
end
k2=contains(x2,pat(i));
if k2==1
judge2=pat(i);
end
end
qidian=input("请输入(自变量)起点:");
zhongdian=input("请输入(自变量)终点:");
jiange=input("请输入间隔:");
zhou=input("请输入中心轴( 'y' or 'z')");
tupian=input("请输入要贴入的图片('图片名')");
if ~isequal(judge1,judge2,zhou)
f=inline(x2);
if ~(judge2==zhou)
lin=linspace(qidian,zhongdian,1000);
zhongdian=max(f(lin));
qidian=min(f(lin));
syms x
tempf(x)=f(x);
f=inline(finverse(tempf));
end
[X,Y,Z]=fun(f,qidian,zhongdian,jiange,zhou,tupian);
else
disp('无法画图')
end
function [X,Y,Z]=fun(f,qidian,zhongdian,jiange,zhou,tupian)
lin=linspace(qidian,zhongdian,jiange);
x=f(lin);
if zhou=='z'
[X,Y,Z]=cylinder(x);
else
[X,Z,Y]=cylinder(x);
end
h=surf(X,Y,Z);
axis square
[mx,mp]=imread(tupian);
set(h,'CData',flipdim(mx,1),'FaceColor','texturemap','EdgeColor','none')
end
四、 实验结果
五、 实验心得
Matlab本身自带许多功能强大的函数,合理运用这些函数时,将取得事半功倍的效果,然而一旦盲目使用这些函数,将会使得实验走向死胡同或者一些无法解决的结果