第一步将使用convhull (如yar所建议 )来获取每个投影多边形区域的轮廓。 应该注意的是,这里要使用凸包,因为您要处理的是长方体,即长方体。 我认为您的第二个长方体(位于A(9:16, :) )的坐标中有错误,因此我将代码修改为以下内容:

A = [-100 -40 50

-100 -40 0

-120 -40 50

-120 -40 0

-100 5 0

-100 5 50

-120 5 50

-120 5 0

-100 0 52

-100 0 5

20 0 52

20 0 5

-100 50 5

-100 50 52

20 50 5

20 50 52

-30 70 53

-30 70 0

5 70 0

5 70 53

-30 120 53

-30 120 0

5 120 53

5 120 0];

theta = 60;

rota = [cosd(theta) -sind(theta) 0; sind(theta) cosd(theta) 0; 0 0 1];

R = A*rota;

您可以生成多边形轮廓并将其可视化,如下所示:

nPerPoly = 8;

nPoly = size(R, 1)/nPerPoly;

xPoly = mat2cell(R(:, 1), nPerPoly.*ones(1, nPoly));

zPoly = mat2cell(R(:, 3), nPerPoly.*ones(1, nPoly));

C = cell(1, nPoly);

for iPoly = 1:nPoly

P = convhull(xPoly{iPoly}, zPoly{iPoly});

xPoly{iPoly} = xPoly{iPoly}(P);

zPoly{iPoly} = zPoly{iPoly}(P);

C{iPoly} = P([1:end-1; 2:end].')+nPerPoly.*(iPoly-1); % Constrained edges, needed later

end

figure();

colorOrder = get(gca, 'ColorOrder');

nColors = size(colorOrder, 1);

for iPoly = 1:nPoly

faceColor = colorOrder(rem(iPoly-1, nColors)+1, :);

patch(xPoly{iPoly}, zPoly{iPoly}, faceColor, 'EdgeColor', faceColor, 'FaceAlpha', 0.6);

hold on;

end

axis equal;

axis off;

这是情节:

如果你想计算每个多边形投影的面积,把它们加起来那将是非常容易的:只要改变上述循环捕捉和总结,从呼叫第二输出convexhull :

totalArea = 0;

for iPoly = 1:nPoly

[~, cuboidArea] = convhull(xPoly{iPoly}, zPoly{iPoly});

totalArea = totalArea+cuboidArea;

end

但是 ,如果需要多边形并集的面积,则必须考虑重叠部分。 您有几种选择。 如果具有“ 映射工具箱”,则可以使用函数polybool获取轮廓,然后使用polyarea计算其面积。 首先,我们可以使用上面创建的边缘约束C来创建投影点的三角剖分时使用:

oldState = warning('off', 'all');

DT = delaunayTriangulation(R(:, [1 3]), vertcat(C{:}));

warning(oldState);

这将自动在约束边相交的地方创建新的顶点。 不幸的是,它还将对所有点的凸包执行三角剖分,填充我们不希望填充的点。 这是三角剖分的样子:

figure();

triplot(DT, 'Color', 'k');

axis equal;

axis off;

现在,我们必须确定不需要的多余三角形并将其删除。 我们可以通过找到每个三角形的质心并使用inpolygon来测试它们是否在我们每个单独的长方体投影的所有3个范围之外,来做到这一点。 然后,我们可以计算剩余三角形的面积,并使用polyarea ,得出投影的总面积:

dtFaces = DT.ConnectivityList;

dtVertices = DT.Points;

meanX = mean(reshape(dtVertices(dtFaces, 1), size(dtFaces)), 2);

meanZ = mean(reshape(dtVertices(dtFaces, 2), size(dtFaces)), 2);

index = inpolygon(meanX, meanZ, xPoly{1}, zPoly{1});

for iPoly = 2:nPoly

index = index | inpolygon(meanX, meanZ, xPoly{iPoly}, zPoly{iPoly});

end

dtFaces = dtFaces(index, :);

xUnion = reshape(dtVertices(dtFaces, 1), size(dtFaces)).';

yUnion = reshape(dtVertices(dtFaces, 2), size(dtFaces)).';

totalArea = sum(polyarea(xUnion, yUnion));

此示例的总面积为:

totalArea =

9.970392341143055e+03

注意:上面的代码已被概括为任意数量的长方体。

matlab 3维投影,matlab - 如何计算3维投影的面积? - 堆栈内存溢出相关推荐

  1. matlab读取格式重复,matlab - 为什么Xlsread以字符串形式读取(日期时间) - 堆栈内存溢出...

    我正在尝试阅读Excel工作表. 在同一台计算机上,我得到不同的结果. 我应该怎么做才能将日期时间读为日期而不是字符串? 我知道以后可以更改它,但是我需要为Octave和Matlab使用相同的代码. ...

  2. .dta matlab,matlab - 使用带有C DLL的delphi dta类型的问题 - 堆栈内存溢出

    这里的基本问题是二进制互操作不匹配之一. 简单地说,指向数组的指针在二进制级别与Delphi开放数组参数不同. 虽然它们在语义上都表示数组,但二进制表示不同. C函数声明如下: __declspec( ...

  3. matlab中的sift函数,matlab - 用Matlab从VLFeat中的SIFT描述符中提取VLAD - 堆栈内存溢出...

    首先,您需要获得一个视觉单词词典,或更具体地说:使用k -means聚类对所有图像的SIFT特征进行聚类. 在[1]中,推荐使用例如64或256个群集的粗略群集. 为此,我们必须将所有描述符连接到一个 ...

  4. matlab编译错误怎么查找,matlab - Matlab mex文件编译错误-“未启用SSE2指令集” - 堆栈内存溢出...

    在Matlab中编译mex文件的工具箱时,出现以下错误: In file included from /home/josh/Desktop/Project/code/toolbox/channels/ ...

  5. c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...

    我想使用Winsock通过UDP将数据从我的C ++应用程序发送到Matlab,并实时绘制数字. 例如:我得到了从1到10的数字,我想从C ++发送1,在Matlab中接收它,将其放在图形上(图,条等 ...

  6. matlab中rsa,matlab - Matlab中的RSA代码 - 堆栈内存溢出

    我想加密一条消息,例如" HELO1234" ,然后解密以获取原始消息.我已经在matlab中编写了无法正常工作的RSA代码. 参数计算 temp=1; range=1:10; k ...

  7. matlab多变量优化,matlab - Matlab使用fminsearch优化多变量 - 堆栈内存溢出

    我正在使用Matlab fminsearch来最小化带有两个变量的方程sum((interval-5).^2, 2)*factor间隔是一个包含5个值的向量. 只能从1到30的步长为1的顺序选择它们. ...

  8. Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...

    我制作了一个Matlab程序,它可以检测2个圆是否相交,并输出相交的坐标. 现在,我正在尝试将代码转换为vhdl以进行FPGA实现. 我的代码中在HDL Workflow Advisor中仍然存在错误 ...

  9. matlab两个数组竖向叠加,matlab - 过滤器同时使用两个数组中的元素 - 堆栈内存溢出...

    解决这个问题的方法是找到一种方法来组合A和B中的信息,以便过滤本身变得容易. 我想到的第一件事是沿着第三维连接A和B,并使用过滤器掩码传递,该过滤器掩码将从'A-slice'获取8个元素,从'B-sl ...

最新文章

  1. Activity-生命周期
  2. 访问数据库_如何访问虚拟主机中的数据库
  3. 如何屏蔽ctrl + v 粘贴事件,鼠标右键粘贴事件
  4. MathType输入补集符号的步骤有哪些
  5. deepin/Ubuntu安装最新版docker-ce命令整理
  6. Spring5的Web 组件
  7. java基础----递归实现文件搜索
  8. c 如何操作php,thinkphp的c方法使用示例
  9. 初学JAVA随记——代码练习(二元一次方程)
  10. 【报告分享】2021中国中高端人才趋势报告.pdf(附下载链接)
  11. Apache Lucene Java 全文检索引擎架构
  12. java爬虫技术怎么学_java网络爬虫基础学习(四)
  13. ubuntu-安装qt+gdb-imagewatch
  14. 黑莓9530完美刷机教程
  15. 使用mathematica求解最优化模型
  16. MindSpore:自然语言处理(NLP)—分词技术
  17. 将谷歌浏览器 Chrome 已安装的插件打包成 crx 给其它电脑离线安装 +【怎么安装Chrome插件】安装Chrome第三方插件
  18. HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程
  19. 文件夹加密超级大师 v13.10 是什么
  20. 【转】超级珍贵的卤水秘方大全!

热门文章

  1. 6-2 两个字符串穿插 (10 分) pta c语言
  2. rt thread studio使用QBOOT和片外flash实现OTA升级
  3. 例说图解TCP/IP协议族--TLS篇(1)抓包分析SSL/TLS握手
  4. 晶振PPM,PPB单位换算
  5. 【转载】区块链-概述
  6. 三种将list转换为map的方法
  7. 简报悦读:教育部取消5类高考加分项目,猿辅导纪录片讲述十年坚守
  8. STM32入门开发--LED模块实现跑马灯
  9. mysql中设计suk表_电商项目-商品表(spu)、规格表(sku)设计
  10. 对JavaScript 标签语句的简单理解