matlab 3维投影,matlab - 如何计算3维投影的面积? - 堆栈内存溢出
第一步将使用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维投影的面积? - 堆栈内存溢出相关推荐
- matlab读取格式重复,matlab - 为什么Xlsread以字符串形式读取(日期时间) - 堆栈内存溢出...
我正在尝试阅读Excel工作表. 在同一台计算机上,我得到不同的结果. 我应该怎么做才能将日期时间读为日期而不是字符串? 我知道以后可以更改它,但是我需要为Octave和Matlab使用相同的代码. ...
- .dta matlab,matlab - 使用带有C DLL的delphi dta类型的问题 - 堆栈内存溢出
这里的基本问题是二进制互操作不匹配之一. 简单地说,指向数组的指针在二进制级别与Delphi开放数组参数不同. 虽然它们在语义上都表示数组,但二进制表示不同. C函数声明如下: __declspec( ...
- matlab中的sift函数,matlab - 用Matlab从VLFeat中的SIFT描述符中提取VLAD - 堆栈内存溢出...
首先,您需要获得一个视觉单词词典,或更具体地说:使用k -means聚类对所有图像的SIFT特征进行聚类. 在[1]中,推荐使用例如64或256个群集的粗略群集. 为此,我们必须将所有描述符连接到一个 ...
- matlab编译错误怎么查找,matlab - Matlab mex文件编译错误-“未启用SSE2指令集” - 堆栈内存溢出...
在Matlab中编译mex文件的工具箱时,出现以下错误: In file included from /home/josh/Desktop/Project/code/toolbox/channels/ ...
- c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...
我想使用Winsock通过UDP将数据从我的C ++应用程序发送到Matlab,并实时绘制数字. 例如:我得到了从1到10的数字,我想从C ++发送1,在Matlab中接收它,将其放在图形上(图,条等 ...
- matlab中rsa,matlab - Matlab中的RSA代码 - 堆栈内存溢出
我想加密一条消息,例如" HELO1234" ,然后解密以获取原始消息.我已经在matlab中编写了无法正常工作的RSA代码. 参数计算 temp=1; range=1:10; k ...
- matlab多变量优化,matlab - Matlab使用fminsearch优化多变量 - 堆栈内存溢出
我正在使用Matlab fminsearch来最小化带有两个变量的方程sum((interval-5).^2, 2)*factor间隔是一个包含5个值的向量. 只能从1到30的步长为1的顺序选择它们. ...
- Matlab 生成vhdl,matlab - 使用HDL Workflow Advisor将Matlab代码转换为vhdl - 堆栈内存溢出...
我制作了一个Matlab程序,它可以检测2个圆是否相交,并输出相交的坐标. 现在,我正在尝试将代码转换为vhdl以进行FPGA实现. 我的代码中在HDL Workflow Advisor中仍然存在错误 ...
- matlab两个数组竖向叠加,matlab - 过滤器同时使用两个数组中的元素 - 堆栈内存溢出...
解决这个问题的方法是找到一种方法来组合A和B中的信息,以便过滤本身变得容易. 我想到的第一件事是沿着第三维连接A和B,并使用过滤器掩码传递,该过滤器掩码将从'A-slice'获取8个元素,从'B-sl ...
最新文章
- Activity-生命周期
- 访问数据库_如何访问虚拟主机中的数据库
- 如何屏蔽ctrl + v 粘贴事件,鼠标右键粘贴事件
- MathType输入补集符号的步骤有哪些
- deepin/Ubuntu安装最新版docker-ce命令整理
- Spring5的Web 组件
- java基础----递归实现文件搜索
- c 如何操作php,thinkphp的c方法使用示例
- 初学JAVA随记——代码练习(二元一次方程)
- 【报告分享】2021中国中高端人才趋势报告.pdf(附下载链接)
- Apache Lucene Java 全文检索引擎架构
- java爬虫技术怎么学_java网络爬虫基础学习(四)
- ubuntu-安装qt+gdb-imagewatch
- 黑莓9530完美刷机教程
- 使用mathematica求解最优化模型
- MindSpore:自然语言处理(NLP)—分词技术
- 将谷歌浏览器 Chrome 已安装的插件打包成 crx 给其它电脑离线安装 +【怎么安装Chrome插件】安装Chrome第三方插件
- HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程
- 文件夹加密超级大师 v13.10 是什么
- 【转】超级珍贵的卤水秘方大全!