在matlab中加载stl文件并转换为3D数组

2023-12-09

我有一个 stl 文件,我已使用 stlread 函数将其加载到 Matlab 中。此时我有一组面和顶点。如何将这些面和顶点转换为 512x512x100 数组等 3D 二进制数组以获得二进制 3D 体积?


啊你真幸运。我最近正在处理 STL 文件,并且编写了一些函数来完成此任务。

首先,请注意您会失去精度。 STL 文件以任意精度表示任意形状,并将其转换为体积会导致离散化和损失。

也就是说,有一种非常简单的方法可以知道某物是在物体内部还是外部封闭的、连接的三角曲面,无论其是否凸:将光线投射到无限远并计算与曲面的交点。如果是奇数,则在内部;如果是偶数,则在外部。

您需要的唯一特殊代码是线-三角形相交,Möller Trumbore 算法是最常见的算法之一。

function in=inmesh(fv,points)
%INMESH tells you if a point is inside a closed,connected triangulated surface mesh
% Author: Ander Biguri
maxZ=max(fv.vertices(:,3));
counts=zeros(size(points,1),1);
for ii=1:size(points,1)
    ray=[points(ii,:);points(ii,1:2) maxZ+1];
    for jj=1:size(fv.faces,1)
        v=fv.vertices(fv.faces(jj,:),:);
        if all(v(:,3)<ray(1,3))
            continue;
        end
        isin=mollerTrumbore(ray, fv.vertices(fv.faces(jj,:),:));
        counts(ii)=counts(ii)+isin;
    end

end
in=mod(counts,2);
end

From 文件交换,稍作修改:

function [flag, u, v, t] = mollerTrumbore (ray,tri)
% Ray/triangle intersection using the algorithm proposed by Moller and Trumbore (1997).
%
% IMPORTANT NOTE: Assumes infinite legth rays.
% Input:
%    ray(1,:) : origin.
%    d : direction.
%    tri(1,:), tri(2,:), tri(3,:): vertices of the triangle.
% Output:
%    flag: (0) Reject, (1) Intersect.
%    u,v: barycentric coordinates.
%    t: distance from the ray origin.
% Author: 
%    Jesus Mena

    d=ray(2,:)-ray(1,:);
    epsilon = 0.00001;

    e1 = tri(2,:)-tri(1,:);
    e2 = tri(3,:)-tri(1,:);
    q  = cross(d,e2);
    a  = dot(e1,q); % determinant of the matrix M

    if (a>-epsilon && a<epsilon) 
        % the vector is parallel to the plane (the intersection is at infinity)
        [flag, u, v, t] = deal(0,0,0,0);
        return;
    end

    f = 1/a;
    s = ray(1,:)-tri(1,:);
    u = f*dot(s,q);

    if (u<0.0)
        % the intersection is outside of the triangle
        [flag, u, v, t] = deal(0,0,0,0);
        return;          
    end

    r = cross(s,e1);
    v = f*dot(d,r);

    if (v<0.0 || u+v>1.0)
        % the intersection is outside of the triangle
        [flag, u, v, t] = deal(0,0,0,0);
        return;
    end
    if nargout>3
        t = f*dot(e2,r); % verified! 
    end
    flag = 1;
    return
end

只需生成您的积分即可:

yourboundaries=% get the range of your data from the STL file.
[x,y,z]=meshgrid(yourboundaries);
P=[x(:) y(:) z(:)];
in=inmesh(fv,P);
img=reshape(in,yourboundariesSize);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在matlab中加载stl文件并转换为3D数组 的相关文章

  • Rails 从哈希数组中选择最大值

    我有一个像这样的哈希数组 我想取其中的最大值 data name abc value 10 0 name def value 15 0 name ghi value 20 0 name jkl value 50 0 name mno val
  • MATLAB 的函数 imfill() 导致错误

    我有一个二进制图像 720x1280 逻辑 其中有一些漏洞 所以我使用imfill来填充它 但是操作失败并且出现以下错误 Undefined function or variable eml assert all constant Erro
  • 多维数组中的数组值

    我有两个数组 他们看着像是 a1 array array num gt 1 name gt one array num gt 2 name gt two array num gt 3 name gt three array num gt 4
  • 为什么当我取消引用数组指针时,结果值是指向数组第一个元素的指针,而不是整个数组对象?

    include
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • 在php中循环多维数组并执行mysql插入(股票数据)

    我有一个多维数组 我希望循环遍历它并为数组中的值执行 mysql 数据库插入 我需要插入到 sql 查询中的数组值是 candles 0 complete candles 0 volume candles 0 mid h candles 0
  • 如何在 Visual C# 中清除数组

    我有一个整数数组 它们从 0 开始 然后填充一些值 然后我想将所有值设置回 0 以便我可以再次使用它 或者删除整个数组 以便我可以重新声明它并从全 0 的数组开始 您可以致电数组 清除 http msdn microsoft com en
  • Ruby 中的数组切片:不合逻辑行为的解释(取自 Rubykoans.com)

    我正在做练习鲁比 科恩斯 http rubykoans com 我对以下 Ruby 怪癖感到震惊 我发现它确实无法解释 array peanut butter and jelly array 0 gt peanut OK array 0 1
  • 如何对函数的输出使用索引? [复制]

    这个问题在这里已经有答案了 可能的重复 如何索引函数返回的 MATLAB 数组而不先将其分配给局部变量 https stackoverflow com questions 3627107 how can i index a matlab a
  • 向量数学,在两个向量之间的平面上查找坐标

    我正在尝试沿着样条线生成 3d 管 我有样条线的坐标 x1 y1 z1 x2 y2 z2 等 您可以在黄色插图中看到 在这些点上 我需要生成圆圈 其顶点将在稍后的体育场连接 这些圆需要垂直于样条线两条线段的 角 才能形成正确的管 请注意 出
  • 如何在Java中扩展数组而不更改其名称

    我想知道是否可以在 Java 中扩展数组而不更改其名称 因为我有多个方法链接到该数组 我正在考虑创建一个同名但两倍大的新数组 然后将第一个数组中的所有元素复制到第二个数组 这可能吗 基本上我想创建一个包含银行账户的数组 如果客户创建了太多账
  • C++ 从一组点进行平面插值

    我正在使用 PCL 点云 库用 C 进行编程 我的问题是 计算某些点的方差 但仅相对于平面的垂直轴 我会解释一下自己 所以我正在做的是将点云按表面平滑度划分为多个片段 区域生长分割 http pointclouds org document
  • 如何通过键查找最大和最小日期

    我有一个数组 a array 2010 05 03 gt 100 2010 05 04 gt 400 2008 05 01 gt 800 2011 01 01 gt 800 我如何找到最大值和最小值key date 例如 max gt 20
  • 如何从图像中去除颗粒状细节[重复]

    这个问题在这里已经有答案了 我用过adapthisteq以提高前景物体的可见度 然而 这似乎产生了颗粒状的噪点细节 如何从图像中去除这些颗粒状细节 我尝试过高斯模糊imgaussfilt虽然它确实消除了一些颗粒状细节 但图像中细胞的形状变得
  • VB6中如何将十六进制字符串转换为字节数组

    我有以下字节数组 Dim Template 1023 As Byte 然后我调用指纹扫描仪设备函数并返回以下内容 Template 0 70 Template 1 77 Template 2 82 Template 1023 0 然后我将字
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • Qcut Pandas:ValueError:Bin 边缘必须是唯一的

    我使用 Pandas 中的 Qcut 将数据离散化为大小相等的存储桶 我想要有价格桶 这是我的数据框 productId sell prix categ popularity 11997 16758760 0 28 75 50 524137
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可

随机推荐