晚上奖励自己的网站推荐,网页广告设计培训,厦门网站建设多少钱,在那里建立公司网站1. 画球
修改了一下MATLAB的得到球的坐标的函数#xff1a;
GetSpherePoint
function [xx,yy,zz] GetSpherePoint(xCenter,yCenter,zCenter,r,N)
% 在[xCenter,yCenter,zCenter]为球心画一个半径为r的球,N表示球有N*N个面#xff0c;N越大球的面越密集
if nargin 4 …1. 画球
修改了一下MATLAB的得到球的坐标的函数
GetSpherePoint
function [xx,yy,zz] GetSpherePoint(xCenter,yCenter,zCenter,r,N)
% 在[xCenter,yCenter,zCenter]为球心画一个半径为r的球,N表示球有N*N个面N越大球的面越密集
if nargin 4 % 没有输入N默认N是20球总共有20*20个面[X,Y,Z] sphere;
else[X,Y,Z] sphere(N);
end
[X,Y,Z] sphere;
xx X * r xCenter;
yy Y * r yCenter;
zz Z * r zCenter;
end我们在(20,10,15)的地方画一个半径为5的球调用上面的函数得到球上点的x、y、z坐标这里没有设置N默认的N是20 [xx,yy,zz] GetSpherePoint(20,10,15,5);绘制球
surf(xx,yy,zz);来换一个颜色
[xx,yy,zz] GetSpherePoint(20,10,15,5);
surf(xx,yy,zz,FaceColor,r);设置成100*100的面绘制 [xx,yy,zz] GetSpherePoint(20,10,15,5,100);surf(xx,yy,zz,FaceColor,r)2. 画圆柱
绘制圆柱参考了MATLABcylinder的实现思路但是cylinder只能绘制竖起来的圆柱感觉使用比较受限修改的函数可以生成任意形状的圆柱包括倾斜的这里需要知道的是圆柱的顶面和底面的圆心三维坐标以及圆柱的半径以及圆上的离散点数先来看一下函数
GetCylinderPoint
function [xx,yy,zz] GetCylinderPoint(bottomCenterGlobalPoint, topCenterGlobalPoint, r, N)
% 第一个输入的参数是圆柱底部圆心点的空间坐标3*1第二个输入的参数是圆柱顶部圆心点的空间坐标3*1第三个输入的参数是圆柱的半径第四个参数是圆柱圆平面的点数
% 返回值所有的返回值都是2*N的矩阵第一行是圆柱底面的边缘点的空间坐标第二行是圆柱顶面的边缘点的空间坐标xx是x的坐标yy是y的坐标zz是z的坐标if nargin 3 % 如果没有输入NN和cylinder函数一样设置为20N 20;
end
cylinderOrientation (topCenterGlobalPoint - bottomCenterGlobalPoint); % 转换为一个行向量,由圆柱的底部指向空间的顶部的坐标轴
cylinderPlaneBasis r * null(cylinderOrientation);
angle [linspace(0, 2 * pi, N),0];
bottomEdgeGlobalVec bottomCenterGlobalPoint cylinderPlaneBasis(:,1) .* cos(angle) cylinderPlaneBasis(:,2) .* sin(angle);
topEdgeGlobalVec topCenterGlobalPoint cylinderPlaneBasis(:,1) .* cos(angle) cylinderPlaneBasis(:,2) .* sin(angle);
xx [bottomEdgeGlobalVec(1,:);topEdgeGlobalVec(1,:)];
yy [bottomEdgeGlobalVec(2,:);topEdgeGlobalVec(2,:)];
zz [bottomEdgeGlobalVec(3,:);topEdgeGlobalVec(3,:)];end
绘制的原理是如图底面圆心和顶面圆心分别为 O 1 O_1 O1和 O 2 O_2 O2它们会构成一个向量 O 1 O 2 → \overrightarrow{O_1O_2} O1O2 为代码的cylinderOrientation 而圆柱的圆面是和 O 1 O 2 → \overrightarrow{O_1O_2} O1O2 垂直的所以我们可以使用MATLAB的null函数找到圆面上的一对正交向量 r e 1 r\mathbf{e}_1 re1和 r e 2 r\mathbf{e}_2 re2这里的 e 1 e_1 e1和 e 2 e_2 e2分别是单位向量这两个正交向量的模长是r也说明它们在圆周上。对应代码的cylinderPlaneBasis(:,1) 和cylinderPlaneBasis(:,2)然后我们使用极坐标的方式给定圆的离散点N就可以把圆上所有的点的坐标得到 离散角度angle [linspace(0, 2 * pi, N),0]最后要加一个0形成封闭否则圆柱少了一个面 平面上圆周上的点可以用两个正交向量来表示 p r e 1 cos θ r e 2 sin θ \mathbf{p}r\mathbf{e}_1\cos\thetar\mathbf{e}_2\sin\theta pre1cosθre2sinθ这里画画图很好理解 我们使用圆心的坐标加上上面的圆的坐标最后得到的就是我们想要的圆柱边缘的坐标了对应上面的代码是
bottomEdgeGlobalVec bottomCenterGlobalPoint cylinderPlaneBasis(:,1) .* cos(angle) cylinderPlaneBasis(:,2) .* sin(angle);
topEdgeGlobalVec topCenterGlobalPoint cylinderPlaneBasis(:,1) .* cos(angle) cylinderPlaneBasis(:,2) .* sin(angle);ok我们来检验一下
我们知道圆柱底面圆的圆心的坐标是(1,3,4)顶面圆心的坐标是(2,5,6)圆柱的半径是5这里的第四个参数圆的离散点数也没有给默认是20也就是说圆上有20个等距的点然后我们先获取一下绘图的坐标
[xx,yy,zz] GetCylinderPoint([1;3;4], [2;5;6], 5)然后我们使用surf绘制一下圆柱
surf(xx,yy,zz);
view([-37.5,30])来换一个颜色
[xx,yy,zz] GetCylinderPoint([1;3;4], [2;5;6], 5);
surf(xx,yy,zz,FaceColor,r);
view([-37.5,30])我们把N设置为100来得到圆面用100个面绘制的圆柱
[xx,yy,zz] GetCylinderPoint([1;3;4], [2;5;6], 5, 100);
surf(xx,yy,zz,FaceColor,r);
view([-37.5,30])我们可以把顶面和底面也涂上颜色
[xx,yy,zz] GetCylinderPoint([1;3;4], [2;5;6], 5,100);
figure;
hold on;
surf(xx,yy,zz,FaceColor,r);
fill3(xx(1,:),yy(1,:),zz(1,:),r);
fill3(xx(2,:),yy(2,:),zz(2,:),r);
view([-37.5,30])我们还可以把边缘的竖着的黑边全部去掉添加EdgeColor,none即可
[xx,yy,zz] GetCylinderPoint([1;3;4], [2;5;6], 5,100);
figure;
hold on;
surf(xx,yy,zz,FaceColor,r,EdgeColor,none);
fill3(xx(1,:),yy(1,:),zz(1,:),r);
fill3(xx(2,:),yy(2,:),zz(2,:),r);
view([-37.5,30])