MATLAB——patch绘制长方体(cuboid)+长方体平移+长方体旋转

2023-10-20 07:10

本文主要是介绍MATLAB——patch绘制长方体(cuboid)+长方体平移+长方体旋转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 围绕着中心点旋转
    • 代码
    • 效果
  • 围绕原点旋转
    • 代码
    • 效果
  • 区别
  • 其他方法

围绕着中心点旋转

代码

  1. 新建一个脚本命名为:drawCuboid.m

    function [CuboidHandle, verts, facs] = drawCuboid(varargin)
    % Draw Cuboid
    % Draw a Cuboid using 8 rectangular faces. Places Cuboid Into Current Figure
    %
    % Inputs (SL, CV, EA, colr, alph)
    % ----------------
    % SL    - [X;Y;Z] Length of Cuboid Side (SL - SideLength)
    % CV    - [X;Y;Z] Center of volume
    % EA    - [Yaw(Z-axis);Pitch(y-axis);Roll(x-axis)] Euler/Rotation angles [radians]
    % colr  - Color of cuboid; string (ex. 'r','b','g') or vector [R G B]
    % alph  - Alpha transparency value of cuboid
    %
    % Outputs (CuboidHandle, verts, facs)
    % ----------------
    % CuboidHandle  = Handle for Patch Object
    % verts         = 3x8 XYZ Vertices
    % facs          = 6x4 Order of faces
    %
    %% Number of inputs and assign defaults if not specified
    % Define Default Values
    SL = [1;1;1];   CV = [0;0;0];   EA = [0;0;0];   colr = [0.5 0.5 0.5];   alph = 0.5;
    switch nargincase 0% All Inputs Empty Using Default Valuescase 1SL = varargin{1};case 2SL = varargin{1};   CV = varargin{2};case 3SL = varargin{1};   CV = varargin{2};   EA = varargin{3};case 4SL = varargin{1};   CV = varargin{2};   EA = varargin{3};   colr = varargin{4};case 5SL = varargin{1};   CV = varargin{2};   EA = varargin{3};   colr = varargin{4};     alph = varargin{5};otherwiseerror('Invalid number of inputs')
    end
    %% Form ZYX Rotation Matrix
    % Calculate Sines and Cosines
    c1 = cos(EA(1));	s1 = sin(EA(1));
    c2 = cos(EA(2));	s2 = sin(EA(2));
    c3 = cos(EA(3));	s3 = sin(EA(3));
    % Calculate Matrix
    R = [c1*c2           -c2*s1          s2c3*s1+c1*s2*s3  c1*c3-s1*s2*s3  -c2*s3s1*s3-c1*c3*s2  c3*s1*s2+c1*s3  c2*c3]';
    %% Create Vertices
    x = 0.5*SL(1)*[-1 1 1 -1 -1 1 1 -1]';
    y = 0.5*SL(2)*[1 1 1 1 -1 -1 -1 -1]';
    z = 0.5*SL(3)*[-1 -1 1 1 1 1 -1 -1]';
    %% Create Faces
    facs = [1 2 3 45 6 7 84 3 6 53 2 7 62 1 8 71 4 5 8];
    %% Rotate and Translate Vertices
    verts = zeros(3,8);
    for i = 1:8verts(1:3,i) = R*[x(i);y(i);z(i)]+CV;
    end
    %% Draw Patch Object
    CuboidHandle = patch('Faces',facs,'Vertices',verts','FaceColor',colr,'FaceAlpha',alph);
    end
    
  2. 新建另外一个脚本,输入:

    drawCuboid([2;2;2],[2;2;2],[30/180*pi;0;0],'g',0.1)
    drawCuboid([2;2;2],[2;2;2],[0;0;0],'b',0.1)
    

效果

  下面两幅图中绿色立方体为原始立方体,紫色立方体为绕立方体中心顺时针旋转30°后的立方体。

图1 俯视图
在这里插入图片描述
图2 旋转图
在这里插入图片描述

围绕原点旋转

代码

  1. 新建一个脚本命名为:drawCuboid.m
    function [CuboidHandle, verts, facs] = drawCuboid(varargin)
    % Draw Cuboid
    % Draw a Cuboid using 8 rectangular faces. Places Cuboid Into Current Figure
    %
    % Inputs (SL, CV, EA, colr, alph)
    % ----------------
    % SL    - [X;Y;Z] Length of Cuboid Side (SL - SideLength)
    % CV    - [X;Y;Z] Center of volume
    % EA    - [Yaw(Z-axis);Pitch(y-axis);Roll(x-axis)] Euler/Rotation angles [radians]
    % colr  - Color of cuboid; string (ex. 'r','b','g') or vector [R G B]
    % alph  - Alpha transparency value of cuboid
    %
    % Outputs (CuboidHandle, verts, facs)
    % ----------------
    % CuboidHandle  = Handle for Patch Object
    % verts         = 3x8 XYZ Vertices
    % facs          = 6x4 Order of faces
    %
    %% Number of inputs and assign defaults if not specified
    % Define Default Values
    SL = [1;1;1];   CV = [0;0;0];   EA = [0;0;0];   colr = [0.5 0.5 0.5];   alph = 0.5;
    switch nargincase 0% All Inputs Empty Using Default Valuescase 1SL = varargin{1};case 2SL = varargin{1};   CV = varargin{2};case 3SL = varargin{1};   CV = varargin{2};   EA = varargin{3};case 4SL = varargin{1};   CV = varargin{2};   EA = varargin{3};   colr = varargin{4};case 5SL = varargin{1};   CV = varargin{2};   EA = varargin{3};   colr = varargin{4};     alph = varargin{5};otherwiseerror('Invalid number of inputs')
    end
    %% Form ZYX Rotation Matrix
    % Calculate Sines and Cosines
    c1 = cos(EA(1));	s1 = sin(EA(1));
    c2 = cos(EA(2));	s2 = sin(EA(2));
    c3 = cos(EA(3));	s3 = sin(EA(3));
    % Calculate Matrix
    R = [c1*c2           -c2*s1          s2c3*s1+c1*s2*s3  c1*c3-s1*s2*s3  -c2*s3s1*s3-c1*c3*s2  c3*s1*s2+c1*s3  c2*c3]';
    %% Create Vertices
    x = 0.5*SL(1)*[-1 1 1 -1 -1 1 1 -1]';
    y = 0.5*SL(2)*[1 1 1 1 -1 -1 -1 -1]';
    z = 0.5*SL(3)*[-1 -1 1 1 1 1 -1 -1]';
    %% Create Faces
    facs = [1 2 3 45 6 7 84 3 6 53 2 7 62 1 8 71 4 5 8];
    %% Rotate and Translate Vertices
    verts = zeros(3,8);
    for i = 1:8verts(1:3,i) = R*[x(i);y(i);z(i)]+R*CV;
    end
    %% Draw Patch Object
    CuboidHandle = patch('Faces',facs,'Vertices',verts','FaceColor',colr,'FaceAlpha',alph);
    end
    
    1. 新建另外一个脚本,输入:
    drawCuboid([2;2;2],[2;2;2],[30/180*pi;0;0],'g',0.1)
    drawCuboid([2;2;2],[2;2;2],[0;0;0],'b',0.1)
    

效果

  下面两幅图中绿色立方体为原始立方体,紫色立方体为原点(0,0,0),顺时针旋转30°后的立方体。
图1 俯视图
在这里插入图片描述

图2 旋转图
在这里插入图片描述

区别

  绕立方体中心旋转时计算公式如下,其中R是旋转矩阵

	for i = 1:8verts(1:3,i) = R*[x(i);y(i);z(i)]+CV;end

  绕原点旋转时计算公式如下,其中R是旋转矩阵

	for i = 1:8verts(1:3,i) = R*[x(i);y(i);z(i)]+R*CV;end

其他方法

  还可以使用MATLAB提供的multicuboid函数画立方体,但是不太清楚如何实现平移、旋转等变换。详情请看资料multicuboid函数。

这篇关于MATLAB——patch绘制长方体(cuboid)+长方体平移+长方体旋转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245540

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

二维旋转公式

二维旋转公式 ros的tf工具包可以很方便的实现任意坐标系之间的坐标转换。但是,如果只是想简单的测试想法,而又不想编写过于庞杂的代码,考虑自己写二维旋转的函数。而与二维旋转问题对偶的另一个问题便是二维坐标系旋转变换。这两个问题的形式基本一样,只是旋转的角度相差一个负号。就是这个容易搞混,所以做个笔记,以备查用。 1. 二维旋转公式(算法) 而(此文只针对二维)旋转则是表示某一坐标点 ( x