matlab使用教程(85)—绘制多边形和多面体

1.补片对象简介

1.1什么是补片对象?

        补片图形对象由一个或多个相连或不相连的多边形组成。补片对建模真实世界对象(如飞机或汽车)以及绘制任意形状的二维或三维多边形非常有用。

        相对而言,曲面对象是由四边形组成的矩形网格,更适合显示平面布局图,例如具有两个变量的数学函数的值、矩形平面中数据的等高线或者参数化曲面(如球体)。

        有一些 MATLAB® 函数可以创建补片对象 - fillfill3isosurfaceisocaps、某些 contour 函数以及 patch。本节主要介绍如何使用 patch 函数。

        您可以通过指定顶点坐标和某种形式的颜色数据来定义补片。补片支持各种着色选项,这些选项对于可视化几何形状上叠加的数据很有用。

        指定补片的方法有两种:

  • 指定每个多边形的顶点坐标,这些顶点连接起来形成补片。

  • 指定每个唯一顶点的坐标以及一个定义如何连接这些顶点以形成面的矩阵。此方法是多面补片的首选,因为它通常需要较少的数据来定义补片,而且由多个面共享的顶点只需定义一次。有关详细信息,请参阅多面补片

1.2patch 函数的行为

        有两种形式的 patch 函数 - 高级语法和低级语法。根据您使用的语法,patch 函数的行为有所不同。

1)高级语法

        当您使用高级语法时,MATLAB 会根据您指定的颜色数据自动确定如何为每个面着色。高级语法允许您省略 xy 和 z 坐标以及颜色数据的属性名称,只要按正确顺序指定这些参量即可。

patch(x-coordinates,y-coordinates,z-coordinates,colordata)

        但您必须指定颜色数据,这样 MATLAB 才能确定要使用的着色类型。如果不指定颜色数据,MATLAB 将返回错误。

x = [0 1 1 0];
y = [0 0 1 1];
patch(x,y)

Error using patch
Not enough input arguments.

2)低级语法

        低级语法仅接受属性名称/属性值对组作为参量,并且不会自动为面着色,除非您还更改了 FaceColor 属性的值。例如,下面的语句

patch('XData',x,'YData',y) 

        绘制一个面颜色为黑色的补片,因为 FaceColor 属性的出厂默认值为黑色。

get(groot,'FactoryPatchFaceColor')
ans =
      0     0     0

        有关如何获取属性的出厂默认值和用户默认值的信息,请参阅《MATLAB 函数参考》中的 Patch 属性 列表以及 get 命令。

3)解释颜色参量

        当您使用高级语法时,MATLAB 会将第三个(如果存在 z 坐标,则为第四个)参量解释为颜色数据。如果您打算使用 xy 和 z 坐标来定义补片,但未指定颜色,则 MATLAB 会将 z 坐标解释为颜色数据,并绘制一个二维补片。例如,

patch(x,y,1:length(x))

        将绘制一个所有顶点的 z 值均为 0 的补片,并会根据顶点颜色来插补着色(因为每个顶点一种颜色),而

patch(x,y,1:length(x),'y')

        则会绘制一个各个顶点的 z 值递增的补片,颜色为黄色。

1.3 创建单个多边形

        多边形是只有一个面的补片。要创建多边形,请按以下形式的语句指定顶点坐标和颜色数据

patch(x-coordinates,y-coordinates,[z-coordinates],colordata)

        例如,下面的语句显示一个面为黄色、边为黑色的十边形。axis equal 命令会生成一个正多边形。

t = 0:pi/5:2*pi;
figure
patch(sin(t),cos(t),'y')
axis equal

        第一个和最后一个顶点不需要重合,MATLAB 会自动闭合补片的每个多边形面。事实上,通常每个顶点最好只定义一次,尤其是在使用插补面着色法时。

        您可以控制补片着色的许多方面。例如,您可以提供一系列数值,将每个顶点的颜色映射到图窗颜色图中的一种颜色,而不是只指定一种颜色。

a = t(1:length(t)-1); %remove redundant vertex definition
figure
patch(sin(a),cos(a),1:length(a),'FaceColor','interp')
axis equal

        MATLAB 现在可在补片的整个面上进行颜色插值。同样,您可以将边的颜色指定为插补着色来为补片的边着色。命令如下:

patch(sin(a),cos(a),1:length(a),'EdgeColor','interp')

2.多面补片

        立方体由八个顶点定义,它们形成六个面。下图显示了定义边长为一个单位的立方体的各个顶点的 xy 和 z 坐标。

        如果您将 xy 和 z 坐标参量指定为向量,它们将呈现出一个按顺序连接各点的多边形。如果这些参量是矩阵,MATLAB® 会为每一列绘制一个多边形,从而形成一个具有多个面的补片。这些面不需要连接,并且可以自相交。

        您也可以指定每个唯一顶点的坐标以及将它们连接成面的顺序。本节中的示例对这两种方法均进行了说明。

        六个面中每个面都有四个顶点。由于不需要闭合每个多边形(即第一个和最后一个顶点不需要相同),因此可以为每个 xy 和 z 坐标使用一个 4×6 矩阵来定义该立方体。

        矩阵的每一列指定一个不同的面。虽然只有八个顶点,但您必须指定 24 个顶点才能定义所有六个面。由于每个面与其他四个面共享顶点,因此您可以每个顶点只定义一次,然后指定连接它们的顺序以形成每个面,这样可以提高定义补片的效率。补片的 Vertices 和 Faces 属性就是以这种方式定义补片的。

        这些矩阵使用 Vertices 和 Faces 指定立方体。

        当补片包含很多面时,使用顶点/面方法可以节省大量计算机内存。这种方法需要使用正式的 patch 函数语法,为 Vertices 和 Faces 属性显式赋值。例如,

patch('Vertices',vertex_matrix,'Faces',faces_matrix)

        由于高级语法不会自动分配面或边颜色,因此您必须设置适当的属性,以生成面和边的颜色不是默认的白色和黑色的补片。

        面的单一着色是为每个面指定一种颜色的结果。例如,下面的语句使用顶点/面方法和 FaceVertexCData 属性来定义颜色,为每个面指定一种颜色并将 FaceColor 属性设置为 flat

vert = [0 0 0;1 0 0;1 1 0;0 1 0;0 0 1;1 0 1;1 1 1;0 1 1];
fac = [1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
patch('Vertices',vert,'Faces',fac,...
      'FaceVertexCData',hsv(6),'FaceColor','flat')

        调整坐标区:

view(3)
axis vis3d

        由于使用 FaceVertexCData 属性指定的真彩色与 MATLAB 颜色图(即由 RGB 值组成的 n×3 数组)的格式相同,因此本示例使用 hsv 颜色图生成单一着色所需的六种颜色。

        要将面颜色映射到当前颜色图,需要为 FaceVertexCData 属性指定一个 n×1 数组:

patch('Vertices',vert,'Faces',fac,...
      'FaceVertexCData',(1:6)','FaceColor','flat')

        调整坐标区:

view(3)
axis vis3d

        面的插补着色意味着每个面的顶点颜色定义从一个顶点到下一个顶点的颜色过渡。要在顶点之间插补颜色,必须为每个顶点指定一种颜色并将 FaceColor 属性设置为 interp

patch('Vertices',vert,'Faces',fac,...
      'FaceVertexCData',hsv(8),'FaceColor','interp')

        调整坐标区:

view(3)
axis vis3d

        生成一个通过顶点的颜色对每个面进行插补着色的立方体。

        要使用 x、y、z、c 方法指定相同的着色,c 必须是一个 m×n×3 数组,其中 x、y 和 z 的维度为 m×n

        下图显示了 FaceVertexCData 和 CData 属性之间的对应关系。

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
柏拉图多面体是一种具有特殊几何结构的多面体,可以通过绘制其各个面来表示。下面是一个用 MFC 和 VC++ 绘制正四面体的示例代码。 首先,需要在 MFC 应用程序中创建一个绘图视图类。在该视图类中,可以重写 OnDraw 函数,以便在视图上绘制出正四面体。 在 OnDraw 函数中,首先需要创建一个 CPen 对象和一个 CBrush 对象,用于绘制正四面体的边框和面。然后,可以使用 MoveTo 和 LineTo 函数来绘制正四面体的各个面。具体代码如下: ```cpp void CMyView::OnDraw(CDC* pDC) { CPen pen(PS_SOLID, 1, RGB(0, 0, 0)); // 创建黑色实线笔 CBrush brush(RGB(255, 0, 0)); // 创建红色填充刷 pDC->SelectObject(&pen); // 选择笔 pDC->SelectObject(&brush); // 选择刷 // 绘制正四面体的各个面 pDC->MoveTo(100, 100); pDC->LineTo(200, 100); pDC->LineTo(150, 200); pDC->LineTo(100, 100); pDC->MoveTo(100, 100); pDC->LineTo(150, 200); pDC->LineTo(50, 200); pDC->LineTo(100, 100); pDC->MoveTo(200, 100); pDC->LineTo(150, 200); pDC->LineTo(250, 200); pDC->LineTo(200, 100); pDC->MoveTo(50, 200); pDC->LineTo(150, 200); pDC->LineTo(100, 300); pDC->LineTo(50, 200); } ``` 在上面的代码中,正四面体的每个面都是由四个点连接而成的。可以使用 MoveTo 函数将笔移动到第一个点,然后使用 LineTo 函数连接每个点,最后再回到第一个点。 可以根据需要修改上面的代码,以绘制其他类型的柏拉图多面体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

配电网和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值