matlab 几何,[matlab] 19.matlab 基础几何学

polyshape

函数可创建由二维顶点定义的多边形,并返回具有描述其顶点、实心区域和孔的各种属性的 polyshape 对象。例如,pgon = polyshape([0 0 1 1],[1 0 0 1]) 将创建由四个点 (0,1)、(0,0)、(1,0) 和 (1,1) 定义的实心正方形。

pgon = polyshape(x,y) 从由 x 坐标向量和对应的 y 坐标向量定义的二维顶点创建 polyshape。x 和 y 的长度必须相同,且至少要有三个元素。

e6ef1c3ea1c1fae63655f7052b7798102be.jpg

bb2aefc85a87e52919c43b08e20164f18fd.jpg

pgon = polyshape([0 0 1 1],[1 0 0 1]);

figure(4)

plot(pgon)

polyshape 二维多边形构建

b069b97f14c2aa5ab08181ee864902d9.png

nsidedpoly 正多边形

pgon = nsidedpoly(n,Name,Value)

96202678a3d7865ff31b3e9a9ba45c6f700.jpg

95da07d0b450e2ce90b86bb58453b5c897e.jpg

pgon1 = nsidedpoly(6);

pgon2= nsidedpoly(6,'Center',[5 0],'SideLength',3);

figure(4)

plot([pgon1 pgon2])

axis equal

nsidedpoly(正多边形)

5cc76499b4afadfb82fe3af78980800b.png

polyarea计算多边形的面积

503f10ea057bda92173e247973a5b8ecce2.jpg

39f326de3c443c5faf4ebafb9c787d1ad79.jpg

L = linspace(0,2.*pi,100);

xv= 1.2*cos(L)';

yv = 1.2*sin(L)';

xx=1.1*cos(L)';

yy=1.1*sin(L)';

AA=polyshape(xv,yv);

AAA=polyshape(xx,yy);

plot(AA);

hold on;

plot(AAA);

title(['Area ='num2str(A)])

axis image

A= polyarea(xv,yv) %计算面积

polyarea 计算多边形面积

f86947ff251ea9d854b836a7c2c86621.png

inpolygon 位于多边形区域边缘内部或边缘上的点

in = inpolygon(xq,yq,xv,yv)  返回 in,以指明 xq 和 yq 所指定的查询点是在 xv 和 yv 定义的多边形区域的边缘内部还是在边缘上

[in,on] = inpolygon(xq,yq,xv,yv) 还返回 on 以指明查询点是否位于多边形区域的边缘。

749f35ce3d3dc6e8157dea1459e9030ade1.jpg

61b0948f859cadb32f6f18fcb30fa9da05e.jpg

clc,clear all;

L= linspace(0,2.*pi,100);

xv1= 1.2*cos(L)';

yv1 = 1.2*sin(L)';

xv2=0.4*cos(L)';

yv2=0.4*sin(L)';

Round1=polyshape(xv1,yv1);

Round2=polyshape(xv2,yv2);

Round1Area=polyarea(xv1,yv1)

Round2Area=polyarea(xv2,yv2)

rng default%恢复matlab启动时默认的全局随机流

xq= randn(250,1); %随机生成250个正态分布点

yq= randn(250,1); %随机生成250个正态分布点in = inpolygon(xq,yq,xv1,yv1); % numel(xq(in))查看在几何体内部的数量

figure(4)

plot(Round1);%画第一个圆

hold on;

plot(Round2);%画第二个圆

plot(xq(in),yq(in),'r+') %标记在内部的点

plot(xq(~in),yq(~in),'bo') %标记在外部的点

hold off

title(['Area1,Area2 ='num2str(Round1Area),num2str(Round2Area)])

axis equal

axis image

凸多边形内的点

d17b1cb0c88c744d4ca707213a9adfa8.png

8e82035cb589a6476e0da99a0288b50f6cf.jpg

ac77133efcf9dd884f248a1e7cce785bf9c.jpg

axes('xlim',[0 10],'ylim',[0 10])

a=[1 1 2 2];

b=[3 4 5 6];

c=[1 1 3 3];

figure

rectangle('position',a,'EdgeColor', 'r');

rectangle('position',b,'EdgeColor', 'b');

rectangle('position',c,'EdgeColor', 'k');

area_ab=rectint(a,b)

area_ac= rectint(a,c)

rectint 矩形交叉区域

f110b49d0e5c1653417fac1eb2680cdd.png

e30d844d8b54cddcc0fff7a0a78c8a4c.png

area = rectint(A,B) 返回位置向量 A 和 B 指定的矩形的交叉区域。

如果 A 和 B 分别指定一个矩形,则输出 area 为标量。

A 和 B 还可以是矩阵,其中每行是一个位置向量。area 是一个矩阵,为 B 指定的所有矩形提供 A 指定的所有矩阵的交叉区域。即,如果 A 是 n×4 并且 B 是 m×4,则 area 是 n×m 矩阵,其中 area(i,j) 是 A 的第 i 行和 B 的第 j 行指定的矩形的交叉区域。

92f66df8f0ffb776c7d156003add6889c61.jpg

cee0315ad9d12ff2d709b13c6a54ab67d23.jpg

a=1;b=1.5;d=0:360;

x=a*cosd(d);

y=b*sind(d);

figure(1),cla

patch(x+0.6,y+0.2,'b','edgecolor','none','facealpha',0.15);%不透明度0.15patch(x-0.6,y-0.2,'b','edgecolor','none','facealpha',0.15);%不透明度0.15patch(x-0.2,y+0.9,'b','edgecolor','none','facealpha',0.15);%不透明度0.15patch(x+0.2,y-0.9,'b','edgecolor','none','facealpha',0.15);%不透明度0.15axis equal

box on;

set(gcf,'color','w');

半透明重叠加深 patch函数

70d334f8f95ab8adbda17b707abe049a.png

f7c681a28e3bcfaed933b74285180fa123a.jpg

a8ee8fc6247ceef87bee1de6b49537a4649.jpg

v1 = [2 4; 2 8; 8 4];

f1= [1 2 3];

figure

patch('Faces',f1,'Vertices',v1,'FaceColor','red','FaceAlpha',.3);

v2= [2 4; 2 8; 8 8];

f2= [1 2 3];

patch('Faces',f2,'Vertices',v2,'FaceColor','blue','FaceAlpha',.5);

通过将 FaceAlpha 属性设置为 0 和 1 之间的值,创建两个半透明的多边形。

ea0fa34dc0f7b897c70a0412578d99b4.png

boundary二维或三维空间内的一组点的边界

7d87247233117be87274796d5cca232468f.jpg

f77e0bea657eafcecba23e70f18472ba691.jpg

x = gallery('uniformdata',3000,1,1);

y= gallery('uniformdata',3000,1,10);

plot(x,y,'k.')

xlim([-0.3 1.2])

ylim([-0.3 1.2])

k= boundary(x,y); %返回一个表示包围点 (x,y) 的单个相容二维边界的点索引向量。收缩因子为1

hold on;

line(x(k),y(k),'color','b');

j= boundary(x,y,0.01); %收缩因子为0.1最大为1 越大包裹性越紧

line(x(j),y(j),'color','r');

[~, vol] = boundary(x,y); %包围点形成的形状的体积 或 面积

axis equal;

vol%返回 包围的体积或者面积

boundary 二维或三维空间内的一组点的边界

7c8f945a259c3bf74978ff83ee8696d8.png

[~, vol] = boundary(x,y); %包围点形成的形状的体积

axis equal;

vol 可以输出二维平面 各个点包围的面积

665a079532bd748e217ff87637781ea3.png

b1d7051f0ca12e71f8eab8b85e29a6d9ec1.jpg

c57afdb5970c52fd6599e7da6a2596c0f2e.jpg

P = gallery('uniformdata',30,3,5);

subplot(1,2,1);

plot3(P(:,1),P(:,2),P(:,3),'.','MarkerSize',10)

axis equal;

grid on

k=boundary(P);

hold on

subplot(1,2,2);

trisurf(k,P(:,1),P(:,2),P(:,3),'Facecolor','red','FaceAlpha',0.1) %收缩因子默认0

[~, vol] = boundary(P); %包围点形成的形状的体积

axis equal;

vol%体积

三维

d671c3d5628097b0b7955b5425ea940d.png

[~, vol] = boundary(P);   vol 返回体积

convhull 凸包

ce9a7898dd4c6c5862ad130c52647b93985.jpg

d5be17edc4c20e768a9a76184913b4e857f.jpg

xx = -1:.05:1;

yy=abs(sqrt(xx));

[x,y]=pol2cart(xx,yy);

k=convhull(x,y);

plot(x(k),y(k),'r-',x,y,'bo')

二维凸包

13ac1ad34358e1834a9bf43245fcf0f1.png

alphaShape 依据二维和三维中的点构建的多边形和多面体

eec946739c997e6090d26b81850f883cbb5.jpg

27d273a3c9fcada16ec2e1cbcfc4c71ad56.jpg

th = (pi/12:pi/12:2*pi)';

x1 = [reshape(cos(th)*(1:5), numel(cos(th)*(1:5)),1); 0];

y1= [reshape(sin(th)*(1:5), numel(sin(th)*(1:5)),1); 0];

x= [x1; x1+15];

y=[y1; y1];

subplot(1,2,1)

plot(x,y,'.')

axis equal

subplot(1,2,2)

shp= alphaShape(x,y); %默认 alpha 半径可生成带不规则边界的 alpha 形状。

shp.Alpha= 2.5; %要更好地捕获点集边界,请尝试更大的alpha 半径。

plot(shp)

axis equal

alphaShape alphaShape 创建一个可将一组二维或三维点包围起来的边界面或三维体。

514250529838e8f678dcd2cb19deefcf.png

delaunayTriangulation

使用 delaunayTriangulation 对象可以基于一组点创建二维或三维 Delaunay 三角剖分。对于二维数据,您也可以指定边约束。

99d58198af40b9491f2a57d44c62e03cab0.jpg

d296b88d38e56a74eb3208c8de5adde1cf7.jpg

P = gallery('uniformdata',[30 2],0);

DT=delaunayTriangulation(P);

IC=incenter(DT);

triplot(DT)%绘制 Delaunay 三角剖分

hold on

plot(IC(:,1),IC(:,2),'*r')

绘图

7fd7f6a1f0514191fcde2d62e86819df.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值