MATLAB画球和圆柱

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 % 如果没有输入N,N和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\theta+r\mathbf{e}_2\sin\theta p=re1cosθ+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])

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295698.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.3_2 进程互斥的软件实现方法

2.3_2 进程互斥的软件实现方法 #mermaid-svg-MEJSSglXzFe6Q501 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MEJSSglXzFe6Q501 .error-icon{fill:#552222;}#mermaid-svg-MEJSSglXzFe6Q501 .error-text{fill:#5522…

考研往应届考生报名流程?

文章目录&#xff1a; 一&#xff1a;考试时间相关 二&#xff1a;公告查询获取信息 三&#xff1a;提供材料 1.基本要求 2.证件要求 四&#xff1a;相关问题 1.报名流程如何操作 2.考点选择 2.1 应届考生考点选择 2.2 往届考生考点选择 3.预报名时间可能不同 4.档…

一种简单的自编码器PyTorch代码实现

1. 引言 对于许多新接触深度学习爱好者来说&#xff0c;玩AutoEncoder总是很有趣的&#xff0c;因为它具有简单的处理逻辑、简易的网络架构&#xff0c;方便可视化潜在的特征空间。在本文中&#xff0c;我将从头开始介绍一个简单的AutoEncoder模型&#xff0c;以及一些可视化潜…

Hadoop入门学习笔记——七、Hive语法

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 七、Hive语法7.1. 数据库相关操作7.1.1. 创建数据库7.1.2…

w15初识php基础

一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…

【hcie-cloud】【9】华为云Stack_Deploy部署工具介绍

文章目录 前言华为云Stack Deploy简介华为云Stack Deploy工具简介华为云Stack Deploy工具部署范围华为云Stack Deploy工具节点网络要求华为云Stack Deploy工具部署流程 华为云Stack Deploy功能介绍部署工具工程场景部署流程介绍创建工程 - 基本信息填写创建工程 - 基本参数选择…

检漏继电器JJB-660/380B 柜内安装,可选新款数显型可选面板安装

JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB JJB-380;JJB-380/660 JD-127V/127V;JD-380V/380V; …

[Angular] 笔记 6:ngStyle

ngStyle 指令: 用于更新 HTML 元素的样式。设置一个或多个样式属性&#xff0c;用以冒号分隔的键值对指定。键是样式名称&#xff0c;带有可选的 .<unit> 后缀&#xff08;如 ‘top.px’、‘font-style.em’&#xff09;&#xff0c;值为待求值的表达式&#xff0c;得到…

从零构建tomcat环境

一、官网构建 1.1 下载 一般来说对于开源软件都有自己的官方网站&#xff0c;并且会附上使用文档以及一些特性和二次构建的方法&#xff0c;那么我们首先的话需要从官网或者tomcat上下载到我们需要的源码包。下载地址&#xff1a;官网、Github。 这里需要声明一下&#xff…

arm和x86架构服务器拉取arm64架构的docker镜像

dockerhub提供的镜像部分支持arm64架构 Docker arm架构服务器拉取docker镜像&#xff0c;默认是arm架构 # docker pull centos Using default tag: latest latest: Pulling from library/centos 52f9ef134af7: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8…

springboot实现发送邮件开箱即用

springboot实现发送邮件开箱即用 环境依赖包yml配置Service层Controller层测试 环境 jdk17 springboot版本3.2.1 依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><ver…

C++初阶——类和对象

呀哈喽&#xff0c;我是结衣 C入门之后&#xff0c;我们就进入了C的初阶的学习了&#xff0c;在了解类和对象之前&#xff0c;我们还是先了解&#xff0c;面向过程和面向对象的初步认识。 在本篇博客中&#xff0c;我们要讲的内容有 1.面向过程和面向对象初步认识 2.类的引入 3…