文件交换

图片缩略图

geom3d

版本1.24 (922 KB) 大卫Legland
三维形状的几何计算库:网格,点,线,平面…

153下载

更新2019年9月26日

查看许可协议

编者按:这个文件被选为MATLAB中央选择的

geom3d库的目的是处理和可视化三维几何基元等点,线,平面,多面体……它提供低级函数操纵3 d几何基元,使简单的发展更复杂的几何算法。

引用作为

大卫Legland (2020)。geom3d(//www.tianjin-qmedu.com/matlabcentral/fileexchange/24484-geom3d), MATLAB中央文件交换。检索

评论和评级(273年)

你好大卫,

伟大的工作!我喜欢使用这个库。我有一个问题困惑我createBasisTransform3d.m
% % % % % % % % % % % % % % % % % % % % % % % % %
源= [0 0 0 1 0 0 0 0 1);
目标= [0 0 0 0 1 0 0 0 1);
tForm = createBasisTransform3d(源、目标);
tForm = transformPlane3d(源)

了=
0 0 0 0 0 1 1 0 0

我预计=目标。我会很感激如果你能解释我失踪。谢谢你的时间。
最好的

嗨,约翰,

创建的“面孔”元素的网格顶点,有不同的方法,但这需要添加顶点是邻居的假设。没有实现geom3d(除非创建凸包就够了吗?)。

我会检查你的主张clipConvexPolyhedronHP(有一天,我将实现一个清洁clipMesh函数…);

嗨Ramaswamy Kasyap Pantangi,
有一个函数画一个气缸(称为drawCylinder)。没有“直接”的方式画出半圆柱(我不确定你的意思),但我觉得,检查的代码drawCylinder应该帮助你实现你自己的函数。
最好的,

嘿,大卫,
我相信会有clipConvexPolyhedronHP修复可能的函数,在最后一个循环,我们可以添加一个
脸(= = 0)= [];
以确保我们正在使用的脸不包括任何顶点0索引使用飞机切断。

嘿,大卫,我有一个问题关于我可以从Nx3数组创建一个3 d网格顶点(对不起,如果这是一个简单的问题)。我试着steinerPolytope函数和surfToMesh函数,但是这些似乎不适合我。顶点数组中没有特定的顺序,我想返回Faces-Vertices表示,这样我可以使用图书馆的其他功能。

谢谢你的图书馆!我是相对较新的Matlab,我发现这些3 d功能快速和容易使用。

我怎么能画一个半圆柱形衬托nbym网格

曹香洲

甄你们

jdiva6t9

嗨,棕褐色的表象,
我怀疑这是由于发生一些变化,自2008年以来Matlab图形部件管理的方式。具体的错误信息是什么?总之,我建议使用最新版本。

谭表象

为什么当我在2008 b使用drawCube函数抛出错误的补丁函数但当我运行在2016年运行完美吗?谢谢你,抱歉我的坏英语!

大胡

@David Legland你好大卫,希望看到你的贡献为三维实体网格。到目前为止,你知道其他matlab图书馆可以吗?

@Xiaofei胡小姐:三维实体网格并不由geom3d库管理。我已经做了一些尝试通过考虑顶点+边缘+脸+固体结构,但没有获得足够稳定的结果。

大胡

你好,大卫,很好的工作。我想知道它可以生成3 d对象的网格与三维实体元素(例如四面体),就像在有限元网格。你能告诉我一个办法,谢谢。

工作完全大卫谢谢你。

@Jordan:我看到;一个解决方案是使用第二个“intersectLineMesh3d”函数的输出参数。它对应于直线的交点的位置。0对应位置线。如果位置< 0,它对应于180°。如果位置> 1,它对应于一个由多个翻译方向向量。通过调整规范的“线”的方向向量输入参数(参数# 4到# 6),你应该得到你想要的。

谢谢你的回复大卫,边缘函数在策划一个有限线工作,但是我发现它并没有解决我的问题。我试图用这有限的线来确定网格的相交点。我的问题是,行是源自一个中心点在一个圆形模式(想象一个车轮铺设平坦)。例如网是一个盒子躺在原点,我希望能够计算多少辐条轮的网格相交,我能做到这一点,但我也得到路口源自180°线因为它们不是有限的在一个方向上从起点。我不认为有一个intersectEdgeMesh3d函数。

晶晶孟

嗨,约旦,

我认为你可以使用相关的功能“边缘”(我本库中使用的术语“有限”两点之间行)。您可以创建一个边缘的连接两个点的坐标(E - > = [P1 P2])。你ca ndraw drawEdge函数。看看这个文件”边缘。“对于一个更详细的文档。

大卫,谢谢你的伟大的图书馆。当创建一个3 d线是否有办法有这条线之间只存在两个特定点而不是一个看似无限的线穿过两个指定点哪一个?例如如果我有点P1和P2我要行这两点之间只存在,不是超越指向任何方向。我希望这是可以理解的,如果需要乐意提供更多细节。再次感谢。

@Sadeep,不,没有这样的功能在图书馆。

这是否有任何函数检查是否两个随机椭圆体相交吗?谢谢你!

@Sergio ABP, @the neuromechanists:谢谢你的反馈,我已经更新了相应的主存储库。
@Golak Mahanta:是的,重心函数geom2d工具箱的一部分。你只需要下载它。我在下一个版本将包含所请求的文件以促进geom3d的使用。

@Golak Mahanta
“重心”是一个Matlab的核心功能,它介绍了R2017b。这也是Geom2d函数。鉴于minConvexHull远在2017年之前就已经存在,我认为你只需要导入Geom2d工具箱。

Matlab的质心功能://www.tianjin-qmedu.com/help/matlab/ref/polyshape.centroid.html
Geom2d重心://www.tianjin-qmedu.com/matlabcentral/fileexchange/7844-geom2d

未定义的函数或变量“重心”。

错误minConvexHull(第61行)
pointsCentroid =质心(点);

错误createSoccerBall(37)行
f = minConvexHull (n) ';

嗨,大卫
首先谢谢你的优秀的代码。它已经救了我几天或者几周的编码。
我工作在你的“distancePointMesh”,我认为我注意到一个微妙的inconsitency变量名的线性算法。一旦我跑的代码,它把这个错误:

未定义的函数或变量“minDist”。

错误distancePointMesh(第124行)
如果distf < minDist

这是有道理的,因为minDist根本不是之前定义(有一个地方在第113行,“距离”是与正得到预先分配)。
所以我做的修复,为我工作包括以下:
1 -“经销”更改为“距离”线路1,91年、93年和104年。
2 -“经销”改为“minDist”第113行。

谢谢你,圣诞快乐。

塞吉奥ABP

我添加这行文件drawCylinder。米后“% %显示缸网”,允许透明度:

α= 1;
k = 1:长度(变长度输入宗量)
如果(strcmp(变长度输入宗量(k),“FaceAlpha”))
α=变长度输入宗量{k + 1};
结束
结束

和改变这一行:
:补丁(x2 (1), y2 (1:), z2(1:)的,颜色,edgeColor”、“没有”、“FaceAlpha”、α);
:补丁(x2 (2), y2 (2:), z2(2:)的,颜色,edgeColor”、“没有”、“FaceAlpha”、α);

漂亮的图书馆!

张@Tao:谢谢你的补丁!我有他们的主分支MatGeom库(https://github.com/mattools/matGeom.git)。他们将被纳入下一版本。

张道

其他输入错误:
“createRotationOx”line51: elseif长度(变长度输入宗量)= = 3应该是= = 4,和line56应该θ=变长度输入宗量{4}
“createRotationOy”line55: dy = 0应该dy =变长度输入宗量{2},和line56应该dz = 0
“createRotationOz”line53: elseif长度(变长度输入宗量)= = 3应该是= = 4,和line58应该θ=变长度输入宗量{4};

张道

你好大卫,
只是注意到一些小的拼写错误:
“polygonArea3d”亲切问好:vn = vectorNorm (cp)可以取代vn = vectorNorm3d (cp),这样工具箱是自包含的。
“polygonCentroid3d”line33: elseif输入参数个数= = 2应该elseif输入参数个数= = 3

@Chitan甘地:intersectPlaneMesh函数可以仅适用于封闭曲面网格。当网是开放的,有些边缘连接到只有一个脸,一个获得你的错误。增强TODO列表,而不是直接管理…

@Laslo Kormoczi:我已经提交了一个新版本打包为工具箱。这不是之前的版本。所以现在应该更好的工作。

你好大卫,
我能够满足使用功能和工作得很好。现在,我使用intersectplanemesh函数网(安排在所需的格式从.STL数据)。它给了我错误:错误使用intersectPlaneMesh(第85行)
交叉边缘1(7、8)相关联的面孔。你能帮助我关于错误。

你好大卫,

在当前版本工具箱安装程序不设置matlabPath包括工具箱文件夹。请检查配置。xml mltbx文件中。

@Chitan甘地:当然!这个函数创建管理多边形网格的脸有很多顶点。你可以试试以下几点:
[V, E, F] = createDodecahedron;
F2 = triangulateFaces (F);
drawMesh (V, F2);
轴相等;视图(3);

你好大卫,
我想用满足功能,能满足面对拥有超过4顶点?

@Resmi约翰逊:似乎有一些限制在代码生成函数或脚本包含细胞功能。看到例如https://uk.mathworks.com/help/万博1manbetxsimulink/ug/cell-array-restrictions-for-code-generation.html。我将试着看看,但是我不确定我是否能解决这个很容易…

你好大卫,
在我的项目中,我使用嵌入式程序员从matlab生成C代码,所以虽然从matlab生成C代码,我得到错误对细胞的功能函数的intersectPlaneMesh(飞机,v, f)”。所以你能帮我解决这个问题。

@resmi约翰逊:细胞功能是Matlab多年的一部分,所以我不是很明白这个问题从何而来……它的目的是分配给定大小的数组(在这里,1-by-nFaces),包含数据和各种类型或维度。同时,你所说的“生成代码”指的是什么?

你好大卫,
我用函数的intersectPlaneMesh(飞机,v, f)”在我的一个模拟世界中。当我试图生成的代码,它给了我一个错误,因为“细胞”功能。你能建议一个替代的解决方案这个代码可生成。
提前谢谢。

pcidreir

大卫,谢谢你的帮助和快速回复

嗨Nawar,
对不起,有一个bug orientedBox3d函数…作为一个快速修复,你可以替代55由以下行:
markers2d = [0 0;L1/2 0;0 L2/2];
我很快就有一个新版本。
大卫

嗨,大卫
非常感谢您的代码。
我试图使用orientedBox3d函数但我总是最后分箱外,我做错了什么?谢谢

X =兰德(300 3);
box3d = orientedBox3d (X);

@claudio:函数“isPointInPolygon”是包含在“geom2d”贡献,FileExchange。如果你downloadit并安装它,这将解决pbm。
我将试着在将来发布的版本中包括丢失的文件,以避免这样的坏的惊喜……
大卫

@Sunita:对不起,长期拖延……函数“clipConvexPolygon3dHP”并不为一个立方体直接工作,但是可以创建六个飞机对应立方体的每个面,并应用函数的六倍。我将试着这种方法包括一个打包的版本(这是最初的计划,事实上……)。它*不*为三角工作表面(虽然它应该可以叫它为每个三角形,但是会相当低效)。
你可以检查“clipMeshVertices”功能- >分析适用于表面,通过指定一个边界框(你只需要将多维数据集转换成边界框)。然而,它并不夹框- >它仅保留的三角形顶点位于盒子,和附加的面孔。

你好大卫,当我使用“intersectRayPolygon3d”和“intersectLinePolygon3d”功能,我有这个错误信息:
未定义的函数或变量“isPointInPolygon”。
如何解决这个问题? ?功能“isPointInPolygon”在哪里?

@David谢谢你的建议和你的代码很有用。
@David clipConvexPolygon3dHP的函数工作要剪辑的三角形的面积内表面一个立方体?它给的交集点和多维数据集内的立方体即三角面吗?

@Patrick谢长廷:首先可能是结合几个刚性变换矩阵:一个用于翻译平面中心,一个旋转的第一个方向向量,旋转,另一个方向向量。库提供的函数用于创建旋转矩阵在X, Y,或Z轴。困难之一是计算旋转角度(s)从飞机的方向向量。量化函数应该帮助。
此外,你可以检查“createBasisTransform3d”功能。原理是计算(刚性)变换矩阵,将地图点飞机从一个到另一个平面。我怀疑你可以使用它在一个相当简单的方法,如果我udnerstand好你的问题。

我应该改述我的问题。序列的功能应该使用为了改变一个三角面到另一个,这样他们有一个顶点重叠和方向的任何一个包含共同的顶点对齐的两条边。例如,他们都有一个顶点在(0,0,0),躺在xy平面,和有一个边缘坐在X轴?

我正在做研究囊泡在立体的变形。你的代码是非常有用的。transformPlane3d是正确的选择,如果我想改变一个trangular xy平面表面?

嗨萨尼塔,
飞机必须1-by-9数组参数,必须1-by-4和球面参数。可以一次处理多个输入,但是在这种情况下,两个输入必须有相同数量的行,或者两个输入必须有一行。
计算圆的面积,需要提取他第四列中国保监会的输出,并使用面积=π* r ^ 2的公式。
希望这可以帮助?
大卫

在得到圆的面积如何计算这些圆圈

错误使用intersectPlaneSphere(46行)
数据应该有相同的长度,或一个数据应该的长度是1

错误Finalsurface(第299行)
中国保监会= intersectPlaneSphere(飞机,年代);
如何解决这个问题? ?

嗨Jihee,
这是一个函数,我想包括在很长一段时间……一个快速解决方案是使用“intersectLineMesh3d”功能。创建行,选择一个方向时,计算的十字路口,和删除“位置”下面比0的点,一个获得十字路口一个3 d射线来自这一点。如果十字路口的数量是奇数,那么在网格点。但是我没有测试稳定性。

Jihee汉

谢谢你的快速反应。
我有一个问题。
我应该用什么代码来检查一个点是否在一个多面体吗?
提前谢谢。

嗨Jihee,
谢谢你的反馈!
目前,没有完全通用的函数计算两个多面体的十字路口。你猜,这是一个复杂的问题…然而,您可以考虑“clipMeshVertices”和“cutMeshByPlane”功能。如果凸的一个网,剪裁飞机的其他网格对应每个面可以是一个可行的解决方案。
和…是的,我想这样的一个函数包含在未来!

Jihee汉

Jihee汉

谢谢你的分享。
这个文件对我来说是非常有用的找到任何交集点。在你的代码例子很容易理解和使用代码。
但是,我找不到一个代码,给两个多面体之间的十字路口。
我想它应该是一个复杂的问题,因为一个多面体的定义是由多个面孔和顶点,然后有两个。
有什么想法找到两个多面体之间的交叉结合当前代码geom3d / mesh3d吗?
或者,如果可能的话,你能考虑一个代码,发现两个多面体之间的交集在将来的版本吗?
再次感谢你的帮助!

@Faez:目前,不可能使用多个多边形函数“intersectRayPolygon3d”。然而,我认为这是可能实现的组合两个函数(intersectRayPolygon3d和TriangleRayIntersection),避免使用repmat和允许多个输出。我将试着调查为将来的版本。

你好大卫,

有可能找到交集射线的数量有不同的起源与多面体(脸和顶点)使用函数(intersectRayPolygon3d)。因为我明白,这个函数可以为多个射线工作但单一的多边形。但是我找的是多个射线,多个多边形(多面体)。
雅罗斯瓦夫Tuszynski所做的,在一个名为(TriangleRayIntersection)的函数。但这个函数使用repmat时的反应有点慢。

非常感谢。

你好,凯瑟琳,
我不使用STL文件,所以这将是复杂的对我来说,回答准确。“intersectLinePolygon3d”以作为第二个输入多边形的顶点坐标的列表。如果存储为一系列face-vertex STL,也许有一个问题在生成这个列表吗?你可以用电子邮件寄给我最小的工作示例,我将试着看看。

你好大卫,
我想用你的函数intersectLinePolygon3d找到一条线之间的交点,一个stl对象。我只是使用顶点为变量“保利”但我不得到一个十字路口时应该有2。我在想如果我输入“保利”在这种情况下工作吗?
谢谢你!

@David:不幸的是我不使用PDE工具箱,所以我不知道是否有可能在geom3d建立这样的模型使用的函数…

感谢大卫深思熟虑的一组功能。我有一个问题关于建立一个堆栈长方体的宽度和深度,可用于模型的功率半导体元件热分析通过PDE工具箱。每个长方体需要有自己的热特性。我知道我可以使用matlab“multicuboid”功能来创建一个多单元几何如果所有的长方体有相同的宽度和深度。

我可以使用你的图书馆创建半导体模型?

谢谢你!

汉娜

谢谢你大卫,这是聪明的。我整理解决方案当气瓶直立但是这已经解决了这个问题我刚刚当我旋转圆柱体。

@sarvenaz: 4 *π因素来自于两件事。首先,意味着宽度成正比的“平均曲率积分”比2 *π。然后,平均曲率是集中在边缘(没有曲率在脸上,没有contibution顶点)。对于每一个优势,一个主曲率为零,另一个是反角相邻的面孔。因此一个额外的2倍,导致2 * 2 *π= 4 *π。您还可以检查裁判在“polyhedronMeanBreadth”。

嗨,大卫
谢谢你的实际代码
我用“trimeshMeanBreadth”太棒了
但是我有一个问题关于最后的公式
我想知道把“4π”在八,它是什么?

@Miten:我已经提交了一个新版本,应该解决你提到的奇怪的行为。
@Hannah:我有添加检测之间的交叉线和汽缸节流。现在这应该更适合你!
此外,许多功能已更新和几个新的介绍。详情查看GitHub回购(https://github.com/mattools/matGeom)

@Hannah:事实上,气缸被认为是“开放”。如果你需要极端的十字路口,一种方法是计算交叉线的3 d平面包含的气缸(实际上,你需要考虑两个平面,一个为每一个肢体)。然后您可以测试如果交点之间的距离和缸主要轴小于圆柱半径。我将试着下一个版本中添加这种行为。

汉娜

你好大卫,
我想通过气缸使用intersectLineCylinder计算路径长度。它工作得非常好,直到直线气缸的一边,但足够的角度出来。输出只有一组坐标。这是因为缸的顶部并不像表面承认吗?如果是这种情况,你有什么建议我可以如何解决呢?
多谢,汉娜

太好了!我总是回到VTK对3 d的计算几何(比较MR光谱学和斜先生成像平面)但这工具包使它容易。很清楚,简洁。

你好大卫,

我想了解如何使用geom3d图书馆将一系列的平面点到平面定义为一系列不同的平面点。

例如,如果我有一系列的点定义一个单位圆在YZ平面上集中在0,0,0,我有一架飞机在一个随机的三维角度和随机坐标然后我想全球3 d原点定义相同的单位圆上那架飞机。

作为一个测试,我的理解,我设立了一个矩阵的“z”以下4点z = [0 1 0;0 0 1;0 1 0;0 0 1)。这些都是全球飞机上。我想翻译一下飞机定义为[0.0544 0.0000 0.0000 0.0000 0.9959 -0.0901 0.0000 -0.0901 -0.9959]。这就是目的地简化测试飞机在YZ平面,只是翻译沿着X轴。

我用以下语句:
z = [0 1 0;0 0 1;0 1 0;0 0 1);
lp = [0.0544 0.0000 0.0000 0.0000 0.9959 -0.0901 - 0.0000 -0.0901 - -0.9959);
t = createBasisTransform3d(“全球”,lp)

transformPoint3d (z, t)

0.9959 -0.0901 0.0544
0.0901 0.9959 0.0544
-0.9959 0.0901 0.0544
-0.0901 -0.9959 0.0544

这不是我预期的。首先目的地的飞机是由0.0544 X轴而新的翻译点有这个翻译反映了Z的坐标。

另外,由此产生的X, Y坐标是什么我认为应该在Y, Z坐标。此外,在四个点是逆时针旋转(如果X ' > Y, Y ' > Z)而原始点顺时针旋转。

你能建议我在哪里出了问题吗?

许多谢谢,Miten

你好大卫,
感谢这个库,它帮助我很多在我的硕士学习。我唯一的麻烦与这个可怕的工具箱mergeCoplanarFaces方法。看来你添加阈值变量在后面的版本,但是我认为它是不应该。调查这个阈值是如何使用后,我发现它是用于两个目的。第一个是测试的价值两个法向量的叉积。第二个是后来内部使用mergeCoplanarFaces当候选节点测试isCoplanar同面性的方法。的问题是,尽管第一阈值是唯一有意义的值在0和1之间,第二阈值可以是任何值大于0,且不表现相同的不同规模的几何图形。

现在,我不知道如何解决这种行为,但它似乎并没有破坏任何东西现在就注释掉isCoplanar mergeCoplanarFaces内部检查。这可能是一个可怕的解决方案,并可能在未来毁灭的东西,所以你能看看这个问题吗?

感谢工具箱和麻烦。
最好的,
哈利勒·

@ThT:我不知道为什么这种行为正在发生的事情。请给我一个样本数据集通过电子邮件,我将试着看看。

@Leonardo:如果我理解你想计算一个3 d三角形和三维多段线吗?不幸的是没有这样的函数。我认为compmuting交叉线,后处理结果可以给一些结果,但这将需要一些编码工作。

问候,
大卫

你好大卫,
谢谢你的图书馆和你的努力。我用包的函数TriangleRayIntersection geom3D和我想知道如果在输入,而不是给一条直线的方向,它存在一个实现如果我是稍微曲线线,我知道它在每一个点(基本上,我有一个三维向量)。我需要这个射线追踪问题…

谢谢你的好心的帮助,
最好的问候,
莱奥纳多

你好大卫,

谢谢你的图书馆和你的努力。我有一个问题关于我所面临的问题。我从一个.stl文件加载CAD模型在matlab。这给两个矩阵模型的顶点和面孔,已经在三角形。然而,现有的trianglulation是一种奇怪的因此我试图重新格式化一个更好的方法。因此,我用“mergeCoplanarFaces()”为了创建3点然后re-triangulate面临更多新的网格以更适当的方式。然而,“mergeCoplanarFaces的输出()函数给我一些multi-vertex面临“NaN”分包括如果我试着绘制新面孔和网格中的顶点有些差距,这是不存在的。你知道这可能发生,如果有任何解决方案,以避免这种行为。
谢谢。
西奥

嗨,莉娜,
(dx, dy, dz)组件的表示只是对应于不同的两个3 d点的坐标。你可以检查效用函数“createLine3d”,封装了这个过程。

你可以试试下面的例子:
球= [30]40 50 60;
图;drawSphere(球体);
抓住;轴平等;轴([0 100 100 100 0 0]);
p1 = (50 50 50);p2 = [51 52 53];
行= createLine3d (p1, p2);drawLine3d(线,“b”);
分= intersectLineSphere(线、球体);
drawPoint3d (pts, k *)

否则,你可以通过电子邮件发送我你的数据,我可以试着看一看;

问候,
大卫

你好大卫,
我使用球面相交线函数,但我似乎没有获得适当的交叉的角度。我想我可能会给一个错误的输入线的dx, dy dz组件(或者至少我找不到其他的解释)。你能请给我一个例子将是dxdy和dz如果我有一条线定义为两个点吗?
谢谢,
莉娜

嗨,安妮,
我建议尝试的一些功能geom2d包(也可用FEx):
*“removeMultipleVertices”功能合并相邻顶点的距离足够小
*“mergeClosePoints”合并点的距离足够小,没有考虑点顺序(即可以合并点与不相邻的指标)
这两个函数被设计为平面几何,但应该对3 d。
问候,
大卫

安妮Tran

你好大卫,
我使用了intersectPlaneMesh当计算之间的交叉平面共面网格的面部,多边形顶点包含重复的输出。你能建议想法消除重复的顶点,因为它有助于我进一步处理。
帽子

行,球面相交不是很有用。这个例子并不容易。

李郑

嗨,亚历克,
你可以检查sphericalAngle函数,计算夹角三分在一个球体。也许你需要把球坐标。
如果用泰森多边形法的原理来计算弧角域球面上的另一个贡献(在3 d图像面积估计)。我认为你可以抓住一些代码的来源:
https://github.com/dlegland/matImage/blob/master/matImage/imMinkowski/private/sphericalVoronoiDomainArea.m

的问候!

你好,我想用这个软件(大)计算多边形的面积绷在一个球体。如果我有一个范围的方位角和仰角的值连接形成一个多边形范围,我可以用哪个函数来计算它的面积(单位球,或者更好的是,一个球体的半径r) ?

谢谢!

亚历克。

@Charles,
很抱歉延迟…谢谢你的建议。我不使用Doxygen,也许这将是困难的对我来说,这个解决方案。但这应该开放思想的脚本或使自动化。谢谢!

@Chirag,
我不知道你的问题可以从何而来。你能识别一些特异性的网格造成麻烦吗?你能通过电子邮件寄给我的网有问题吗?
某些方面的调查:
*也许使用trimMesh函数计算之前可能会有所帮助。
*确triangulateFaces之前计算平滑
问候,
大卫

嗨年代党卫军,抱歉延迟…
intersectPlaneMesh函数工作目前只有无限的飞机。一个解决方案是项目十字路口在飞机上,应用二维交叉投影算法,以及项目回到3 d。我不确定这是很简单的但是…

嗨,保罗,
intersectPlaneMesh函数需要目前“封闭”网,这是一个没有自由边界的网格。环和立方体网格局部需求,但是如果你应用在开放网格误差预计。我将努力工作在一个增强版管理也开放网格的情况。

你好大卫,
我用smoothMesh功能,工作不错,但有时它不工作,这个错误是内在矩阵维度必须一致。

错误smoothMesh(55行)
v2 = adj * v2;

错误DemoMain(31行)
[FV2。顶点,FV2。面临]= smoothMesh(阵线。顶点,双(FV.faces));

因为邻接矩阵和顶点的大小并不相同,所以请你指导我。

波林Huet

谢谢你大卫的代码!
我很新的matlab / geom3D intersectPlaneMesh函数和我有一些麻烦。我试图得到交叉网从一个stl文件读取的面孔和顶点(成功显示drawMesh)与一个平面。不幸的是我总是同样的错误的交叉边缘1(4、5)有关脸”而与标准privitives立方体或环面一切正确。可能造成这个错误的想法吗?谢谢提前

亲爱的大卫,非常感谢你的提交。这对我来说是非常有用的。
我使用相交平面啮合函数有飞机和网格之间的十字路口。实际上我有几个路口,因为飞机是无限的。我想只有一个交点。我想有一个有限的平面。你给我一个解决方案吗?非常感谢你

亲爱的大卫,我寄给你的个人电子邮件(法国)。你考虑过用这个://www.tianjin-qmedu.com/matlabcentral/fileexchange/25925-using-doxygen-with-matlab生成的文档吗?
这可能是有用的。

问候,

何时

你好加里,
是的,保持一致的版本和文档编号是复杂的…但我同意,这一种信息是很重要的。我会尽量提高,也许这可以以某种方式实现自动化。
问候,
大卫

大卫:
NP。很高兴我能帮助。

一个额外的注意:你可能想要更新内容文件的版本和日期。我明白痛苦维护文档,但是,我只是想弄清楚为什么我花了一个半小时的2011版GEOM3D加载到Matlab。可以麻烦的怀疑,您使用的是旧版本的一个工具箱。

同样,你可能想等1.21或更新版本。

不管怎么说,伟大的工具箱。谢谢你与我们分享它。
加里

你好加里,
谢谢你报告的问题,并迅速提供解决方案!我有更新新版本,使用你的修复(也在其他类似的功能)。
问候,
大卫

我和fillPolygon3d固定我遇到的问题有两个变化,标明人物“% < = = = = = = = "。我可能错过了一些东西,但是这些变化似乎工作。

函数varargout = fillPolygon3d(变长度输入宗量)
% FILLPOLYGON3D填补一个3 d多边形指定点的列表
%
% fillPolygon3d (COORD、颜色)
%包在一个(N * 3)坐标数组。
% COORD也可以多边形单元阵列,在这种情况下每个多边形
%绘制使用相同的颜色。
%
% fillPolygon3d (PX, PY、PZ、颜色)
%在单独指定坐标数组。
%
% fillPolygon3d (…、参数值)
%允许指定一些绘图参数/值对的阴谋
%的功能。
%
% H = fillPolygon3d也(…)返回一个句柄列表对象。
%
%参见:
% polygons3d, drawPolygon drawPolyline3d
%

% - - - - - -
%作者:大卫Legland
%的电子邮件:david.legland@nantes.inra.fr
%了:2007-01-05
%版权2007 INRA - BIA PV南特MIAJ案例。


%检查情况下我们想画一些曲线,存储在一个单元阵列
var =变长度输入宗量{1};
如果iscell (var)
抓住;
h = [];
i = 1:长度(var (:))
h = [h;fillPolygon3d (var{我},变长度输入宗量{2:结束})];% #好< AGROW >
结束
如果nargout > 0
varargout {1} = h;
结束
返回;
结束

%提取曲线坐标
如果大小(var, 1) = = 1% < = = = = = = =检查var是否1 x N
%第一个参数包含x coord,第二个参数包含y coord
%和第三个z coord
px = var;
如果长度(变长度输入宗量)< 3
错误(错误fillPolygon3d的参数数量);
结束
py =变长度输入宗量{2};
pz =变长度输入宗量{3};
变长度输入宗量=变长度输入宗量(4:结束);
其他的
%第一个参数包含坐标
px = var (: 1);
py = var (:, 2);
pz = var (:, 3);
变长度输入宗量=变长度输入宗量(2:结束);
结束

%提取颜色信息
如果isempty(变长度输入宗量)
颜色= ' c ';
其他的
颜色=变长度输入宗量{1};
变长度输入宗量=变长度输入宗量(2:结束);
结束

%确保关闭多边形
% < = = = = = = =如果需要fill3关闭多边形;下面的代码生成连接尺寸不一致的错误
% px = [px;px (1)];
% py = [py;py (1)];
% pz = [pz;pz (1)];

%填充多边形
h = fill3 (px, py, pz、颜色变长度输入宗量{:});

如果nargout > 0
varargout {1} = h;
结束

我问题fillPolygon3d (PX, PY、PZ、颜色),PZ、PY, PZ指定坐标在单独的数组。

fillPolygon3d(0.4[0.6—0.5],[0.5 0.5 0.5],[0.2 0.2 0.4],“蓝色”);
错误使用fill3
字符串参数是一个未知的选择。

错误fillPolygon3d(第76行)
h = fill3 (px, py, pz、颜色变长度输入宗量{:});

有什么建议吗?

Binu

嗨,特
unfortunatley目前没有函数计算偏移量的3 d多边形网格。取决于你想做什么,你可以(1)项目上的3 d多边形平面,计算偏移量在2 d,然后项目结果早在3 d,或(2)计算多边形的挤压,通过复制多边形,翻译由给定的距离的两个多边形的方向垂直于支持平面多边形,然后联系起来形成一个三维网格的顶点。万博1manbetx

你好,如何在三维偏移多边形?

你好,
我正在经历的问题centroid-related函数(调用不存在的函数)。有其他人遇到的问题。如果是这样,谁有修复?

魏赵

嗨Anusha,
很难找出可能是错的。通常,“关闭”网格(如边界表示)、intersesctions线生产偶数的十字路口。“pos”输出对应的相对位置。负值意味着线前的位置。你也可以调查“州”的输出,对应于指数相交的脸。

仍然可以有一些数值计算错误,导致幽灵意想不到的点,但我还没有遇到…

你好大卫,谢谢你如此美妙的代码。我一直使用intersectLineMesh3d函数寻找从线网的交叉点,我得到2路口分和1的位置是一个负值,第二的位置是一个积极的价值。你能解释输出作为我的线相交网格只在一个点。输出如下:

点=

536.1685 361.9645 40.1591
573.2433 399.9937 77.9874

pos =

-28.0442
10.0410

印第安纳州=

19
201年

谢谢,
Anusha。

嗨,汉娜,
嗯,奇怪的行为我同意……在当前版本中,该算法首先呈三角形网格。顺向,每个多维数据集转换成两个三角形的方脸的脸。它的起源是中间的多维数据集,它将相交两个三角形对应一个广场。
顺便说一下,如果你使用额外ouptput参数,他们会参考三角网!(我将在以后的版本中添加警告或检查)。

问候,
大卫

汉娜

感谢这段代码中,我发现它非常有用。我只是有一个问题,当我使用intersectLineMesh3d,为什么交集点重复,例如一个立方体的一条直线通过中间得到4交集点吗?
多谢,汉娜

你好,桑迪,
我很高兴你能找到的方式使用isPointInPolygon !
对于其他类型的十字路口,你可以考虑“intersectLineMesh3d”,以及“intersectPlaneMesh”功能。

的问候!

请无视8月5日发表评论。现在我明白了,geom2D包是必需的。到目前为止一切都完美的工作geom2D功能。

似乎有一种缺失的函数称为isPointInPolygon intersectLinePolygon3d叫做。这是被忽视了的东西吗?

很珍惜!我现在使用线/面相交函数。我也会使用其他线/面交叉功能。

嗨,塔里克,
是的,inertiaEllipsoid函数计算的等效椭球数据,基于惯性的输入点。
您可以得到质心的前三列inertiaEllipsoid的结果,或通过使用“重心”功能从geom2d包。
计算边界框的面积,我建议每个面加法的面积。每张脸的面积可以通过乘以对应的边长。

问候

tariq bdair

你好大卫,

是inertiaEllipsoid函数calculte最适合椭圆像2 d数据?
同时,我怎么能得到双重的质心数据?
我如何计算边界框的面积?

谢谢你!

嗨,Md Shadir,
你需要一个函数来解析的文件,并提取的顶点坐标和顶点指数的脸。有几个工具在其他库,例如图形工具箱Gabriel Peyre(函数“read_ply”),或计算机视觉工具箱(函数“pcread”)。
但是要注意,据我所知,厚度文件只提供顶点坐标。所以你需要计算网格的面孔。在这种情况下,我建议使用德劳内三角剖分,然后尝试删除非必要tetraedra然而…)(这是一个复杂的任务,并提取其外的脸。

问候,

你好大卫,

伟大的提交。我一直在调查“geom3d”,努力实现“intersectLineMesh3d”我的项目。但是我需要使用(3 d网格数据。厚度file) and check for the intersection. The .ply (3D mesh) file contains element vertex as property floats x,y,z and element faces. Is there any way to feed the .ply file into your code and run the "intersectLineMesh3d" algorithm? In fact, I tried by directly copying the vertices and faces from the .ply file (as below) but got the error: Subscript indices must either be real positive integers or logicals.

顶点= (-0.289329 -0.230469 -0.550781
-0.285156 -0.230469 -0.543497
-0.285156 -0.229169 -0.550781
-0.277344 -0.230469 -0.549533
-0.285156 -0.229169 -0.550781
-0.285156 -0.230469 -0.543497
-0.277344 -0.230214 -0.550781
-0.285156 -0.229169 -0.550781
-0.277344 -0.230469 -0.549533
-0.276716 -0.230469 -0.550781)

然而,它的工作原理与积极的数据。
你能帮帮我吗?我真的很感激你。谢谢。

我的数据的一个例子(部分):

厚度
ascii格式1.0
评论文件由微软Kinect融合
元素顶点2959173
浮动x属性
属性浮动y
属性浮动z
元素的脸986391
属性列表uchar int vertex_index
end_header
0.300781 0.625023 -1.113281
0.296898 0.628906 -1.113281
0.300781 0.628906 -1.117165
-0.695368 -0.660156 -1.496094
-0.691406 -0.659174 -1.488281
-0.691406 -0.660156 -1.491550
-0.695368 -0.660156 -1.496094
-0.699219 -0.658886 -1.496094
-0.691406 -0.659174 -1.488281
..........................................................
..........................................................
..........................................................
3 2959146 2959147 2959146
3 2959149 2959150 2959149
3 2959152 2959153 2959152
3 2959155 2959156 2959155
3 2959158 2959159 2959158
3 2959161 2959162 2959161
3 2959164 2959165 2959164
3 2959167 2959168 2959167
3 2959170 2959171 2959170

但是我需要使用(3 d网格数据。厚度file) and check for the intersection. The .ply (3D mesh) file contains element vertex as property floats x,y,z and element faces. Is there any way to feed the .ply file into your code and run the "intersectLineMesh3d" algorithm? In fact, I tried by directly copying the vertices and faces from the .ply file (as below) but got the error: Subscript indices must either be real positive integers or logicals.

顶点= (-0.289329 -0.230469 -0.550781
-0.285156 -0.230469 -0.543497
-0.285156 -0.229169 -0.550781
-0.277344 -0.230469 -0.549533
-0.285156 -0.229169 -0.550781
-0.285156 -0.230469 -0.543497
-0.277344 -0.230214 -0.550781
-0.285156 -0.229169 -0.550781
-0.277344 -0.230469 -0.549533
-0.276716 -0.230469 -0.550781)

然而,它的工作原理与积极的数据。
你能帮帮我吗?我真的很感激你。谢谢。

我的数据的一个例子(部分):

厚度
ascii格式1.0
评论文件由微软Kinect融合
元素顶点2959173
浮动x属性
属性浮动y
属性浮动z
元素的脸986391
属性列表uchar int vertex_index
end_header
0.300781 0.625023 -1.113281
0.296898 0.628906 -1.113281
0.300781 0.628906 -1.117165
-0.695368 -0.660156 -1.496094
-0.691406 -0.659174 -1.488281
-0.691406 -0.660156 -1.491550
-0.695368 -0.660156 -1.496094
-0.699219 -0.658886 -1.496094
-0.691406 -0.659174 -1.488281
..........................................................
..........................................................
..........................................................
3 2959146 2959147 2959146
3 2959149 2959150 2959149
3 2959152 2959153 2959152
3 2959155 2959156 2959155
3 2959158 2959159 2959158
3 2959161 2959162 2959161
3 2959164 2959165 2959164
3 2959167 2959168 2959167
3 2959170 2959171 2959170

嗨,安迪,
我不是在你想做什么工作;一种可能性是确定位于多边形网格的面孔。在这种情况下,您将需要检测如果网内的所有顶点。geom3d目前没有这样的功能,但我认为FEx。另一种可能性是显示面临不同的幻灯片。在这种情况下我认为简单是操纵direclty图形处理的网格。
希望这可以帮助?

Andreas角

亲爱的大卫,这是一个真的很棒的图书馆!
然而,我专门找一个函数,消除内部面临着在一个复杂的补丁(这里所描述的功能:http://meshlabstuff.blogspot.com/2009/04/how-to-remove-internal-faces-with.html)。你知道我是如何在Matlab可以这样做?

非常感谢任何提示!

安迪

你好,
提取三维像素的位置在一个三维图像并不复杂(例如usign找到函数),管理自我阻塞在geom3d没有简单的解决方案…一个可能的解决方案是重建的3 d位置(使用例如游行立方体),然后考虑交叉口重建structuers射线平行的方向的观点。通过排序路口对相对位置光线,能获得结构的虚拟视图。这可能是相当繁重。

UTA

嗨,大卫
谢谢你的代码。我也有趣的提取像素位置的3 d对象在一个特定的视图方向。也就是说,我想3 d像素位置后考虑遮挡。请给我一些帮助吗?
谢谢吧!
weihua

嗨,亚历克斯,
不幸的是,目前没有这样的功能,如果geom3D工具箱。但是你可以检查以下(最近)提交://www.tianjin-qmedu.com/matlabcentral/fileexchange/55803-surfaces-intersect
如果你改变一个3 d多边形为一组三角形脸,我想您可以使用“表面interesect”计算交点。

问候,

你好大卫,

谢谢你的解释和纠正代码。
我有另一个问题。有可能以某种方式剪辑一个3 d多边形形状,例如一个圆柱体而不是飞机?

谢谢
亚历克斯

嗨,亚历克斯,
计算网格的体积是正确的:你需要考虑签署体积考虑非凸网格。你可以试着用一个环面为例……作为一个快速解决方案,你可以考虑使用abs(相同),但为凸函数将返回正确的结果(或星形的起源,我猜)网格。

事实上,错误是“clipConvexPolyhedronHP”功能。过程中创建一个新面孔,它的方向是与其他网不保持一致。我更新了计划,应该解决pbm。
问候,

之后我以前的评论下面似乎有一个错误在meshVolume函数的实现。

函数将体积划分为四面体。然后总量等于所有四面体的体积的总和。计算体积的代码计算顶点的行列式。

波动率(i) =侦破(四)/ 6;

事实证明,有时这个行列式可以是负的,由于不同的顺序的行(顶点坐标)。

正确的公式应该包括行列式的绝对值。

波动率(i) = abs(侦破(四))/ 6;

来解决这个问题。

我想计算椭球的体积与任意平面切片后。我用下面的代码(这里为了简单起见,我将使用一个球体和削减的中心)。

[x, y, z] =球体(30);
[f, v c] = surf2patch (x, y, z, z,“三角形”);
meshVolume (v, f)

这个计算一个球体的体积预计(4/3 *π)

现在,我切一半。

P = createPlane ((0, 0, 0), [0, 0, 1]);
(v1 f1) = clipConvexPolyhedronHP (v f P);

如果我计算体积,得到不正确的值。如果我画,我看到,原因是球体的表面以及被切断,仍然开放。

drawMesh (v1, f1, facealpha, 0.5)

我的问题是我怎样才能关闭形状,体积可以正确计算。

谢谢!

嗨,迈克尔,
对不起,有一个bug polyhedronCentroid函数…我刚刚提交了修改后的版本,应该解决这个问题。

嗨Umair,
计算体积,您需要指定顶点是如何连接的。没有“简单”的方法,但是你可以寻找α形状为例。

有没有办法在这里,我们可以找到一个任意的三维形状的体积定义为一组三维点吗?

你好大卫,

谢谢你的回答。
我有打扰你与另一个问题。
我要是polyhedronCentroid编译。米我得到错误的“v”未定义的函数或变量。“我哪里来的数据“v”?

谢谢你提前,
迈克尔

嗨,迈克尔,
不幸的是我认为这是不可能的……已经有一个向量化过程管理网在全球的所有面孔。那么似乎很难矢量化的过程也行。

你好大卫,

非常感谢,它的工作原理就像我所希望的。

谢谢,
特里斯坦

你好大卫,
你的图书馆是非常有用的!谢谢你的分享。

我使用intersectLineMesh3d和循环函数几行为了得到所有交集点。
我想知道如果它是可能的修改代码以使用多行……就像你给intersectLineSphere最近(Tristan卓别林的最后评论)。

这将是很有帮助的,因为周围循环功能太慢了我的目的。

非常感谢!
迈克尔

嗨,特里斯坦,
是的,这是可能的!我只是更新新版本,修改版本的intersectLineSphere函数。在函数的头有一个例子,演示了如何使用多行。
的问候!
大卫

你好大卫,

谢谢这个库,它对我非常有用。

我想知道,是否有使用intersectLineSphere多行吗?类似于intersectLinePlane的工作方式?太慢了,我的目的使用一个for循环,每一行一个接一个。

谢谢,
特里斯坦

你好戴尔,
事实上,“线”和“雷”都是无限的。如果P0起源点和V的方向向量,形状都表现了一个点集满足P = t * V + P0。在一条线的情况下,t范围从负无穷到正无穷,而在一线的情况下,t范围从0到+正无穷。还要注意线或射线变量仅代表起源点和方向矢量,而不是“类型”的形状。行或射线之间的区别是由只有通过调用相应的函数。

如果你想找到交集有限线(“线段”),你可以得到交点的位置“t”从“linePosition3d”函数。如果值在0和1之间,线段上的点是由P0和P0 + V之间。

希望这有助于
大卫

戴尔炸

你好大卫,

感谢分享这个伟大的图书馆。我已经用它不少,现在尝试一个新的应用程序。

我丢失的是什么功能intersectLinePolygon3d和intersectRayPolygon3d之间的区别。

我希望线函数会理解一个有限长度,但文档只是提到一个起源和方向向量。应该读,相反,“方向矢量线段的长度”?

我误解什么?

谢谢。

戴尔

你好大卫,

真正伟大的工具,很好!它帮助我很多问题。谢谢你与我们分享它。
请,我问你我可以裁剪或部分的网格类型obj这个工具的一部分,请我需要

嗨Yiyu,
其实昨天我修改这个函数也……我用另一种方法,使它更快,它现在返回多个多边形。你可以试试新版本:https://github.com/dlegland/matGeom/blob/master/matGeom/meshes3d/intersectPlaneMesh.m。也许你可以与你的吗?如果你有任何建议/提示我仍然感兴趣!
的问候!

Yiyu香港

你好大卫,

我修改你的intersectPlaneMesh函数代码,使其工作找到多个轮廓。你需要的代码吗?

@Homa Rasouli:
计算表面积的多边形网格,你需要使用顶点坐标数组,数组存储顶点指数的脸。这样的数组可以获得“等值面”功能,例如。否则,你可以阅读他们从网格文件格式或厚度等。

我有问题在计算三角网格的表面。这个函数只能用三角形网格作为输入。我该如何计算顶点?

@SM:
你是对的,我用XYZ公约:周围的三个角对应于外在旋转执行X, Y和Z轴,这个顺序。注意,结果行向量是有序(thetaZ thetaY确定)。
有关详细信息,请参阅“eulerAnglesToRotation3d”功能的反向操作。
问候,大卫

SM

你好大卫,

你在什么公约Rotation3dToEulerAngles文件吗?我不完全熟悉的方程式,但在我看来这是一个XYZ公约。
谢谢,扫描电镜

嗨,约翰,

多面体的体积定义对面孔的取向。如果面临点外,体积是正的,否则它是负的。你可以简单的考虑结果的绝对值。小心,以确保定位的面孔是一致的:你可以使用“checkMeshAdacentFaces”。

嗨,德克斯特,
画一个三维多面体,您可以使用“drawMesh”功能。它使用一个古典Face-Vertices表示。用于创建多面体,你可以看一看“steinerPolytope”功能,似乎它可能适合您的需要。
问候,

嗨,德克斯特,
画一个三维多面体,您可以使用“drawMesh”功能。它使用

你好大卫,
谢谢你的快速回复。我用下面的代码:

K = minConvexHull (tmpVerts myEPS)”;
tmpInd =独特(cell2list (K));
[K]卷= minConvexHull (tmpVerts (tmpInd:), myEPS);

我修改你的minConvexHull通过体积从qhull cell2list cell2mat本质上。

关于卷:我想应该是

abs(侦破(四)/ 6)

在你meshVolume函数?否则,我不能得到积极的卷。

德克斯特

Hej,大卫:

谢谢你分享这个美妙的图书馆。
我正在画一个多面体,物理学的第一布里渊区。哪些特定的函数应该在这个图书馆寻找我的目的?

最美好的祝福!

马特奥

你好大卫,

感谢你你的工作(intersectLineSphere),我工作在我的硕士论文,你真的救了我。

嗨,马修,
你可以检查“intersectLineMesh3d”功能。它使用线表示形式(x0 y0 z0 dxdy dz),在(x0, y0, z0)的起源,(dx, dy, dz)代表一个直线的方向向量。网格顶点表示为+脸,被Nv-by-3顶点数组的顶点坐标,并面临被Nf-by-3, Nf-by-4顶点数组索引,或单元顶点数组索引允许更一般的脸。

有一个函数用于读取网格格式(“readMesh_off”)。否则,你可能想要了解其他贡献导入(并最终转换)文件。看到图形工具箱为例。

你好,我刚发现这个工具箱和我想知道如果你能告诉我如果我想做的与这些函数是可能的。

我有一条线的矢量方程3 d空间,我想确定它与网格相交的位置。

中创建的网将是一个网外部建模程序。(我可以获得的所有顶点坐标信息开放.obj文件和提取信息。)

我还需要知道法向量网的交叉点。

这个可以做吗? ? ?

弗里茨

大卫

@Abdulrahman,
对不起,我错过了你的评论…没有直接的函数用于测试一个点是否在一个3 d圆。你可以做的是1)提取包含圆的飞机,2)测试如果点属于平面,和3)如果是,计算点在二维平面上的坐标,并测试在2 d点在二维圆(你也可能需要geom2d)。
希望这可以帮助?
问候

嗨,金,
是的,飞机上有与这个函数数值精度政务……我提交了一个新版本,更宽容的寻找交叉的边缘的面孔。但是有时候有太多的十字路口。你可以删除它们通过使用mergeClosePoints geom2d工具箱的函数。
问候,
大卫

你好大卫,

真正伟大的工具!它帮助我很多问题。谢谢你与我们分享它。

最近我经常使用intersectLineMesh3d。这里有一个例子我觉得不是所有的十字路口。

V =

0.5036 0.3333 0.3063
0.4102 0.1667 0.2098
0.1742 0.3820 0.1983
0.3505 0.4296 0.1688
0.3183 0.3623 0.3165
0.4246 0.2660 0.1180

P =

2 3 6
2 3 5
3 4 6
3 4 5
1 2 6
1 2 5
1 4 5
1 4 6

行=

0.3538 0.3302 0.2503 -0.8359 0.1600 -0.5250

这个命令
(埋葬pos第1)= intersectLineMesh3d(线,V, P)只给了我一个十字路口,但它应该有两个。你能帮我吗?我误解了输入和输出的意思吗?非常感谢。

@Johannes,
顶点的新面孔是指指数实际上使用的脸。因此有必要使用如下语法:
(V2 F2) = mergeCoplanarFaces(顶点,K);
drawMesh (V2, F2);

演示文件有点过时,我将更新它,并修复的doc mergeCoplanarFaces函数。

关于公差值,用于比较正常包含人脸平面的法向量。可以有一些数值问题,但使用1的军医应该没事的。

问候,
大卫

大卫

有一个函数找到3 d点在2 d圆! ?

伟大的提交谢谢

亲爱的大卫,
我很高兴找到geom3d我需要为它提供了大量的工具。然而,我担心发现了一些奇怪的mergeCoplanarFaces ()。我剪的泰森多边形法多面体装进如一个立方体。这里有一个兆瓦:

% % % % % %代码

关闭所有;
清除所有;
clc;

v1 = (0.7945 0.2065 0.3770
0.7851 0.2019 0.3754
0.6767 0.1483 0.3603
0.6747 0.1566 0.3578
0.3994 0.0620 0.8142
0.3305 0.4372 0.8683
0.5055 0.3719 0.8659
0.3032 0.2532 0.8922
0.3026 0.1366 0.8615
0.0841 0.2280 0.8028
0.1441 0.3496 0.8355
0.1113 0.2820 0.8271
0.8097 0.2518 0.7474
0.8414 0.2398 0.4822
0.7089 0.3694 0.8072
0.7858 0.3168 0.3958
0.3059 0.4221 0.8716
0.1471 0.3505 0.8370
0.2376 0.3283 0.8869
0.2138 0.3265 0.8775
0.3857 0.0514 0.7753
0.5503 0.0944 0.4249
0.2406 0.1644 0.5060
0.3526 0.4066 0.3743
0.3545 0.4235 0.3775
0.2192 0.2369 0.4857
0.1307 0.1782 0.5772
0.0560 0.1827 0.6723
0.0610 0.1760 0.6639
0.4537 0.5529 0.4090
0.2929 0.4950 0.4783
0.5109 0.6260 0.6706
0.1959 0.4789 0.6226
0.1916 0.4725 0.5978
0.5015 0.6228 0.6758
0.5646 0.5852 0.4243
0.4909 0.5704 0.4153
0.5468 0.6032 0.4606);

v2 = [0 1.0000 1.0000
0 0.8719 0.8367
0 0.7113 0.9914
0.0336 1.0000 0.7575
0.1827 0.9701 1.0000
0.1884 0.9592 1.0000
0.1394 1.0000 0.8965
0.1859 1.0000 0.9718
0.1910 1.0000 0.9642
0 1.0000 0.7134
0.1239 1.0000 0.8761
0.1670 1.0000 1.0000
0 0.7024 1.0000
0.1259 0.8741 1.0000);

顶点= v1;

%三角脸可以从convhulln获得
K = convhulln(顶点);

%显示多面体
图(1);clf;抓住;
集(gcf,渲染器,opengl);
drawPolyhedron(顶点,K);

K2 = mergeCoplanarFaces(顶点,K, 1的军医);

%画出多面体
图(2);clf;抓住;
集(gcf,渲染器,opengl);
drawPolyhedron(顶点,K2);

% % % % % %代码

对于v1, mergePlanarFaces只合并面临如果精度设置为值> 1 e-5。这我一惊一乍的,因为这个特殊的多面体不是我修改的,但直接来源于convhull。为v2,似乎完全混乱的结果。

我有什么地方做的不对吗?

欢呼,
约翰内斯

嗨,前顶,
谢谢,这是固定的!是的,如果你有任何更新,我一个包含它们。不要犹豫与我联系通过电子邮件(在我的作者页面)

问候,
大卫

多年来我一直在用你的工具箱,感谢一些伟大的工具。

在drawEdge3d。m,第29行,我相信是一个错误,它永远也不会执行。正确的线可能是:
elseif输入参数个数> = 6;

我也已经完成drawEdge3d的文档。我集团使用的。如果你想看到/用我的版本,让我知道!

谢谢你的一些伟大的工具!

对不起,我粘贴原始的线。正确的线可能是:
elseif输入参数个数> = 6;

Jdeen

@John,

谢谢你的报告!检查后,似乎在你的例子中,飞机完全通过网格的顶点之一。有时会发生这种情况,我还不知道如何处理这些案件。稍微改变一个简单的解决方法是平面的位置(或网格),通过添加一个随机值在原点:
飞机= createPlane (randn (1、3) * 1 e3, [0 1 1]);

希望这可以帮助?

你好大卫,伟大的提交,

我想我已经注意到调用intersectPlaneMesh轻微的问题。m和不确定如果这曾被标记。

当我exectue以下计算平面与球面的十字路口我发现当N = 10我得到错误

错误使用horzcat
维矩阵的连接是不一致的。

错误intersectPlaneMesh(第85行)
polyEdgeInds = [polyEdgeInds currentEdgeIndex];% #好< AGROW >

错误testIntersectingMesh1(27)行
多边形= intersectPlaneMesh(飞机,顶点,脸);

然而,当N = 15没有exectuion问题

代码:

%创建一个平面
飞机= createPlane ([0 0 0], [0 1 1]);

%创建球体
N = 10;
[x, y, z] =球体(N);

%三角
三= DelaunayTri (x (:), y (,)、z (:));

%顶点
顶点= tri.X;

%的面孔形成凸包
面临= convexHull(三);

班;
%画出固体
补丁(顶点,顶点,“脸”,脸,‘facecolor’,‘y’,‘edgecolor’,‘y’,‘facealpha’, 0.1);
抓住;

%相交的多边形
多边形= intersectPlaneMesh(飞机,顶点,脸);

%画多边形
drawPolygon3d(多边形,“颜色”,“b”,“线宽”,2);

%填充多边形
fillPolygon3d(多边形,‘r’,‘faceAlpha’, 0.2);

最好的祝愿,

你好杰,
谢谢,我将检查它!我记得我曾经正常化前叉积为提高稳定性,但我必须再次检查。无论如何,应该固定在下一次发布!

伟大的图书馆,我使用它所有的时间,谢谢。
一个小修正:

函数法线= faceNormal(节点,脸)

如果isnumeric(脸)
%计算向量的第一个优势
v1 =节点(脸(:,2),1:3)——节点(脸(:1),1:3);
v2 =节点(面临(:,3),1:3)——节点(脸(:1),1:3);

%正常化向量
% v1 = normalizeVector3d (v1);%去除
% v2 = normalizeVector3d (v2);%去除

使用叉积%计算法线
法线=交叉(v1、v2, 2);
法线= normalizeVector3d(法线);%校正GTG 2014

其他的
法线= 0(长度(脸),3);

i = 1:长度(脸)
幼圆面临{};
%计算向量的第一边缘
v1 =节点(脸(2),1:3)——节点((1),1:3);
v2 =节点(面(3),1:3)——节点((1),1:3);

%正常化向量
% v1 = normalizeVector3d (v1);%去除
% v2 = normalizeVector3d (v2);%去除

使用叉积%计算法线
:法线(我)=交叉(v1、v2, 2);
结束
法线= normalizeVector3d(法线);%校正GTG 2014
结束

- - - - - - - - - - - - - - - - - -
最后总是更好的规范化否则最后法线不规范化由于舍入等交叉计算中的错误,这也消除2调用normalizeVector3d的优势,使faceNormal有点快。

samart

一些小的最初的调整之后,我认为这是一种很有用的任务。尽管它的大小似乎所有部分无缝地协同工作。谢谢大卫。

Shaoshuai

很有帮助!谢谢分享!

非常有用的。

嗨,塞德里克,
感谢你的兴趣!
实际上重心“geom2d”提供的函数库,Fex上可用。我试图最小化之间的依赖性都提交,但显然仍有一些人剩下的……
你也可以取代质心演示脚本中调用如下:

faceCenter =意味着(顶点(faceVertices:), 1);

这应该工作。

问候,
大卫

塞德里克

你好大卫,
谢谢你的代码!
我有一个小问题。
我不能够编译DrawSoccerBall。m演示功能。

有参数丢失当调用质心函数由于质心的定义函数是函数质心= polyhedronCentroid(顶点,脸)
我编译时错误消息:
未定义的函数输入参数的“质心”类型“双”。

错误drawSoccerBall(56行)
faceCenter =质心(顶点(faceVertices:));

@Yong分钟Yoon:
我才意识到我已经实现了一个“polygonArea3d”版本,其中包含的geom3d存档……所以我认为这应该做这项工作!
问候,
大卫

@Yong分钟Yoon:
很高兴如果你能使因数工作更好!你能寄给我的代码,这样我可以包括在将来的版本吗?
对于多边形区域,都有一个函数在geom2d polygonArea,针对平面多边形(注意,它返回一个签署区域)。你可以转换3 d多边形平面多边形通过使用“projPointOnPlane”功能。我想这应该是对计算区域合适吗?
问候

@David
我修改你的intersectPlaneMesh函数代码,使其工作找到多个轮廓。

作为下一个步骤来弥补我的算法,我想知道,如果有一个多边形的面积计算(封闭的轮廓)你的作品。

如果你让我知道,这将会对我大有帮助。谢谢你!

@David
你的代码完全是我想要的。所以,我要尝试修复您的代码。你能解释一下你的函数问题是什么?

@Yong分钟Yoon:
首先抱歉延迟回复;
您在使用功能目前还没有完全实现。它将返回一组多边形,但目前只返回一个。我已经计划程度多个多边形,但是它需要一些工作(一个想法是递归地连接相邻的顶点直到第一次达到顶点,然后开始一个新的多边形)。所以,没有简单的解决方案,但请继续关注…

@大卫Legland

你好,首先,我非常感谢你的代码。我有一些问题在你的“intersectPlaneMesh功能”。

我试图让一些椎骨的截面信息。您的代码将用于弥补。

当我与椎骨网格编码使用数据,2预计将显示横截面轮廓。然而,只有一个轮廓图所示。

我认为你的多边形在intersectPlaneMesh返回的变量,用于表示多个轮廓显示交叉区域的平面。

如果它是正确的,你能解释一下如何设置多个轮廓的飞机吗?

图片下面的URL
URL:http://gall.dcinside.com/board/view/?id=medicalscience&no=162489

注:在你intersectPlaneMesh intersectionsPoints函数似乎完全显示网格分割的点数据。

埃文

@David:
谢谢你的回应。你这里提供已经极有帮助。

我也有一个小建议计算顶点法线。如果我现在阅读它,函数可实现面法线之前平均。但它是更准确的重量,面积和角度(http://www.bytehazard.com/code/vertnorm.html)。区域,我相信仅仅意味着不使用normalizeVector3d当调用faceNormal。它不应该太难代码角度的一部分,但我只是把它以防你感兴趣。

@Sven:
太棒了,谢谢你的正面。

斯文

斯文

@Evan,
我正在做的正是这一点。将与你保持联络。

@Evan:
取决于如何构造网格,法线的方向可能是一致的(即所有指向外网),。
函数“faceNormal”并不做任何假设,并简单地计算每个正常的脸。

然而,一些其他功能需要正确方向的法线。例如,这是vertexNormals的理由。

我没有完美的解决方案……我写了“checkMeshAdjacentFaces”正常取向的一致性检查一个给定的网格,它也可以安全的使用它。但是我没有直接的解决方案是调整面对给定的法线方向。

希望这可以帮助?

埃文

你好大卫,我有一个问题关于计算法线。faceNormal函数,定义你提到,没有方向。但在vertexNormals, faceNormals用于计算顶点的法线。不会导致一些问题,还是我遗漏了什么东西?

我特别感兴趣的计算法线的表面或顶点(方面)的同一个方向,我理解是困难的和简单的问题。你有什么建议吗?我注意到checkMeshAdjacentFaces函数,但我不确定这是有用的为“调整”特定的法线。

你好,首先,我非常感谢你的代码。我有一些问题在你的“intersectPlaneMesh功能”。

我试图让一些椎骨的截面信息。你的代码被用于制造。

当我与椎骨网格编码使用数据,2预计将显示横截面轮廓。然而,如果图只有一个轮廓。

我认为你的回报(多边形)用于表示多个轮廓显示交叉区域的平面。

我的想法是正确的吗?如果它是正确的,你能解释一下如何设置多个轮廓的飞机吗?

图片下面的URL
URL:http://gall.dcinside.com/board/view/?id=medicalscience&no=162489

注:在你intersectPlaneMesh intersectionsPoints函数似乎完全显示网格分割的点数据。

你好,本杰明,
你没有错,是一个错误的函数surfToMesh……
我提交了一个固定的版本,应该很快就会出现。
问候,
大卫

便雅悯

亲爱的大卫,

我有点初级用户,所以很有可能对我来说这是一种失策,但我认为它值得提及。

我一直在试图使用cylinderMesh函数,但收效甚微。我甚至尝试画一个旋转缸”的例子,但我得到的一切
指数超过矩阵维度。

错误surfToMesh(第91行)
z z = (1: n1, 1: n2);

错误cylinderMesh(第63行)
[顶点的脸]= surfToMesh (x, y, z);

我不确定是什么原因导致了晒伤的,任何想法?

便雅悯

嗨,哈立德,
谢谢你报告的问题。我将检查行为的点在球面坐标。点作为笛卡尔坐标的功能工作正常(假设范围集中),所以我希望这可以帮助使用函数。

问候,
大卫

与所有尊重这宝贵的提交。我有一些轻微的批评。我下载geom3d“迅速”检查我的代码弧角的测定,功能“sphericalAngle”承诺。我只叫sphericalAngle一样显示在其帮助。我浪费了两个小时的时间通过各种修复耕作质量。[1]调用函数的名字已经被改变了。抱歉,但我只是停止跟踪(有些已经被这些评论中提到的)和[2]createPlane,从内部被称为sphericalAngle显然错误的尺寸。[3]intersectLinePlane抱怨在第71行矩阵维数不匹配。老实说,我认为毅力我力量之一,但我放弃了在这一点上,我不能说这个很简单的操作/多少时间花了我应该我应该继续geom3d。抱歉,但是一个平滑的程序流是非常重要的,特别是在广泛的代码提交这样的一个。

嗨Orestis,

你可以检查“intersectPlaneMesh”函数,计算产生的3 d多边形交点多边形网格的一个平面。算法很简单,所以可以有数值问题。然后你可以用函数计算区域“polygonArea3d”。通过考虑一些飞机,您应该能够做你想做的事情。

没有函数geom3d阅读STL文件。所以你应该写你自己的,或者找到一个。

问候,
大卫

Orestis

亲爱的大卫

你能让我知道你的图书馆可以为任意平面切片3 d stl文件?

其目的是计算在每个片区域有界的stl文件。

此致敬礼

亲爱的俄罗斯,

谢谢你的反馈!实际上,许多功能要求geom2d贡献正常工作。我试图让geom3d尽可能独立和自给自足,但下载geom2d强烈建议。我将更新你提到的不同的功能来删除/减少依赖关系。

问候,
大卫

很棒的包!一些小错误:

1。circleToPolygon函数是失踪。它被称为demoRevolutionSurface,
drawTorus torusMesh。
2。现在vectorNorm vectorNorm3d。它是用于intersectLineTriangle3d triangleArea3d。
3所示。现在drawEdge drawEdge3d。它是用于demoGeom3d。

一个错误:circleToPolygon函数是失踪。它被称为在demoRevolutionSurface drawTorus torusMesh。

panagiotis

@Sven
对不起,我不知道的观点用于创建平面。我的背景参考书目不包括这些信息。谢谢你通知我。

斯文

@panagiotis:我再次强烈推荐阅读* *的文档createPlane——它很短,很清楚,但你的评论显示你仍然有一个误解。

你似乎认为“3点飞机”。这不是真的。一架飞机就像一个坐标系统——它有:

——一个起源点
——一个方向矢量
- - - - - - y方向向量

你可以从3分*创建*一架飞机,但飞机*不*只是3点。当你读createPlane的帮助,您将看到的第一个例子向您展示了* *如何创建一个飞机从3点:

飞机= createPlane (Pt1 Pt2 Pt3)

你会发现飞机不等于[Pt1、Pt2 Pt3]。有*非常*好的原因,你就会明白一旦你读createPlane的帮助。

panagiotis

@David
大卫你是对的,但并不认为会有一个misunderstaning定义平面的三分!我认为这是普遍接受的。以前没有听到飞机从第三点的方向。
总之,想出了一些新的东西。

在createPlane,你只考虑的第二和第三点积。你不像p1-p2 & p1-p3创建向量。看起来我好像你定义(0 0 0),所有飞机。正常的在某些情况下是错误的我,没有发现任何帮助。如果我使用向量,结果都很好。

飞机= [1 1 1 2 2 1 3 3 1]
planeNormal(飞机)
ans = 0 0 0

我认为这应该是一个向量[0 0 a]。

@panagiotis:
显然你甚至没有真正试图让som帮助自己。“帮助planes3d”、“帮助projPointOnPlane”,甚至“帮助geom3d”在图书馆给你定义用于代表飞机。

给低评级仅仅因为你不愿意看医生有点不公平……

顺便说一句,感谢斯文的支持!万博1manbetx

问候,
大卫

panagiotis

斯文,谢谢你通知我。事实是,我没有得到,在帮助. .
当我再次使用图书馆,我会重新考虑1星评级!
谢谢!

斯文

嗨Panagiotis,帮助projPointOnPlane说”……飞机是一个[N * 9]数组(有关详细信息,请参阅createPlane)”。帮助createPlane非常清楚的定义。

不管怎样,我很高兴你的问题现在已经被确认。你进一步的注意的是,被指定为“其他”方向向量[0 1 1],这并不是“正常化”(也就是说,它有一个超过1级)。这不会影响projPointOnPlane但它可以影响其他功能,比如planePosition如果你打算使用它们。

再次希望这使得代码的工作,如果是这样,也许你可能重新考虑1星评级:)

panagiotis

@斯文
没有通知这样的定义。我不知道第三点定义了飞机的方向。

斯文

@panagiotis:

你的飞机没有意义的定义:

飞机= [0 1 0 0 1 1 0 0 0];

注意,元素七章都是零。七章给飞机的轴方向向量的元素。所有零没有方向的矢量,因此是不可能一个点投射到这架飞机,因为飞机是不存在的。

panagiotis

@Sven(这个库强大国防!)

点= (0 0 0);
飞机= [0 1 0 0 1 1 0 0 0];
projPointOnPlane(点、平面)
ans =南南南

斯文

@panagiotis:

> > projPointOnPlane ([100 100 0], [0 0 0 1 0 0 0 1 0])

ans =

100 100 0

…在我看来很好。请提供一个可再生的错误。

panagiotis

我发现的主要问题是在projectionPointOnPlane geom3d图书馆。我们试图项目在飞机上一个点的点已经属于。出来的结果是,南相反的点的坐标。导致一些问题与十字路口等其他功能。

Panagiotis

斯文

@panagiotis:请描述你发现实际问题(s)。我敢打赌,如果你发现了一个可复制的错误,大卫会很快解决这个问题。只是说“十字路口有错误”实际上并不是很有帮助,并且不让任何人提高1星上面的包你觉得值得。

panagiotis

亲爱的大卫,
我用你的图书馆几个月,我发现一些错误尤其是突出点和十字路口. .
以为你可能有帮助。

Panagiotis

你好查尔斯,
我已经创建了一个项目页面在sourceforge上叫“matgeom”,收集geom2d geom3d。有些论坛设施,所以这应该是容易post数据。
http://matgeom.sourceforge.net/

问候,
大卫

查尔斯

亲爱的大卫,
我试图用surfToMesh然后meshSurfaceArea函数计算近似区域的点与X - Y平面上指定的X和Y坐标。然而,该地区返回值,对我来说没有意义。我想知道我如果可能的话把矩阵和得到一些帮助我的代码为什么它不工作。点我代表近一个半圆,结果给了我接近一个完整的圆的直径。有一些公差在啮合设置吗?非常感谢!

最好的,
查尔斯

学生大学

嗨,先生
基本上我画三维矩形和divinde面孔
不同的无穷小区域,划分小volums矩形。
然后我需要区域和卷和顶点的坐标
同时他们的中心点坐标
clc
清除所有
关闭所有
x = 0:1:2;
y = 0:1:2;
plot3 ([x, x]、[0, 2], [y, y]);
抓住
结束
结束
x = 0:1:2;
y = 0:1:2;
plot3 ([0, 2], [x, x]、[y, y]);
抓住
结束
结束
x = 0:1:2;
y = 0:1:2;
plot3 ([y, y], [x, x], [0, 2]);
抓住
结束
结束
我需要这样的东西,但这是广场,我不知道怎么走
所需的坐标
提前感谢您的关注
致以最亲切的问候

Hoai-Nam勒

非常感谢大卫! ! !
不结盟运动

@Hoai-Nam,
我提交了一个新版本,你应该找到有用的一些新功能:
*“reversePlane”和“reverseLine3d”功能,避免影响permutting方向向量
* intersectPlaneMesh函数,返回一个平面之间的交叉和3 d网格。没有一个完整的剪切功能,但这应该帮助!

问候,
大卫

尤里

大卫,谢谢!尤里

@Yuri,
函数sphericalAngle假设输入点是位于单位球表面上的,那不是你的问题。
我认为你应该使用“angle3Points3d”函数,计算夹角3点在空间中,使用第二点为中心的角度。

anglePoints3d (p1, j - 1, l1)
ans =
1.5708

Hoai-Nam勒

亲爱的大卫,

谢谢你的非常有用的工具箱!

我使用了你的一些功能,我发现一些事情:

+我的问题:
我有一个三维点集。我创建了一个最小点集凸包,使用convhulln,所以我有一个凸包方面的列表。

我想夹这个凸包一架飞机。这让我你的函数。

+ 2方法与你的工具箱:

1 / clipConvexPolyhedronHP使用函数。这是我的问题!
但是如果我们想要有一个凸包边(低于或高于平面的),我们必须有一个正确的平面输入! ! !

例如:
chX = convhulln (Pts);%分:三维点集

%选择在飞机上3点z = vClip
P = [0 0 vClip;
0 1 vClip;
1 0 vClip];
% z = vClip创建平面
飞机= createPlane (P);

%这个函数createPlane给我:飞机= (0,0,0.7,0 1 0,- 1,0,0)
%,那么函数clipConvexPolyhedronHP返回我错误的多面体。所以我交换2飞机的方向向量:飞机=(0,0,0.7,1,0,0,0,1,0],它返回我一个多面体的右边,我的欲望。

所以你有提示使用函数createPlane有一个好的结果(所以我不需要交换2方向向量的平面)?

2 / polyhedronSlice使用函数。它不起作用,因为它并不只返回飞机和多面体的交集点,但也有些点是错误的(见图片https://dl.dropbox.com/u/8702546/WEB/image_1.png)。

然而,如果函数是如何工作的,我可以控制我想剪辑的多面体的Matlab的一个简单的命令!

所以我反馈你这个正确的函数polyhedronSlice !

我不知道如果有人已经被问及这些东西……

问候,
不结盟运动

尤里

大卫,很好的和有用的包。谢谢。

我有一个问题关于sphericalAngle函数。我定义以下平面:
> > p1 = (1 1 1);p2 = [100、100、1];p3 = (1 100 1);
> > pl = createPlane (p1, p2, p3);

然后飞机外的一点,点到平面的投影:

> > l1 = (40、40、40);
> > j - 1 = projPointOnPlane (l1, pl);

我希望l1的夹角,为j1和任意点在飞机上是π/ 2。然而,这就是我得到的:

> > alpha_rad = sphericalAngle (l1, j - 1, p3)

alpha_rad =

1.5745(~π/ 2)

> > alpha_rad = sphericalAngle (l1, j - 1, p1)

alpha_rad =

0 + 2.1073 e-08i (= 0)

> > alpha_rad = sphericalAngle (l1, j - 1, p2)

alpha_rad =

3.1416 - 0.0000我(=π)

你能,请澄清函数的工作方式?

谢谢

马克

很好。谢谢

美联社

伟大的工具。

麦尔斯

Haochen唐

你好大卫,

谢谢你!我想念理解的定义。我认为这是原点和终点。非常感谢。

最好的,
Haochen

你好大卫,
我´会尝试使用一些功能。首先我要做的只有一片为了得到的交集点,只有在我´会与其他平行的平面。
谢谢。

问候,
爱德华多

嗨,爱德华多,
你想做什么似乎是可能的,但据我所知没有直接的方法。
有一些函数可以帮助你“meshes3d”子包,比如intersectLineMesh3d或polyhedronSlice。您还可以使用intersectEdgePlane - >您可以获得一组平面和边缘之间的交集点。如果你想代表与3 d多边形切片,你仍然需要以适当的顺序链接点。

@Haochen:
谨防3 d线的定义。在工具箱中3 d线是由(x0 y0 z0 dxdy dz)。为了定义一个垂直线应该使用(0.6 0 0 0 0 10)。在这种情况下你会得到正确的结果。

问候,
大卫

嗨,爱德华多,
你想做什么似乎是可能的,但据我所知没有直接的方法。
有一些函数可以帮助你“meshes3d”子包,比如intersectLineMesh3d或polyhedronSlice。您还可以使用intersectEdgePlane - >您可以获得一组平面和边缘之间的交集点。如果你想代表与3 d多边形切片,你仍然需要以适当的顺序链接点。

问候,
大卫

Haochen唐

你好大卫,

非常感谢这个伟大的工具。我使用intersectLinePolygon3d函数。一些结果似乎没有意义。例如:

pts3d = [1 1 5; 1 1 5 1 1 5];
行= (0.6 0 0 0.6 0 10);
[国际米兰内部]= intersectLinePolygon3d(线,pts3d);

我:
山=

0.9000 0 5.0000

在=

1

我们应该期望得到国米= 0.6 0 5 ?

非常感谢,
Haochen

嗨,大卫
我试图´片三角形网格。我不是专家在Matlab和´我´在实现这个有一些困难。我有边缘,我试图让´交集点与几个平行的飞机……
你能帮我一个忙吗?
谢谢´s。

问候,
爱德华多

嗨,阿曼达,
我不知道类似scilab的图书馆。我猜你需要重新编码一切……
如果你正在寻找一个自由的选择,我可以提一个港口八度库geom3d + geom2d:
http://octave.sourceforge.net/geometry/index.html

问候,
大卫

阿曼达

嗨,大卫
多年来一直使用这个包。真的很喜欢它。谢谢你只工作。我现在研究使用Scilab取代Matlab对一些应用程序。scilab搜索,但没有在那里找到geom3d可用。任何建议吗?

阿曼达

嗨,近红外光谱,
你的意思是3 d多边形或3 d网格?看来你谈论网,对吗?在这种情况下你情况下使用功能“intersectLineMesh”(包含在更新提交)。这应该做这项工作。

@Benjamin:我还添加了一个函数polygonArea3d更新。

嘿,大卫,
似乎功能:
intersectRayPolygon3d
intersectLinepolygon3d
不正常工作。
我有一个长方形的3 d多边形(相当简单,就像一个细长的立方体)定义的顶点和飞机的两侧。
一条线或一线,中间的位置在任何方向应该生成一个交点。这并不工作。不是一条线或一线。

顶点:
0 0 0
0 0 2.7000
5.7000 0 0
5.7000 0 2.7000
5.7000 - 7.0000 0
5.7000 7.0000 2.7000
7.0000 0 0
0 7.0000 2.7000


产地:2.8508 3.5013 1.3500
方向:-0.1 0.1 - 1

帮助吗?

汉斯·

谢谢你的伴侣。啤酒苍蝇你:)

嗨,本,

你可以检查函数“polyhedronSlice”。计算结果的3 d多边形的交点与一个平面多面体。使用的例子:
(节点面临)= createCube;
飞机= createPlane ((。5。5。5],[2 3 4]);
保利= polyhedronSlice(节点、面临平面);
图;抓住;
drawMesh(节点、面临“facealpha”。5);
fillPolygon3d(聚,“m”);

没有(不…)函数计算3 d多边形面积。然而它可以通过投影平面相交:
poly2d = planePosition(保利、平面);
面积= abs (polygonArea (poly2d))

问候,大卫

你好大卫,

谢谢你很好的工作。我寻找一个例程,可以找到(面积)多边形,结果从一架飞机和一个多维数据集之间的十字路口。这可能与你的图书馆吗?

认为,本

你好,帕特里克,

不,你没有错过它,它可能是有用的。我将把它添加在未来版本。

问候

distanceLine3d工作无限行a + t *。有时(碰撞检测)之间的距离线段AB和CD是必需的。distanceSegment3d将是有用的。

这同样适用于点(distancePointSegment)。

还是我只是想念吗?

写好,好评,谢谢!

Shuhao曹

Sakshi

@Qais,
你应该安装geom2d和geom3d,通常在相同的目录中。然后你必须添加目录的路径,使用te“目录”功能,或“文件- >设置路径”菜单)。你至少需要添加目录‘geom2d’,‘geom3d’,‘polygons2d’,‘meshes3d’,并最终“polynomialCurves2d”。

一些演示提供每一个档案,你可以直接运行,对语法有一个想法。

我也将尝试添加一些matGeom web页面上的信息(收集geom2d和geom3d)http://matgeom.sourceforge.net

希望这有助于

亲爱的大卫,
我只是开始使用Matlab对几何计算在我的研究。我很感激如果你想demonstarate如何使用这个库(3 d或2 d)因为每个函数我以前给我对其他功能未定义的语法错误。我是一个在开始在Matlab,可能我的问题是问题。我非常感激。

@Khaled和凯伊斯
我所想要的是使用以下过程:
*计算的交叉线和多边形平面
*项目polyingon顶点到平面(即计算他们的2 d坐标)
*项目交点上飞机
*检查2 d交点是否在2 d多边形。
以下的代码应该做这项工作(假设poly3d N-by-3和行1-by-6):
飞机= createPlane (poly3d (1:3,:));
国米= intersectLinePlane(线、面);
poly2d = projPointOnPlane (poly3d、平面);
pInt2d = projPointOnPlane(国米、平面);
在= xor (isPointInPolygon (pInt2d poly2d) polygonArea (poly2d) < 0);
国米=国际米兰(里面:);

geom2d和geom3d都是必需的。我将添加函数“intersectLinePolygon3d”和“intersecRayPolygon3d”下一个版本。

问候

亲爱的大卫:
我看了你的评论哈立德的问题。我还不清楚你说什么“最好的是使用3 d飞机,最终项目所有点在平面上,然后利用2 d多边形函数。”Which points we should project on 3D plane and from my understanding line intersect a polygon in one point.
提前谢谢你

嗨,哈立德,
创建一个3 d多边形,你只需要将他们的坐标到N-by-3数组,例如聚=猫(1,p1, p2, p3);
没有因数3 d和3 d多边形的十字路口。最好的是使用3 d飞机,最终项目所有点在平面上,然后利用函数2 d多边形。

哈立德

亲爱的eng。大卫,

谢谢,这种强大的工具箱很有帮助。

我试图创建一个3 d多边形从四个或三个3 d点,和无法。所以我试图创建一个平面,但当发现一个有3 d线的十字路口答案会随着飞机多边形不准确。

有一个可能的方法来创建一个3 d多边形从四个或三分吗?和
有一个可能的方法找到一个3 d交叉线和3 d多边形?

你的努力被认可。

布兰登

布雷迪

非常有用的工具。主要是直观的函数调用,和彻底的文档来简化集成。

很有帮助。

斯文

优秀的方案空间操作。丰富的工具箱,直观地处理输入。唯一的建议是,出于完整性的考虑,文档的一些方法调用函数的模糊函数。如。,localToGlobal3dhas one documented method of calling, but under the hood it parses input in many different ways. I find myself typing "edit" instead of "help" just to make sure I'm using things efficiently.

汽缸的格式是:(十五青年志愿zy R xc yc佐):
(十五青年志愿zv)缸的方向向量,
R圆柱体的半径
(xc yc佐)气缸的起源。
L参数,在帮助,没有使用。
缸是无限的,请使用“linePosition3d”如果你需要有限的汽缸。
请注意,这种格式不符合“drawCylinder”函数,例如。因此函数“intersectLineCylinder”在将来发布的版本中可能会改变。
戴斯。莱纳姆:

你好,

我试着“intersectLineCylinder”的定义是什么:xa,是的,咱,汽缸和L ? ? . .请任何人

你好,
我上传一个新的版本,修复bug报告,并添加了一些演示。发表m-files演示是可用的,可以通过上面的文件表示。他们展示了一些使用的可能性。

大多数绘图函数遵循“阴谋”语法。首先给出数据,然后选伴侣的参数名称和值。如果没有实现,试着用“h = drawMyShape (…)”,then set up options using "set(h, 'color', 'k')" for example.

bug报告和建议,最好是直接发给我和电子邮件(在我可以找到作者页面,取代“点”“。”)。

戴斯。莱纳姆:

这个方案旨在解决可视化问题,我经常有。然而,我无法我试图使用这个包,但经历了许多问题:

1。颜色控制的对象怎么样?
2。我想画箭头的圆柱表示,因为quiver3 drawPlane一起工作不是很好,可能是由于缺乏控制的秩序。相反,我想画粗箭头,并使用drawCylinder.m我。然而,在89行是local2Global.m使用不存在的函数。它似乎被localToGlobal3d可更换,如果localToGlobal3d第29行被替换为“中心=变长度输入宗量{1};”。

建议修正,等最好的程序是什么?

谢谢你,乔

这个库及其同伴,geom2d闪亮的珠宝,做简单的计算对象的不可缺少的2 d和3 d空间。

顺便说一下,离开geom3d目录中所有的文件和目录添加到您的路径。然后你可以输入“帮助geom3d”或“医生geom3d”并获得适当的链接帮助文本命令窗口或窗口的帮助。内容。m文件的正确“MATLAB方法”提供文档。

我们

这太坏(显然)成熟的软件包不来在一个适当的和现代的帮助下/介绍/示例模块称为m文件出版…

到目前为止,是有点乏味的天真的用户必须通过个人的帮助部分韦德帮助文件(或密集的书面contents.m)——(很可能)不会给你包尽可能多的关注也许值得…

我们

更新

1.24

新功能处理3 d网格(修理、简化),重命名惯量椭球为等价的椭球体。

1.23.1.1

包作为mltbx文件

1.23.1.0

包的工具箱。

1.23.0.0

添加meshes3d / meshFaceAreas。米,加上geom3d / isTransform3d。(由于Oqilipo)、更新几个绘图函数的返回类型,固定在orientedBox3d bug

1.22.0.0

添加几个函数前读/写3 d网格在厚度和格式,和新功能使用3 d网格(distancePointMesh isPointInMesh)。

1.21.0.0

整合几个contrinutions (oqilipo Roozbeh)。添加夹/分离/连接网格,新变换向量。

1.20.0.0

移除弃用功能,更新一些显示功能

1.19.2.0

在nomalizePlane clipConvexPolyhedronHP修复bug,修复bug。m为多个飞机(由于Zubiao Xiong),添加orientedBox3d

1.19.1.0

修复bug在polyhedronCentroid

1.19.0.0

几个更新处理网格(intersectPlaneMesh intersectLineSphere),显示网格,计算并显示惯性椭圆体

1.18.0.0

添加trimMesh功能(删除非连接顶点网),更新mergeCoplanarFaces interesectLineMesh3d宽容和更新管理

1.17.0.0

解决各种小虫子

1.16.0.0

固定错误surfToMesh

1.15.0.0

为操纵多边形小bug修复,新功能,速度提升(感谢斯文Holcombe !)

1.14.0.0

一些bug修复,新功能(fitLine3d、parallelPlane reversePlane, intersectPlaneMesh, meshCentroid…),和函数从补丁或创建网格几何基元。

1.13.0.0

修复bug的演示

1.12.0.0

球面多边形bug修复,新功能,用于读取网格(foramt) point-edge距离,计算面积的3 d多边形,网格或椭圆体。

1.10.0.0

各种代码清理和速度的改进,主要是由斯文Holcombe(多谢!)

1.9.0.0

用学位来画形状,“geom3d”和meshes3d自由分割成包

1.8.0.0

为网格添加新功能和多面体,对于3 d变换(旋转,根据变换)。看到文件changelog.txt

1.5.0.0

固定缺陷在旋转和图纸的形状,由欧拉角旋转,添加各种更新文档和代码

1.4.0.0

添加缺失的演示

1.3.0.0

一些bug修复,演示文件m-files出版。

MATLAB版本兼容性
创建R2019a
兼容任何释放
平台的兼容性
窗户 macOS Linux

demos-geom3d

demos-meshes3d

geom3d

geom3d /私

meshes3d

meshes3d /私