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函数一样设置为20
    N = 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])

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink面试题与详解

Flink面试题目合集 从牛客网上找到的一些面试题&#xff0c;如果还有其他的&#xff0c;欢迎大家补充。 1、能否详细描述下Apache Flink的架构组件和其工作原理&#xff1f;请介绍一下Flink on YARN部署模式的工作原理。 官网图&#xff1a; 由两个部分组成&#xff0c;JM&am…

单调栈分类、封装和总结

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 通过枚举最小&#xff08;最大&#xff09;值不重复、不遗漏枚举所有子数组 C算法&#xff1a;美丽塔O(n)解法单调栈左右寻找第一个小于maxHeight[i]的left,right&#xff0c;[left,right]直接的高度都是maxHeight[i] 可以…

攻防世界——game 游戏

下载下来是一个exe文件&#xff0c;可以用IDA打开 我们先运行一下 这是属于第二种类型&#xff0c;完成一个操作后给你flag 这种题我更倾向于动调直接得到flag 我们查壳 没有保护壳&#xff0c;直接32打开 进入字符串界面&#xff0c;找到显示的那部分 int __cdecl main_0(…

XSKY星辰天合星海架构荣获 IT168 “2023 年度技术卓越奖”

近日&#xff0c;"2023 年度技术卓越奖"获奖名单公布&#xff0c;XSKY 星辰天合的星海架构&#xff08;XSEA&#xff0c;极速全共享架构&#xff09;获得行业 CIO/CTO 大咖、技术专家及 IT 媒体三方认可&#xff0c;成功入选&#xff01; “技术卓越奖”评选由国内著…

Java核心知识体系8:Java如何保证线程安全性

1 Java内存模型&#xff08;JMM&#xff09; 如何解决并发问题 维度1&#xff1a;使用关键字、属性进行优化JMM本质实际就是&#xff1a;Java 内存模型规范了 JVM 如何提供按需禁用缓存和编译优化的方法。这些方法包括了&#xff1a; volatile、synchronized 和 final 关键字 …

Linux多线程:线程池(单例),读写锁

目录 一、线程池&#xff08;单例模式&#xff09;1.1 makefile1.2 LockGuard.hpp1.3 log.hpp1.4 Task.hpp1.5 Thread.hpp1.6 ThreadPool.hpp1.7 main.cc 二、STL,智能指针和线程安全2.1 STL中的容器是否是线程安全的?2.2 智能指针是否是线程安全的? 三、其他常见的各种锁四、…

Mac OS 13+,Apple Silicon,删除OBS虚拟摄像头(virtual camera),

原文链接: https://www.reddit.com/r/MacOS/comments/142cv OBS为了捕获摄像头视频,将虚拟摄像头插件内置为系统插件了.如下 直接删除没有权限的,要删除他,在mac os 13以后,需要关闭先关闭苹果系统的完整性保护(SIP) Apple 芯片(M1,....)的恢复模式分为两种,回退恢复模式,和…

支持TrustZone®的R7FA4M2AC3CFM、R7FA4M2AD3CFM、R7FA4M2AD3CFP、R7FA4M2AC3CFP高性能32位微控制器

产品简介 RA4M2 32 位微控制器 (MCU) 产品群使用支持 TrustZone 的高性能 Arm Cortex-M33 内核。 与片内的 Secure Crypto Engine (SCE) 配合使用&#xff0c;可实现安全芯片的功能。 RA4M2 采用高效的 40nm 工艺&#xff0c;由灵活配置软件包 (FSP) 这个开放且灵活的生态系统…

计算机网络(5):运输层

这一章应该是整个计算机网络对我们来说最重要的&#xff0c;也是用的最多的一部分。 运输层协议 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。…

【MySQL工具】pt-online-schema-change源码分析

通过阅读源码 更加深入了解原理&#xff0c;以及如何进行全量数据同步&#xff0c;如何使用触发器来同步变更期间的原表的数据更改。(&#xff3e;&#xff0d;&#xff3e;)V 目录 源码分析 Get configuration information. Connect to MySQL. Create --plugin. Setup la…

3D数学--矢量

矢量是具有大小和方向的有向线段 矢量大小&#xff08;结果&#xff1a;标量&#xff09; 矢量与标量乘法&#xff08;结果&#xff1a;矢量&#xff09; 矢量加减法&#xff08;结果&#xff1a;矢量&#xff09; 矢量点积&#xff08;结果&#xff1a;标量&#xff09; 1.矢量…

2024年【天津市安全员C证】新版试题及天津市安全员C证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证新版试题是安全生产模拟考试一点通总题库中生成的一套天津市安全员C证模拟考试题库&#xff0c;安全生产模拟考试一点通上天津市安全员C证作业手机同步练习。2024年【天津市安全员C证】新版试题及天津…

SpringMVC基础知识(持续更新中~)

笔记&#xff1a; https://gitee.com/zhengguangqq/ssm-md/blob/master/ssm%20md%E6%A0%BC%E5%BC%8F%E7%AC%94%E8%AE%B0/%E4%B8%89%E3%80%81SpringMVC.md 细节补充&#xff1a;

Vue 实现响应式布局

实现响应式布局是工作中必不可少 客户需要 若是使用vue element ui 的方式实现 浏览器宽度为760的情况 浏览器宽度为360的情况 手机上的显示的情况 一、对于屏幕尺寸的定义 element UI参照Bootstrap的解决方案提供了五种屏幕大小尺寸&#xff1a;xs、sm、md、lg 和 xl。并对…

CAD制图

CAD制图 二维到三维 文章目录 CAD制图前言一、CAD制图二、机械设计三、二维图纸四、三维图纸总结前言 CAD制图可以提高设计效率和准确性,并方便文档的存档和交流,是现代工程设计中不可或缺的一部分。 一、CAD制图 CAD(Computer-Aided Design)是利用计算机技术辅助进行设计…

web3风险投资公司之Electric Capital

文章目录 什么是 Electric CapitalElectric团队 Electric Capital 开发者报告参考 什么是 Electric Capital 官网&#xff1a;https://www.electriccapital.com/ 官方github&#xff1a;https://github.com/electric-capital Electric Capital 是一家投资于加密货币、区块链企…

自学华为鸿蒙开发?一般人我还是劝你算了吧!!!

本人纯屌丝一枚&#xff0c;在学编程之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学鸿蒙开发&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&#xff0c;…

如何要做好年终绩效

年终绩效&#xff0c;每年12月份&#xff0c; 都是“绩效”这个词比较热门的阶段&#xff0c; 各个企业各个部门避不开的话题。 那如何能做好呢&#xff0c;一起来看看关于 要做好年终绩效考核、绩效面谈和绩效环评的建议吧&#xff01; 明确目标和指标&#xff1a;在考核开…

轻松搭建知识付费小程序:让知识传播更便捷

明理信息科技saas知识付费平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和维护…

C# 基于MQTT创建客户端的可靠数据传输

C# 基于MQTT创建客户端的可靠数据传输 引言MQTT简介C# MQTT库引用代码和描述1、 代码2、 描述 引言 MQTT是tcpip的应用层协议&#xff0c;这里我们简单介绍一下MQTT的基本概念&#xff0c;并用C# 描述客户端的订阅和发布。 MQTT简介 MQTT(Message Queuing Telemetry Transpor…