图片缩略图

geom3d

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

164下载

更新9月26日

查看版本历史

查看许可协议

编者按:此文件被选为MATLAB Central本周精选

geom3d库的目的是处理和可视化3D几何原语,如点,线,平面,多面体…它提供了用于操作3D几何原语的低级函数,使得更复杂的几何算法的开发更容易。

引用作为

大卫·莱格兰(2021)。geom3d(//www.tianjin-qmedu.com/matlabcentral/fileexchange/24484-geom3d), MATLAB中央文件交换。检索

意见及评分(291

大卫Legland

嗨,屋大维,
目前还没有这样的功能。处理它的一种方法是识别边界边,并从这些边界边创建额外的面。需要一些工作,但似乎可行。

屋大维

另一个问题。在一个更大的3d网格上,我有一个内部有洞的3d补丁。是否有一种方法来填补修补孔使用(不包括)网格顶点对应的孔(不扩大修补边界)。谢谢你!

本气

很有帮助!

塞吉奥ABP

嗨,大卫。首先,恭喜你有这么多神奇的功能。这对我们帮助很大。
为每个绘制函数创建一个参数来应用转换是很好的,例如:drawVector3d(plane(1:3),10*plane(7:9),'transf',eye(4))。
谢谢。

大卫Legland

嗨,屋大维,
没有函数可以快速地做你想做的事情。使用geom3d中的一些函数来实现一个是可能的,但这需要深入研究polylabel使用的算法,我猜…

屋大维

亲爱的大卫,

我有一个三维网格(表面补丁)定义的顶点(x,y,z)和面(三角形:顶点索引),以及它的轮廓(3D多边形)。我需要找到“标签”中心,或距离轮廓线最远的中心,但必须是补丁上的顶点,“不可访问的极点”(参见polylabel javascript包,我想在matlab中这样做)。我能在geom3d中做吗?我提到过,如果有必要,我可以将3d网格(和多边形轮廓)转换为2d网格。

如果无法做到,那么退而求其次的方法是找到网格与穿过其质心和最近轮廓顶点的3d平面之间的交点,在网格上局部垂直(3d变种),或者网格与穿过质心和轮廓上最近点的直线之间的交点(2d变种);这是因为凹面网格的形心可能在网格/轮廓多边形之外。如果可以的话,请让我知道。谢谢你,屋大维

Dave Nguyen Kien

阮Nhung

大卫Legland

@LC:目前还没有,但我认为这可以很容易地包括在内。我要把这个加到任务列表里!

信用证

谢谢你这么好的包裹。我看到有一些代码可以找到一条3D线与一个3D多边形的交点。有没有一个代码来找到一个3D线段和一个3D多边形之间的交集?同样,三维线段与三维多面体?

大卫Legland

@Hamish Marsden:不幸的是……这也是我想要的功能!然而,计算复杂度可能非常高。也许有一天……

哈米什马斯登

嗨,大卫,很棒的工具箱!!我试图将两个交叉的网格合并成一个网格。有没有什么函数可以做到这一点,或者你对如何做到这一点有什么建议

大卫Legland

@王旭光:没有,没有直接的功能来做这个。一种可能的方法是连接两个顶点数组,然后重新标记第二个网格的人脸索引数组,并连接两个人脸索引数组。这将导致一个单一的网格,但这不会解决交叉面或多个顶点……

Xuguang王

嗨,大卫,我想合并两个网格成一个单一的网格。你有能力做这件事吗?谢谢。

穆罕默德民兵

这个库非常有用,并且有很好的文档。10/10会推荐。

大卫Legland

@Mert Aslantürk:该函数旨在以新的基础计算几何数据结构的坐标。当应用变换时,输入应该是对象在“源”基下的坐标,输出是“目标”基下的坐标。另一个例子:
Plane1 = [0 0 0 1 0 0 0 1 0];%全球基
Plane2 = [2 3 4 0 1 0 1 0 1];%另一组基
transfo = createBasisTransform3d(plane1, plane2);
plane2T = transformPlane3d(plane2, transform) %结果是相同的

我同意这不是很直观,但我现在找不到更好的了……

Ana Guerra Langan

莫特Aslanturk

你好大卫,

伟大的工作!我喜欢使用这个图书馆。我有一个关于createbasisstransform3d .m的问题让我很困惑
%%%%%%%%%%%%%%%%%%%%%%%%%
来源= [0 0 0 1 0 0 0 0 1];
目标= [0 0 0 0 0 1 0 0 0 1];
tForm = createBasisTransform3d(源,目标);
out = transformPlane3d(source,tForm)

了=
0 0 0 0 0 1 -1 0 0

我早就料到会有目标。如果你能解释一下我错过了什么,我会很感激的。谢谢你的宝贵时间。
最好的

大卫Legland

嗨,John Zhang,

对于从顶点创建网格的“faces”元素,有不同的方法,但这需要添加关于哪些顶点是邻居的假设。在geom3d中没有这样的实现(除非创建凸包对您来说就足够了?)

我会检查你的命题clipConvexPolyhedronHP(有一天,我会实现一个更干净的clipMesh函数…);

大卫Legland

你好,Ramaswamy Kasyap Pantangi,
有一个绘制圆柱体的函数(叫做drawCylinder)。没有“直接”的方法来画一个半圆柱体(我不确定你的意思是什么),但我猜检查drawCylinder的代码应该有助于你实现自己的函数。
最好的

约翰•张

嘿,大卫,
我相信在函数clipConvexPolyhedronHP中可能会有一个修复,在最后一个循环中,我们可以添加一个
Face (Face == 0) = [];
以确保我们正在使用的面不包括我们用这个平面截断的任何0个下标顶点。

约翰•张

嘿,David,我有一个关于如何从Nx3顶点数组创建3D网格的问题(如果这是一个简单的问题,对不起)。我尝试了steinerPolytope函数和surfToMesh函数,但它们似乎不符合我的想法。数组中的顶点没有特定的顺序,我想返回Faces-Vertices表示,这样我就可以使用库中的其他函数。

谢谢你的图书馆!我对Matlab比较陌生,我发现这些3D函数快速且易于使用。

Ramaswamy Kasyap Pantangi

我怎么能画一个半圆柱形箔与nbym网格

曹香洲

甄你们

jdiva6t9

大卫Legland

嗨,Tan Phan,
我怀疑这是由于自2008年以来Matlab管理图形小部件的方式发生了一些变化。准确的错误消息是什么?无论如何,我建议使用最新的版本。

谭表象

为什么当我在2008b上使用drawCube函数时,它的补丁函数抛出错误,但当我在2016a上运行时,它运行完美?谢谢你,抱歉我的英语不好!

大胡

@David Legland你好David,希望看到你对3D立体网格的贡献。到目前为止,你知道有其他matlab库可以做到这一点吗?

大卫Legland

@Xiaofei Hu:三维实体网格不是由geom3d库管理的。我尝试了顶点+边+面+固体结构,但没有得到足够稳定的结果。

大胡

你好,大卫,干得好。我想知道是否有可能用3D实体元素(例如四面体)为3D对象生成网格,就像在有限元网格中一样。你能告诉我怎么做吗,谢谢。

约旦格雷厄姆

非常有效,大卫,谢谢你。

大卫Legland

@乔丹:我明白了;一个解决方案是使用"intersectLineMesh3d"函数的第二个输出参数。它对应于直线上交点的位置。位置0对应直线原点。如果position <0,则对应于180°的情况。如果position是>1,它对应于一个不止一个方向向量的平移。通过调整“line”输入参数的方向向量的范数(参数#4到#6),你应该得到你想要的。

约旦格雷厄姆

谢谢你的回复David, edges函数在绘制有限线时工作得很好,但我后来发现它并没有解决我的问题。我试图用这条有限的线来确定网格中的交点。我的问题是,线条起源于一个圆形图案的中心点(想象一个平放的自行车车轮)。例如,网格是一个位于原点旁边的盒子,我想要能够计算出有多少条轮辐与网格相交,我可以这样做,但我也从原点180°的直线中得到交点,因为它们在起点的一个方向上不是有限的。我不认为有intersectEdgeMesh3d函数。

晶晶孟

大卫Legland

嗨,约旦,

我认为您可以使用与“边”(我在本库中用于两点之间的“有限”线的术语)相关的函数。您可以通过连接两个点的坐标(-> E = [P1 P2])来创建一条边。你可以用drawwedge函数绘制边缘。看一下“边缘”文件。M”代表更详细的文档。

约旦格雷厄姆

大卫,谢谢你给我这么好的图书馆。当创建一条3D线时,是否有一种方法让这条线只存在于两个特定的点之间,而不是有一条看似无限的线穿过两个指定的点?例如,如果我有点P1和P2,我希望直线只存在于这两点之间,而不向任何方向延伸。我希望这是可以理解的,如果需要,很高兴提供更多的细节。再次感谢。

Florian Reinbold

莱昂内尔·朱利安AF

大卫Legland

@Sadeep,不,图书馆里没有这样的函数。

Sadeep Thilakarathna

这个函数能检验两个随机椭球是否相交吗?谢谢你!

大卫Legland

@Sergio ABP, @神经力学家:谢谢你的反馈,我已经更新了相应的主库。
是的,质心函数是geom2d工具箱的一部分。你只需要把它下载下来。我将在下一个版本中包含所请求的文件,以方便使用geom3d。

克里斯托弗Riehs

neuromechanist

@Golak Mahanta
“centroid”是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

Golak Mahanta

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

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

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

neuromechanist

嗨,大卫
首先感谢你出色的代码。它已经为我节省了数天甚至数周的编码时间。
我在研究你的"distancePointMesh"我想我注意到线性算法中的变量名有细微的不一致。一旦我运行代码,它抛出了这个错误:

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

distancePointMesh错误(第124行)
if distf < minDist

这是有意义的,因为之前根本没有定义minDist(在113行有一个地方,“dist”被预先分配了inf)。
因此,我所做的对我有效的修复包括以下内容:
1-在第1、91、93和104行将“dist”改为“dists”。
2-在第113行将“dist”改为“minDist”。

谢谢,圣诞快乐。

塞吉奥ABP

我将这些行添加到文件drawCylinder中。m在“%%显示圆柱网格”后,允许透明:

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

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

漂亮的图书馆!

大卫Legland

@张涛:谢谢你的修复!我已经将它们包含到MatGeom存储库的主分支(https://github.com/mattools/matGeom.git).它们将包含在下一个版本中。

张道

其他输入错误:
"createRotationOx" line51: elseif length(varargin)==3应该==4,line56应该是theta = varargin{4}
"createRotationOy" line55: dy= 0应该是dy=varargin{2}, line56应该是dz = 0
"createRotationOz" line53: elseif length(varargin)==3应该==4,line58应该是theta = varargin{4};

张道

你好大卫,
只是注意到一些小错别字:
"polygonArea3d" line65: vn = vectorNorm(cp)可以替换为vn = vectorNorm3d(cp),这样工具箱是自包含的。
" polygoncentrroid3d " line33: elseif nargin == 2应该是elseif nargin == 3

大卫Legland

@Chitan Gandhi: intersectPlaneMesh函数目前只适用于封闭的表面网格。当网格打开时,一些边只附着在一个面上,其中一个得到你得到的误差。增强在待办事项列表上,但并不是那么容易管理……

@Laslo Kormoczi:我已经提交了一个新版本的工具箱。这不是以前版本的情况。所以现在应该可以了。

Chintan甘地

你好大卫,
我可以使用三角测量功能,工作得很好。现在,我在网格上使用intersectplanemesh函数(从. stl数据按要求的格式排列)。使用intersectPlaneMesh出错(第85行)
交叉边1(7,8)与1个面相关联。你能帮我解决这个错误吗?

Laszlo Kormoczi

你好大卫,

在当前版本中,工具箱安装程序没有将matlabPath设置为包含工具箱文件夹。请查看mltbx文件中的configuration.xml。

大卫Legland

@Chitan Gandhi:当然!创建这个函数是为了管理面有许多顶点的多边形网格。你可以尝试以下方法:
[V, E, F] = createdecahedron;
F2 =三角脸(F);
drawMesh (V, F2);
轴相等;视图(3);

Chintan甘地

你好大卫,
我想使用三角剖分人脸函数,是否有可能三角剖分超过4个顶点的人脸?

大卫Legland

@Resmi Johnson:当函数或脚本包含单元函数时,代码生成似乎有一些限制。请看例子https://uk.mathworks.com/help/万博1manbetxsimulink/ug/cell-array-restrictions-for-code-generation.html.我会试着看一看,但我不确定我是否能轻易解决这个问题…

RESMI约翰逊

你好大卫,
在我的项目中,我使用嵌入式编码器从matlab中生成C代码。因此,在从matlab中生成C代码时,我得到了关于函数'intersectPlaneMesh(plane, v, f)'的'cell'函数的错误。所以你能帮我解决这个问题吗。

大卫Legland

@resmi Johnson:单元格函数是Matlab多年来的一部分,所以我真的不明白这个问题从何而来……它的目的是分配一个给定大小的数组(这里是1 × nfaces),其中包含各种类型或维度的数据。另外,您所说的“生成代码”是什么意思?

RESMI约翰逊

你好大卫,
我在我的一个模拟中使用函数'intersectPlaneMesh(平面,v, f)'。当我试图为此生成代码时,它给了我一个错误,因为“单元格”函数。你能建议一个替代的解决方案,使其代码可生成。
提前谢谢你。

pcidreir

Nawar Alwesh

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

大卫Legland

嗨Nawar,
对不起,orientedBox3d函数中有一个错误…作为快速修复,您可以将第55行替换为以下内容:
Markers2d = [0 0;L1/2 0;0 L2/2];
我很快就会发布新的版本。
大卫

Nawar Alwesh

嗨,大卫
非常感谢您的代码。
我试图使用orientedBox3d函数但我总是在框外出现pts,我做错了什么?谢谢

X =兰特(300,3);
box3d = orientedBox3d(X);

芭芭拉·华生

大卫Legland

@claudio:函数'isPointInPolygon'包含在"geom2d"的贡献中,也在FileExchange上。如果下载并安装它,这将解决pbm问题。
我将尝试在未来的版本中包含丢失的文件,以避免这种糟糕的惊喜……
大卫

大卫Legland

@Sunita:抱歉这么长时间的耽搁…函数“clipConvexPolygon3dHP”不能直接用于立方体,但是可以为立方体的每个面创建六个对应的平面,并应用该函数六次。我将尝试包含该方法的一个更打包的版本(实际上,这是最初的计划……)。它不*不*适用于三角曲面(虽然它应该可以为每个三角形调用它,但会相当低效)。
你可以检查"clipMeshVertices"函数->它适用于三角曲面,通过指定一个包围框(你只需要将立方体转换为包围框)。但是,它不会用方框剪辑三角形->它只保留方框内的顶点,以及附加到它们的面。

克劳迪奥·卡拉拉

嗨,大卫,当我使用函数'intersectRayPolygon3d'和'intersectLinePolygon3d'时,我有这个错误消息:
未定义函数或变量'isPointInPolygon'。
如何解决这个问题?函数“isPointInPolygon”在哪里?

(Sunita萨哈

(Sunita萨哈

@David谢谢你的建议,你的代码真的很有帮助。
@David将'clipConvexPolygon3dHP'函数工作,以剪辑一个立方体内的三角曲面的面积?它是否给出了三角曲面与立方体的交点,即立方体内部的交点?

大卫Legland

第一种可能是组合几个刚性变换矩阵:一个用于平移到平面中心,一个用于旋转第一个方向向量,另一个用于旋转第二个方向向量。该库提供了用于围绕X、Y或Z轴创建旋转矩阵的函数。一个困难是计算旋转角度(s)从平面的方向向量。atan2函数应该有助于实现这一点。
同样,你可以检查“createBasisTransform3d”函数。其原理是计算将点从一个平面映射到另一个平面的(刚性)变换矩阵。如果我了解你的问题,我想你可以用一种相当直接的方式来使用它。

帕特里克·谢

我应该换个说法。我应该使用哪些函数序列来将一个三角形平面转换为另一个三角形平面,这样它们就有一个顶点重叠,并且包含公共顶点的两条边中的任何一条的方向对齐。例如,它们都在(0,0,0)上有一个顶点,在X -y平面上,并且有一条边在X轴上?

帕特里克·谢

我正在做囊泡三维变形的研究。你的代码非常有用。如果我想把一个三角形曲面变换成xy平面,transformPlane3d是正确的选择吗?

大卫Legland

嗨萨尼塔,
plane参数必须是1 × 9的数组,sphere参数必须是1 × 4的数组。可以同时处理多个输入,但在这种情况下,两个输入必须有相同的行数,或者两个输入中的一个必须有一行。
要计算圆的面积,需要提取CIRC输出的第四列,并使用area=pi*r^2公式。
希望这有帮助?
大卫

(Sunita萨哈

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

(Sunita萨哈

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

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

大卫Legland

嗨Jihee,
嗯,这又是一个我一直想要包含的功能……一个快速的解决方法是使用“intersectLineMesh3d”函数。当选择方向,创建直线,计算交点,并删除“位置”小于0的点时,可以获得与从该点发出的3D射线的交点。如果交点的数量是奇数,则该点在网格内。不过,我还没有测试过稳定性。

Jihee汉

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

大卫Legland

嗨Jihee,
感谢您的反馈!
目前,还没有完全通用的计算两个多面体交点的函数。正如你所猜测的,这是一个复杂的问题……但是,你可以考虑"clipMeshVertices"和"cutMeshByPlane"函数。如果其中一个网格是凸的,用每个面对应的平面剪辑另一个网格可能是一个可行的解决方案。
和…是的,我想在未来包括这样一个功能!

Jihee汉

Jihee汉

谢谢楼主分享!
这个文件对我找到交点非常有用。你们代码中的例子很容易理解和使用代码。
然而,我找不到一个代码,给出了两个多面体之间的交集。
我想这应该是一个复杂的问题,因为多面体是由多个面和顶点定义的,然后有两个。
有没有任何想法,找到两个多面体之间的交集通过结合当前的代码在geom3d/mesh3d?
或者,如果可能的话,您是否可以考虑在未来的版本中使用一种代码来查找两个多面体之间的交集?
再次感谢您的帮助!

大卫Legland

@Faez:目前,不可能使用“intersectRayPolygon3d”函数来使用多个多边形。然而,我认为可以实现两个函数(intersectRayPolygon3d和TriangleRayIntersection)的组合,避免使用repmat并允许多个输出。我将尝试在未来的版本中对此进行研究。

法耶兹Alkadi可并

你好大卫,

是否可以使用函数(intersectRayPolygon3d)找到与多面体(面和顶点)不同起源的射线数的交集。因为据我所知,这个函数可以适用于多个射线,但一个多边形。但我正在寻找的是多个射线,多个多边形(多面体)。
Jaroslaw Tuszynski在一个名为(TriangleRayIntersection)的函数中做到了这一点。但是这个函数在使用repmat时有点慢。

非常感谢。

大卫Legland

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

你好大卫,
我试图使用你的函数intersectLinePolygon3d找到一条线和一个stl对象之间的交点。我只是使用变量'poly'的顶点,但我没有得到一个交集时,应该有2。我想知道我的输入'poly'在这种情况下工作吗?
谢谢你!

大卫Legland

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

大卫Naviaux

感谢David精心设计的功能集。我有一个关于创建各种宽度和深度的堆栈长方体的问题,可以用来通过PDE工具箱对功率半导体进行热分析建模。每个长方体都需要有自己的热特性。我知道我可以使用matlab的“multicuboid”函数来创建一个多单元几何,如果所有的长方体都具有相同的宽度和深度。

我可以使用您的库来创建我的半导体模型吗?

谢谢你!

Abdelrhman Hany

汉娜

谢谢大卫,太棒了。我已经整理出一个解决方案,当气缸是直立的,但这已经解决了我刚刚遇到的问题,当我旋转我的气缸。

大卫Legland

4*PI因子来自两个方面。首先,平均宽度与“平均曲率积分”成正比,比例为2*PI。然后,平均曲率集中在边缘上(面内没有曲率,顶点也没有贡献)。对于每条边,一个主曲率为零,另一个是相邻面之间的二面角。因此有一个额外的因子2,得到2*2*PI=4*PI。你也可以在“polyhedronmeanwidth”中检查参考。

sarvenaz babakhani

嗨,大卫
感谢您提供的实用代码
我用了" trimeshmeanwidth "太棒了
但是我有一个关于最终公式的问题
我想知道在8的式子里除以4是为了什么?

大卫Legland

@Miten:我已经提交了一个新版本,应该可以修复你提到的奇怪行为。
@Hannah:我增加了线和气缸端盖之间的交集检测。所以这应该更好地为您工作!
此外,许多功能已经更新,并引入了一些新的功能。查看GitHub回购详情(https://github.com/mattools/matGeom

大卫Legland

的确,这个圆柱体被认为是“打开的”。如果你需要与末端的交点,一种解决方法是计算直线与包含圆柱体末端的3D平面的交点(在实践中,你需要考虑2个平面,每个末端一个)。然后可以测试交点与柱体主轴之间的距离是否小于柱体半径。我将在下一个版本中尝试添加这种行为。

汉娜

你好大卫,
我试图计算路径长度通过一个圆柱体使用intersectLineCylinder。它工作得很好,直到线进入圆柱体的一侧,但有足够的角度从顶部出来。输出只是一组坐标。这是因为圆柱体的顶部不能识别为曲面吗?如果是这样的话,你有什么建议吗?
非常感谢,汉娜

帕特里克博览

太好了!我总是回到VTK进行3d计算几何(比较MR光谱学和斜MR成像平面),但这个工具包让它变得很容易。非常清晰,简洁。

Miten帕特尔

你好大卫,

我试图了解如何使用geom3d库将一系列共面点转换到由不同系列共面点定义的平面上。

例如,如果我有一系列点,它们在YZ平面上定义了一个以0,0,0为中心的单位圆,并且我有一个随机三维角度和随机原点的平面,那么我想要在该平面上定义相同单位圆的三维全局坐标。

为了测试我的理解,我建立了一个矩阵'z',包含以下4个点z = [0 10 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 10 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('global', 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

这不是我想要的结果。首先,目标平面在X轴上平移了0.0544,而新点在Z′坐标上反映了这一平移。

同样,得到的X' Y'坐标就是我认为应该在Y' Z'坐标中的东西。此外,围绕四个点的旋转是逆时针的(如果X' > Y和Y' > Z),而原始点是顺时针旋转的。

你能告诉我我哪里错了吗?

非常感谢,米腾

你好大卫,
谢谢这个图书馆,它在我的硕士学习上帮助了我很多。我使用这个很棒的工具箱遇到的唯一麻烦是mergeCoplanarFaces方法。似乎你在后来的版本中添加了阈值变量,但我不认为它能正常工作。在研究了如何使用这个阈值之后,我发现它有两个用途。第一个是检验两个法向量的叉乘的值。第二个稍后在mergeCoplanarFaces中使用,当候选节点在isCoplanar方法中测试共面性时。这样做的问题是,虽然第一个阈值仅对0到1之间的值有意义,但第二个阈值可以是大于0的任何值,并且对于不同规模的几何图形的行为并不相同。

现在,我不知道如何去解决这个行为,但它似乎没有打破任何东西,现在只是注释出isCoplanar检查在mergeCoplanarFaces。这可能是一个可怕的解决方法,可能会在未来破坏一些东西,所以你能看看这个问题吗?

谢谢你的工具箱,也谢谢你的麻烦。
最好的
哈利勒·

大卫Legland

@ThT:我不知道为什么会发生这种行为。请用邮件发给我一个样本数据集,我试着看一下。

@Leonardo:如果我理解得很好,你想计算一个3D三角形和3D折线之间的交点?不幸的是,目前还没有这样的函数。我认为计算与直线的交集,并对结果进行后处理可以得到一些结果,但这需要一些编码工作。

问候,
大卫

莱昂纳多Colavitti

你好大卫,
感谢图书馆和你们的努力。我使用包geom3D的函数TriangleRayIntersection,我想知道是否在输入中,而不是给出直线的方向,它存在一个实现,如果我的线是一条略微弯曲的线,我知道它在每一点(基本上,我有一个矢量在3个维度)。我需要这个来解决光线追踪问题…

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

ThT基金会

你好大卫,

感谢图书馆和你们的努力。我有一个关于我正面临的问题。我在matlab中从.stl文件加载CAD模型。这给出了两个矩阵,顶点和模型的面,已经是三角形。然而,现有的三角测量有点奇怪,因此我试图以更好的方式重新格式化它。因此,我使用“mergeCoplanarFaces()”来创建超过3个顶点的面,然后以更合适的方式重新对新网格进行三角划分。然而,“mergeCoplanarFaces()”函数的输出给了我一些包含“NaN”点的多顶点面,如果我尝试绘制新的面和顶点,网格中有一些间隙,这在第一个地方并不存在。你知道它可能会发生什么吗?如果有任何解决办法来避免这种行为。
谢谢。
西奥

大卫Legland

嗨,莉娜,
直线表示的(dx,dy,dz)分量仅仅对应于两个3D点的坐标差。您可以检查“createLine3d”实用函数,它封装了这个过程。

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

否则,你可以把你的资料发邮件给我,我可以试着看看;

问候,
大卫

你好大卫,
我正在使用相交线球面函数,但我似乎没有得到正确的交点角度。我想我可能对直线的dx dy dz分量给出了错误的输入(或者至少我找不到其他解释)。你能给我一个例子如果我有一条由两点定义的直线dx dy和dz是多少?
谢谢,
莉娜

大卫Legland

嗨,安妮,
我建议尝试geom2d包中的一些功能(在FEx上也可以使用):
"removeMultipleVertices"函数合并距离足够小的相邻顶点
*“mergeClosePoints”合并距离足够小的点,而不考虑点的顺序(即,可以合并没有相邻索引的点)
这两个函数是为平面几何设计的,但也应该适用于3D。
问候,
大卫

安妮Tran

你好大卫,
我使用了intersectPlaneMesh,当计算一个平面与网格的共面之间的交点时,输出多边形包含重复的顶点。你能建议一下如何消除重复的顶点,这对我以后的处理有帮助。
帽子

Olabanji Shonibare

苏西阿曼

直线和球面相交不是很有用。这个例子不容易仿效。

李郑

大卫Legland

嗨,亚历克,
你可以检查sphericalAngle函数,它计算球体上三点之间的角度。也许你需要转换球坐标。
如果已经使用该原理计算球体上Voronoi域的球角,则为另一个贡献(3D图像中的表面积估计)。我认为你可以从源代码中获取一些代码片段:
https://github.com/dlegland/matImage/blob/master/matImage/imMinkowski/private/sphericalVoronoiDomainArea.m

的问候!

亚历克的一天

你好,我正在尝试使用这个软件(顺便说一下,它很棒)来计算一个多边形在球面上拉伸的面积。如果我有一个方位角和高程值的范围,连接在一个球体上形成一个多边形,我可以使用哪个函数来计算它的表面积(在一个单位球体上,或者更好的是,一个半径为r的球体上)?

谢谢!

亚历克。

大卫Legland

@Charles,
抱歉耽搁了…谢谢你的建议。我不使用Doxygen,所以这可能对我来说很难应用这个解决方案。但这应该为脚本或自动化打开思路。谢谢!

大卫Legland

@Chirag,
我不知道你的问题究竟从何而来。你能识别出引起麻烦的网格的一些特性吗?你能发邮件给我一个有问题的网格吗?
调查方法:
*可能在计算之前使用trimMesh函数可能会有所帮助。
*在计算平滑之前appy triangulateFaces
问候,
大卫

大卫Legland

嗨,SS,很抱歉耽搁了…
intersectPlaneMesh函数目前只适用于无限个平面。一种解决方案是在平面上投影交点,在投影上应用2D交点算法,然后投影回3D。然而,我不确定这是否简单……

大卫Legland

嗨,保罗,
intersectPlaneMesh函数需要一个“封闭”的网格,即没有自由边界的网格。环面和立方体网格满足要求,但如果应用于开放网格,得到的误差是预期的。我将尝试在一个增强版本的工作,也管理开放网格的情况。

是一家Bhuva

嗨,大卫,
我正在使用smoothMesh函数,它工作得很好,但有时它不工作,错误是内部矩阵维度必须一致。

smoothMesh错误(第55行)
V2 = adj * V2;

DemoMain错误(第31行)
[FV2。顶点,FV2。=平滑网格(FV.;顶点,双(FV.faces));

因为邻接矩阵和顶点的大小不一样,你能指导我吗?

波林Huet

谢谢David提供的代码!
我对matlab/geom3D很陌生,我在intersectPlaneMesh函数上遇到了一些麻烦。我试图从一个stl文件中读取一个网格的交集作为面和顶点(成功地用drawMesh显示)与一个平面。不幸的是,我总是得到相同的错误“交叉边1(4,5)与1个面相关联”,而对于立方体或环面等标准私属性都是正确的。你知道是什么导致了这个错误吗?提前谢谢你

年代党卫军

亲爱的大卫,非常感谢你的投稿。这对我很有用。
我使用相交平面网格函数来获得平面和网格之间的交点。实际上我有几个交点,因为这个平面是无限的。我希望只有一个交点。我想要一个有限的平面。你有解决办法吗?非常感谢

查尔斯Brillon

亲爱的大卫,我给你发了一封私人邮件(用法语)。你是否考虑过使用这个://www.tianjin-qmedu.com/matlabcentral/fileexchange/25925-using-doxygen-with-matlab生成文档?
这可能会有所帮助。

问候,

何时

大卫Legland

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

加里Kenward

大卫:
NP。很高兴我能帮上忙。

另外注意:您可能需要更新Contents文件中的版本和日期。我知道维护文档是多么痛苦,但是,我刚刚花了半个小时试图弄清楚为什么我要将2011年版的GEOM3D加载到Matlab中。怀疑你正在使用一个非常旧版本的工具箱是很麻烦的。

此外,您可能希望将版本更新到1.21或类似的版本。

总之,很棒的工具箱。谢谢你的分享。
加里

大卫Legland

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

加里Kenward

我修复了我在fillPolygon3d中遇到的问题,做了两个更改,下面用字符“%<=======”标记。我可能漏掉了一些东西,但这些改变似乎奏效了。

函数varargout = fillPolygon3d(varargin)
填充由点列表指定的3D多边形

% fillPolygon3d(COORD, COLOR)
%将坐标打包到单个[N*3]数组中。
% COORD也可以是一个单元格数组的多边形,在这种情况下每个多边形都是
%使用相同的颜色绘制。

fillPolygon3d(PX, PY, PZ, COLOR)
在单独的数组中指定坐标。

% fillPolygon3d(…, param, value)
%允许为绘图指定一些绘图参数/值对
%的功能。

% H = fillPolygon3d(…)也返回行对象列表的句柄。

%参见:
% polygons3d, drawPolygon, drawPolyline3d

%——
作者:David Legland
% e-mail: david.legland@nantes.inra.fr
创建日期:2007-01-05
版权所有2007 INRA - BIA PV南特- MIAJ Jouy-en-Josas。


%检查情况下,我们要绘制几条曲线,存储在一个单元格数组
Var = varargin{1};
如果iscell (var)
抓住;
H = [];
对于I = 1:length(var(:))
H = [H;fillPolygon3d (var{我},变长度输入宗量{2:结束})];% #好< AGROW >
结束
如果nargout > 0
varargout {1} = h;
结束
返回;
结束

%提取曲线坐标
if size(var, 1)== 1% <=======检查var是否为1 x N
第一个参数包含x坐标,第二个参数包含y坐标
%第三个是z坐标
Px = var;
如果长度(变长度输入宗量)< 3
错误(' fillPolygon3d中的参数数量错误');
结束
Py = varargin{2};
Pz = varargin{3};
Varargin = Varargin (4:end);
其他的
第一个参数包含两个坐标
Px = var(:, 1);
Py = var(:, 2);
Pz = var(:, 3);
Varargin = Varargin (2:end);
结束

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

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

填充多边形
H = fill3(px, py, pz, color, varargin{:});

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

加里Kenward

我有fillPolygon3d(PX, PY, PZ, COLOR)的问题,其中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, color, varargin{:});

有什么建议吗?

Binu

大卫Legland

嗨,特
不幸的是,目前还没有计算3D多边形或网格偏移的功能。根据你想要做的事情,你可以(1)将3D多边形投影到一个平面上,计算2D的偏移量,然后将结果投影回3D,或者(2)计算多边形的挤压,通过复制多边形,将两个多边形中的一个在垂直于多边形支撑平面的方向上平移给定距离,然后将顶点关联起来形成一个3D网格。万博1manbetx

Dimitris Mylonas

你好,如何抵消多边形在3d?

玛纳尔·阿萨德

你好,
我遇到了与质心相关的函数(调用不存在的函数)的问题。有人用过吗。如果是这样,有人能解决吗?

anusha gorrila

迦勒布朗

马尼克邦萨尔

科林Stillman

魏赵

大卫Legland

嗨Anusha,
很难弄清楚哪里出了问题。通常,对于“封闭”网格(如边界表示),与线的交集产生偶数个交集。“pos”输出对应于该行上的相对位置。负值表示位置在直线原点之前。你也可以研究“ind”输出,它对应于交叉面的索引。

仍然有可能存在一些数值计算错误,导致意想不到的点出现,但我还没有遇到……

anusha gorrila

你好,大卫,谢谢你这么棒的代码。我一直在使用intersectLineMesh3d函数从一条线找到网格上的交点,我得到2个交点,第一个的位置是负值,第二个的位置是正值。你能解释一下输出,因为我的线只在一点与网格相交。输出如下所示:

点=

536.1685 361.9645 40.1591
573.2433 399.9937 77.9874

pos =

-28.0442
10.0410

印第安纳州=

19
201

谢谢,
Anusha。

大卫Legland

嗨,汉娜,
嗯,奇怪的行为,我同意…在当前版本中,算法首先对网格进行三角剖分。因此,立方体的每一个方形面都转化为两个三角形面。如果直线的原点在立方体的中间,它将与对应于一个正方形的两个三角形相交。
顺便说一下,如果你使用额外的输出参数,它们将指向三角网格!(我会在以后的版本中增加警告或检查)。

问候,
大卫

汉娜

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

大卫Legland

你好,桑迪,
我很高兴你能找到使用isPointInPolygon的方法!
对于其他类型的交叉,你可以考虑'intersectLineMesh3d',以及'intersectPlaneMesh'函数。

的问候!

格兰特桑迪

请无视8月5日的评论。现在我看到了geom2D包是必需的。到目前为止,添加了geom2D函数,一切都很完美。

格兰特桑迪

似乎缺少了一个名为isPointInPolygon的函数,该函数由intersectLinePolygon3d调用。这是不是被忽略了?

格兰特桑迪

真是个宝藏!我现在用的是线/面交函数。我还将使用其他线/面相交函数。

大卫Legland

嗨,塔里克,
是的,inertiaEllipsoid函数根据输入点的惯性,从数据中计算一个等效的椭球。
您可以从inertiaEllipsoid结果的前三列中获得质心,也可以使用geom2d包中的'centroid'函数。
对于计算边界框的表面积,我建议将每个面的面积相加。每个面的面积可以通过乘以相应的边长得到。

问候

tariq bdair

你好大卫,

惯量椭球函数是否像二维数据那样计算最佳拟合椭圆?
另外,如何获得双数据的质心?
如何计算包围框的表面积?

谢谢你!

大卫Legland

嗨,Md Shadir,
您将需要一个函数来解析PLY文件,并提取每个面的顶点坐标和顶点索引。在其他库中也有一些工具,例如Gabriel Peyre的图形工具箱(函数'read_ply'),或计算机视觉工具箱(函数'pcread')。
但是请注意,据我所知,PLY文件只提供顶点坐标。所以你需要计算你的网格的面。在这种情况下,我建议使用delaunay三角剖分,然后尝试删除不必要的四面体(这可能是一个复杂的任务……),并提取它们的外部表面。

问候,

Shakir Khan博士

你好大卫,

伟大的提交。我一直在研究“geom3d”,并试图为我的项目实现“intersectLineMesh3d”。但是我需要使用3D网格数据(。厚度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 Fusion创建的评论文件
元素顶点2959173
属性float x
属性浮动y
属性float 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 2959148
3 2959149 2959150 2959151
3 2959152 2959153 2959154
3 2959155 2959156 2959157
3 2959158 2959159 2959160
3 2959161 2959162 2959163
3 2959164 2959165 2959166
3 2959167 2959168 2959169
3 2959170 2959171 2959172

Shakir Khan博士

但是我需要使用3D网格数据(。厚度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 Fusion创建的评论文件
元素顶点2959173
属性float x
属性浮动y
属性float 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 2959148
3 2959149 2959150 2959151
3 2959152 2959153 2959154
3 2959155 2959156 2959157
3 2959158 2959159 2959160
3 2959161 2959162 2959163
3 2959164 2959165 2959166
3 2959167 2959168 2959169
3 2959170 2959171 2959172

Sleh Eddine Brika

尼尔斯·Schroeter

大卫Legland

嗨,安迪,
我不知道你究竟想干什么;一种可能是识别位于多边形网格中的面。在这种情况下,你需要检测是否所有的顶点都在网格内。目前在geom3d中没有这样的函数,但我认为在FEx上有。另一种可能是显示不同透明度的人脸。在这种情况下,我认为更简单的是直接操纵网格的图形处理。
希望这有帮助?

Jan Roediger

亲爱的大卫,这真是一个很棒的图书馆!
然而,我正在专门寻找一个功能,在一个复杂的补丁中删除内部面(确切的功能如下所述:http://meshlabstuff.blogspot.com/2009/04/how-to-remove-internal-faces-with.html).你们知道我怎么在Matlab中做这个吗?

非常感谢你的提示!

安迪

dingkun丽安

dingkun丽安

dingkun丽安

大卫Legland

你好,
在3D图像中提取3D像素的位置并不复杂(例如使用find函数),对于管理自遮挡,在geom3d中没有直接的解决方案…一个可能的解决方案是重建3D位置集(例如使用移动的立方体),然后考虑与视图方向平行的光线重建结构的交叉点。通过对交点在射线上的相对位置进行排序,可以获得结构的虚拟视图。然而,这可能需要大量的计算机。

UTA

嗨,大卫
谢谢你的代码。我还感兴趣的是提取3D对象在特定视图方向上的像素位置。也就是说,我想在考虑自遮挡后得到3D像素的位置。你能在这方面给我一些帮助吗?
谢谢吧!
weihua

大卫Legland

嗨,亚历克斯,
不幸的是,目前还没有这样的功能,如果geom3D工具箱。但你可以查看以下(最近!)提交://www.tianjin-qmedu.com/matlabcentral/fileexchange/55803-surfaces-intersect
如果你将一个3D多边形转换成一组三角形面,我想你可以使用“曲面相交”来计算交点。

问候,

亚历克斯谨言

你好大卫,

谢谢你的解释和修改代码。
我还有一个问题。是否有可能以某种方式剪辑一个三维多边形的另一个形状,例如一个圆柱体而不仅仅是一个平面?

谢谢
亚历克斯

大卫Legland

嗨,亚历克斯,
网格体积的计算是正确的:你需要考虑有符号的体积来考虑非凸网格。比如,你可以试着用一个环面。作为一种快速的解决方法,您可以考虑使用abs(det),但是该函数只会对凸网格(或者与原点有关的星形网格)返回正确的结果。

实际上,这个错误出现在“clipConvexPolyhedronHP”函数中。在这个过程中创建了一个新的面,它的方向与网格的其他部分不一致。我已经更新了包,应该可以解决pbm问题。
问候,

亚历克斯谨言

下面是我之前的评论,似乎在meshVolume函数的实现中有一个bug。

该功能将体量划分为四面体。那么总体积等于所有四面体的体积之和。该代码通过计算顶点的行列式来计算体积。

Vols (i) = det(tetra) / 6;

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

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

Vols (i) = abs(det(tetra)) / 6;

这样问题就解决了。

亚历克斯谨言

我感兴趣的是计算椭球在用任意平面切片后的体积。我使用下面的代码(这里为了简单起见,我将使用一个球体并在中心切割它)。

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

这可以计算出一个球体的体积(4/3*pi)

现在我把它切成两半。

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

现在如果我计算体积,我会得到错误的值。如果我把它画出来,我可以看到原因是球体被切割的表面是敞开的。

drawMesh (v1, f1, facealpha, 0.5)

我的问题是如何关闭形状,这样体积就可以正确计算。

谢谢!

大卫Legland

嗨,迈克尔,
抱歉,在多面体质心函数中有一个bug…我刚刚提交了一个修订版,应该解决这个问题。

大卫Legland

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

Umair Bin Asim

有没有办法,可以求出任意三维形状的体积由一组三维点定义?

迈克尔Strohmeier

你好大卫,

谢谢你的回答。
我有另一件事要麻烦你。
我编译polyhedronCentroid。m我得到的错误'未定义的函数或变量“vt”。我从哪里得到“vt”的数据?

先谢谢你,
迈克尔

大卫Legland

嗨,迈克尔,
不幸的是,我认为这是不可能的……已经有一个矢量化过程,以全局的方式管理网格的所有面。这样就很难用矢量化的方式来处理直线了。

特里斯坦·卓别林

你好大卫,

非常感谢,正如我所希望的那样。

谢谢,
特里斯坦

迈克尔Strohmeier

你好大卫,
你的图书馆很有用!谢谢楼主分享!

我使用intersectLineMesh3d,为了得到所有交点,必须循环几条线的函数。
我想知道是否有可能修改代码以使用多行…就像你最近为intersectLineSphere所做的那样(Tristan Chaplin的最后评论)。

这将是非常有用的,因为围绕函数的循环对我的目的来说太慢了。

非常感谢!
迈克尔

大卫Legland

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

特里斯坦·卓别林

你好大卫,

谢谢这个图书馆,它对我很有用。

我想知道,是否有一个方法来使用intersectLineSphere多线?类似于intersectLinePlane的工作方式?对于我的目的来说,使用for循环并逐行执行每一行太慢了。

谢谢,
特里斯坦

大卫Legland

你好戴尔,
事实上,直线和射线都是无限的。如果P0是原点,V是方向向量,两个形状都表示满足P = t * V + P0的点集合。对于直线,t的取值范围是-正无穷到正无穷,而对于射线,t的取值范围是0到正无穷。还要注意的是,LINE或RAY变量只表示原点和方向向量,而不是形状的“类型”。线和射线之间的区别只能通过调用适当的函数来实现。

如果你想找到与一条有限线(“线段”)的交点,你可以从'linePosition3d'函数中得到交点在直线上的位置't'。如果值在0到1之间,则该点位于P0和P0+V之间的线段上。

希望这能有所帮助,
大卫

戴尔炸

你好大卫,

谢谢你分享这个很棒的图书馆。我已经使用它相当多了,现在正在尝试一个新的应用程序。

我错过了什么是intersectLinePolygon3d和intersectRayPolygon3d之间的功能差异。

我希望线函数能理解有限长度,但是文档只提到了原点和方向向量。应该写成"方向向量给出线段长度"吗?

我误解了什么?

谢谢。

戴尔

穆纳马吉德

你好大卫,

真的很棒的工具,非常好!它帮我解决了很多问题。谢谢你和我们分享。
请,我问你我可以通过这个工具裁剪或分割obj类型的网格,请我需要它

大卫Legland

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

Yiyu香港

你好大卫,

我修改了你的intersectPlaneMesh函数代码,使它能够找到多个轮廓。你需要密码吗?

大卫Legland

@Homa Rasouli:
为了计算一个多边形网格的表面积,你需要一个顶点坐标的数组,以及一个存储每个面顶点索引的数组。例如,这样的数组可以从'isosurface'函数中获得。否则,您可以从网格文件格式(如OFF或PLY)读取它们。

Homa Rasouli

我在计算三角形网格的表面时遇到了问题。该函数仅以三角形网格作为输入。我该如何计算顶点呢?

大卫Legland

@SM:
你是对的,我使用XYZ惯例:这三个角度对应于围绕X、Y和Z轴进行的外部旋转,按此顺序。注意,结果行向量的顺序是[thetaZ thetaY thetaX]。
关于反向操作的详细信息,请参见“eulerAnglesToRotation3d”函数。
问候,大卫

SM

你好大卫,

你在Rotation3dToEulerAngles文件中遵循了什么约定?我对这些方程不是很熟悉,但在我看来这是一个XYZ约定。
谢谢,扫描电镜

大卫Legland

嗨,约翰,

多面体的体积是根据面的方向来确定的。如果面朝外,体积为正,否则为负。您可以简单地考虑结果的绝对值。注意确保所有面的方向是一致的:您可以使用“checkMeshAdacentFaces”来实现这一目的。

大卫Legland

嗨,德克斯特,
要绘制3D多面体,可以使用“drawMesh”函数。它使用经典的Face-Vertices表示法。为了创建多面体,你可以看看'steinerPolytope'函数,它似乎可以满足你的需求。
问候,

大卫Legland

嗨,德克斯特,
要绘制3D多面体,可以使用“drawMesh”函数。它使用

你好大卫,
谢谢你的快速回复。我现在使用以下代码:

K = minConvexHull(tmpvert,myEPS)';
tmpInd = unique(cell2list(K));
[K, vol] = minConvexHull(tmpvert (tmpInd,:),myEPS);

我修改了你的minConvexHull来传递来自qhull和cell2list的体积,本质上是cell2mat。

关于音量:我想应该是

Abs (det(tetra) / 6)

在你的meshVolume函数?否则,总的体积就不是正的。

德克斯特

Hej,大卫:

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

最美好的祝福!

马特奥

你好大卫,

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

大卫Legland

嗨,马修,
你可以检查'intersectLineMesh3d'函数。它使用[x0 y0 z0 dx dy dz]的形式表示直线,其中(x0,y0,z0)是直线的原点,(dx,dy,dz)表示直线的方向向量。网格表示为顶点+面,顶点为Nv-by-3顶点坐标数组,面为Nf-by-3, Nf-by-4顶点索引数组,或允许更多通用面的顶点索引单元格数组。

有一个函数用于读取OFF格式的网格('readMesh_off')。否则,您可能希望检查导入(并最终转换)您的文件的其他贡献。参见图表工具箱的例子。

马修Brandsema

你好,我刚刚发现了这个工具箱,我想知道你是否可以告诉我,我想做的事情是可能的与这些功能。

我有一个三维空间中直线的矢量方程,我想确定它与一个网格相交的位置。

该网格将是在外部建模程序中创建的网格。(我可以通过打开.obj文件并提取信息来获得关于其顶点坐标的所有信息。)

我还需要知道网格在交点处的法向量。

这能做到吗??

弗里茨

大卫

大卫Legland

@Abdulrahman,
对不起,我没听到你的评论…没有直接的函数来测试一个点是否在3D圆内。你可以做的是1)提取包含圆的平面,2)测试点是否属于平面,3)如果是,计算点在2D平面中的坐标,并测试2D点是否在2D圆内(你可能还需要geom2d)。
希望这有帮助?
问候

大卫Legland

嗨,金,
是的,这个函数有数值精度问题…我已经提交了一个新的版本,在寻找人脸边缘的交集时更加宽容。然而,有时会得到太多的交叉点。你可以通过使用geom2d工具箱中的'mergeClosePoints'函数来删除它们。
问候,
大卫

你好大卫,

真的是很棒的工具!它帮我解决了很多问题。谢谢你和我们分享。

最近我经常使用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

这个命令
[inter pos inds] = intersectLineMesh3d(线,V,P)只给我一个交集,但它应该有两个代替。你能帮我一下吗?我是否误解了输入和输出的含义?非常感谢。

大卫Legland

@Johannes,
新的面集合指的是这些面实际使用的顶点的索引。所以有必要使用以下语法:
[V2 F2] = mergeCoplanarFaces(顶点,K);
drawMesh (V2, F2);

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

对于公差值,它用于比较含面平面的归一化法向量。可能会有一些数值问题,但使用1e-4应该没问题。

问候,
大卫

大卫

有没有一个函数可以在2d圆中找到3d点!?

提交得好,谢谢

约翰内斯·诺伊曼

亲爱的大卫,
我很高兴找到geom3d,因为它提供了许多我需要的工具。然而,我担心在mergeCoplanarFaces()中发现了一些奇怪的地方。我有Voronoi多面体,被剪裁到适合内部,例如一个立方体。这是一个mwe:

%%%代码%%%

关闭所有;
清除所有;
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;

%三角形面可由旋流得到
K = convhulln(顶点);

显示多面体
图(1);clf;抓住;
Set (gcf, 'renderer', 'opengl');
drawPolyhedron(顶点,K);

K2 = mergeCoplanarFaces(顶点,K, 1e-4);

绘制多面体
图(2);clf;抓住;
Set (gcf, 'renderer', 'opengl');
drawPolyhedron(顶点,K2);

%%%代码%%%

对于v1, mergePlanarFaces仅在PRECISION设置为值> 1e-5时合并面。这让我很吃惊,因为这个特殊的多面体不是我修改的,而是直接来自convhull。对于v2,结果似乎完全是乱码。

我做错什么了吗?

欢呼,
约翰内斯

大卫Legland

嗨,钱婷!
谢谢,修好了!是的,如果你有更多的更新,我会包括它们。不要犹豫,通过电子邮件联系我(在我的作者页面)

问候,
大卫

钱建廷

我已经使用你们的工具箱很多年了,感谢你们提供的一些很棒的工具。

在drawEdge3d。m,第29行,我认为是一个错误,它永远不会被执行。正确的句子应该是:
Elseif nargin >= 6;

我也完成了drawEdge3d的文档。M供我的小组使用。如果你想看/使用我的版本,请告诉我!

谢谢这些很棒的工具!

钱建廷

抱歉,我粘贴了原来的行。正确的句子应该是:
Elseif nargin >= 6;

Jdeen

大卫Legland

@John,

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

希望这有帮助?

约翰·安德森

嗨,大卫,很好的屈服,

我想我已经注意到调用intersectPlaneMesh的一个小问题。M,不确定之前是否有标记。

当我执行以下计算平面与球面的交点时,我发现当N = 10时,我得到了误差

使用horzcat出错
被连接的矩阵维度不一致。

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

testIntersectingMesh1中的错误(第27行)
polys = intersectPlaneMesh(平面,顶点,面);

然而,当N=15时,没有执行问题

代码:

%创建平面
plane = createPlane([0 0 0 0], [0 1 1]);

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

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

%顶点
顶点= trix;

%面形成凸包
faces = convexHull(tri);

班;
固体百分比
patch('Vertices', Vertices, 'Faces', Faces, 'facecolor', 'y', 'edgecolor', 'y', 'facealpha', 0.1);
抓住;

%相交多边形
polys = intersectPlaneMesh(平面,顶点,面);

%绘制多边形
drawPolygon3d(polyys, 'color', 'b', 'LineWidth', 2);

百分比填充多边形
fillPolygon3d(polyys, 'r', 'faceAlpha', 0.2);

最好的祝愿,

大卫Legland

你好杰,
谢谢,我会检查的!我记得我在叉乘之前使用了归一化来提高稳定性,但我必须再检查一次。不管怎样,应该在下一个版本中修复!

杰戈麦斯

很棒的图书馆,我一直都在用,谢谢。
更正一下:

函数normals = facnormmal(节点,面)

如果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

其他的
法线=零(长度(面),3);

i = 1:长度(脸)
Face = faces{i};
计算第一个边的向量
V1 = nodes(face(2),1:3) - nodes(face(1),1:3);
V2 = nodes(face(3),1:3) - nodes(face(1),1:3);

%归一化向量
% v1 = normalizeVector3d(v1);%去除
% v2 = normalizeVector3d(v2);%去除

使用叉乘计算法线
法线(i,:) = cross(v1, v2, 2);
结束
normals= normalizeVector3d(normals);%修正GTG 2014
结束

---------------
总是最好在最后归一化,否则最终法线不会归一化,因为在交叉计算中的四入等错误,这也有消除2个调用normalizeVector3d的好处,使facnormmal更快一点。

samart

哈立德•凯利

经过一些小的初始调整,我发现这是一个非常有用的任务。尽管它的大小,所有部分似乎无缝地工作在一起。谢谢大卫。

Shaoshuai

很有帮助!谢谢分享!

jr !Menzinger

非常有用的。

大卫Legland

嗨,塞德里克,
谢谢你的兴趣!
实际上,质心函数在“geom2d”库中提供,在Fex上也可以使用。我尽量减少两个提交之间的依赖关系,但显然有些仍然存在……
你也可以用下面的代码替换演示脚本中的质心调用:

faceCenter = mean(vertices(faceVertices,:), 1);

这也可以。

问候,
大卫

塞德里克

你好大卫,
感谢您的代码!
我有个小问题。
我不能编译DrawSoccerBall。M演示函数。

调用centroid函数时缺少一个参数,因为centroid函数的定义是function centroid = polyhedronCentroid(顶点,面)
编译时的错误信息:
未定义的函数'centroid'用于类型为'double'的输入参数。

drawSoccerBall错误(第56行)
faceCenter = centroid(vertices(faceVertices,:));

大卫Legland

@Yong Min Yoon:
我刚刚意识到我已经实现了一个“polygonArea3d”版本,这是包括在geom3d存档…所以我觉得这个应该能搞定!
问候,
大卫

大卫Legland

@Yong Min Yoon:
如果你能让这个函数更好地工作,那就太好了!你能把代码发给我,这样我就可以把它包含在未来的版本中了吗?
对于多边形区域,在geom2d中有一个函数“polygonArea”,它适用于平面多边形(注意它返回一个带符号的区域)。你可以使用"projPointOnPlane"函数将三维多边形转换为平面多边形。我想这应该可以作为计算区域?
问候

尹永敏

@David
我修改了你的intersectPlaneMesh函数代码,使它能够找到多个轮廓。

下一步,我想知道你的作品中是否有多边形(封闭轮廓)的面积计算。

如果你告诉我,这将对我有很大的帮助。谢谢你!

尹永敏

@David
你的代码完全是我想要的。我要试着修正你的代码。你能解释一下你们部门的问题吗?

大卫Legland

@Yong Min Yoon:
首先很抱歉没有及时回复;
目前您正在使用的函数还没有完全实现。它期望返回一组多边形,但目前只返回一个。我计划扩展到多个多边形,但这将需要一些工作(一个想法将递归链接相邻的顶点,直到第一个顶点到达,然后开始一个新的多边形)。所以,目前没有简单的解决方案,但请继续关注……

尹永敏

@ David Legland

首先,非常感谢你的代码。我对你的“intersectPlaneMesh函数”有一些问题。

我试着做一些椎骨的横截面信息。你的代码将被用来弥补这一点。

当我将该代码与椎骨网格数据一起使用时,预计会有2个轮廓来显示横截面。但是,图中只显示了一条轮廓。

我认为你的polyys变量在intersectPlaneMesh中返回,是用来表示多个轮廓来显示被平面相交的区域。

如果是正确的,你能解释一下如何通过平面来设置多个轮廓吗?

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

P.S. intersectionpoints在你的intersectPlaneMesh函数中似乎准确地显示了网格数据上的相交点。

埃文

@David:
谢谢你的回复。你在这里提供的已经非常有帮助了。

对于计算顶点法线,我也有一个小建议。如果我没看错的话,这个函数在求平均值之前对面法线进行归一化。但事实证明,按面积和角度来称重更准确(http://www.bytehazard.com/code/vertnorm.html).对于area,我相信这仅仅意味着在调用faceNormal时不使用normalizeVector3d。单独编码角度部分应该不难,但我只是把它提出来以防你们感兴趣。

@Sven:
太棒了,谢谢你的提醒。

斯文

@Evan,
请退房//www.tianjin-qmedu.com/matlabcentral/fileexchange/43013-unifymeshnormals
它应该能满足你的要求。

斯文

@Evan,
我正在做的就是这个。我会在这里与你保持联系。

大卫Legland

@Evan:
根据网格的构造方式,法线的方向可能是一致的(即,都指向网格外),也可能不是。
函数“facnormmal”没有对此做任何假设,而是简单地计算每一张脸的法线。

然而,其他一些函数需要正确的法线方向。例如,vertexNormals就是这种情况。

我没有完美的解决方案…我已经写了“checkMeshAdjacentFaces”来检查给定网格的正常方向一致性,使用它也是安全的。但我没有直接的解决方案,重新定向面法线在给定的方向。

希望这有帮助?

埃文

你好David,我有一个关于计算法线的问题。在函数faceNormal中,您提到没有定义方向。但在vertexNormals中,faceNormals用于计算顶点处的法线。这不会导致一些问题,还是我错过了什么?

我特别感兴趣的是计算一个面向同一方向的表面(面或顶点)的法线,我知道这是一个困难和非平凡的问题。你有什么建议吗?我注意到checkMeshAdjacentFaces函数,但我不确定它是否对“重新定向”特定法线有用。

尹永敏

首先,非常感谢你的代码。我对你的“intersectPlaneMesh函数”有一些问题。

我试着做一些椎骨的横截面信息。这是用你的代码做的。

当我将该代码与椎骨网格数据一起使用时,预计会有2个轮廓来显示横截面。然而,只有一个轮廓显示的数字。

我认为你的回归(多边形)是用来表示多个轮廓来表示被平面相交的区域。

我的想法对吗?如果是正确的,你能解释一下如何通过平面来设置多个轮廓吗?

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

P.S. intersectionpoints在你的intersectPlaneMesh函数中似乎准确地显示了网格数据上的相交点。

大卫Legland

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

便雅悯

亲爱的大卫,

我是一个新手用户,所以这可能是我的一个失误,但我认为它值得提及。

我一直在尝试使用cylinderMesh函数,但收效甚微。我甚至尝试了“画一个旋转的圆柱体”的例子,但我得到的是
索引超过矩阵维数。

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

气缸网格错误(第63行)
[顶点面]= surfToMesh(x, y, z);

我不太确定是什么引起的,有什么想法吗?

便雅悯

大卫Legland

嗨,哈立德,
谢谢你报告问题。我将检查球面坐标中给定点的行为。这个函数可以很好地使用笛卡尔坐标给出的点(假设球体居中),所以我希望这可以帮助使用这个函数。

问候,
大卫

哈立德•凯利

恕我直言,我的意见很有价值。我确实有一些轻微的批评。我下载了geom3d,以便“快速”检查我的代码,以确定球面角度,正如函数“sphericalAngle”所承诺的那样。我只调用sphericalAngle,正如它的帮助中所显示的那样。我最终浪费了两个小时的宝贵时间来解决各种问题。[1]调用已更改名称的函数。抱歉,但我只是停止跟踪(有些已经在这些评论中提到)和[2]createPlane,从sphericalAngle内调用显然与错误的维度。[3] intersectLinePlane抱怨第71行矩阵维数不匹配。老实说,我认为坚持不懈是我的强项之一,但我在这一点上放弃了,因为我不知道如果我继续使用geom3d,这个非常简单的操作将花费我多少时间。抱歉,但是流畅的程序流程非常重要,特别是在大量的代码提交中,比如这个。

大卫Legland

嗨Orestis,

你可以检查'intersectPlaneMesh'函数,它计算由一个多边形网格与一个平面的交集产生的3D多边形。所使用的算法很简单,因此可能存在数值问题。然后你可以用'polygonArea3d'函数来计算面积。通过考虑几种飞机,你应该能够做你想做的事情。

在geom3d中没有读取STL文件的函数。所以你要么自己写,要么自己找。

问候,
大卫

Orestis

亲爱的大卫

你能让我知道你的库是否可以用我的命令切片3d stl文件与任意平面?

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

谨致敬礼

大卫Legland

亲爱的俄罗斯,

感谢您的反馈!实际上,许多函数都需要geom2d才能正常工作。我试图使geom3d尽可能独立和独立,但强烈建议下载geom2d。我将更新您提到的不同函数,以删除/减少依赖项。

问候,
大卫

Dmitri Kamenetsky

很棒的包!一些小错误:

1.circleToPolygon函数缺失。它被称为demoRevolutionSurface,
drawTorus和torusMesh。
2.vectorNorm现在是vectorNorm3d。它用于intersectLineTriangle3d, triangleArea3d。
3.drawEdge现在是drawEdge3d。在demoGeom3d中使用。

Dmitri Kamenetsky

还有一个bug: circleToPolygon函数缺失。它在demoRevolutionSurface, drawTorus和torusMesh中被称为。

panagiotis

@Sven
很抱歉,我不知道平面创造的观点。我的背景参考书目中没有这样的信息。谢谢你告诉我。

斯文

@panagiotis:我强烈建议你再读一遍createPlane的文档——它非常简短和清晰,但你的评论表明你仍然有一个误解。

你似乎认为“3点是一个平面”。这是不对的。一个平面就像一个坐标系——它有:

-原点
- x方向向量
- y方向向量

你可以用3个点来“创建”一个平面,但平面“不”只是3个点。当你阅读createPlane的帮助时,你会看到第一个例子,它向你展示了如何从3个点创建一个平面:

createPlane(Pt1,Pt2,Pt3)

你会看到PLANE不等于[Pt1,Pt2,Pt3]。有*非常*好的理由,一旦你阅读createPlane的帮助,你就会明白。

panagiotis

@David
大卫,你说得对,但没想到用三点来定义平面会有误解!我认为这是普遍接受的。没有听说过从第三点开始的平面方向。
总之,我有了新想法。

在createPlane中,对于叉乘只考虑第2点和第3点。你不会创造p1-p2和p1-p3这样的向量。在我看来,如果你为所有平面定义[0 0 0]点。在某些情况下,正常在我看来是错误的,没有找到任何帮助。如果我用向量,结果是好的。

平面=[1 1 1 2 2 1 3 3 1]
planeNormal(飞机)
Ans = 0 0 0

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

大卫Legland

@panagiotis:
显然你自己都没想过寻求帮助。“help planes3d”,“help projPointOnPlane”,甚至“help geom3d”都可以为您提供库中用于表示平面的定义。

仅仅因为你不想读文档就给出低评级有点不公平……

顺便,非常感谢Sven的支持!万博1manbetx

问候,
大卫

panagiotis

斯文,谢谢你告诉我。事实是我并没有得到那么深的帮助。
只要我再次使用图书馆,我就会重新考虑1星评级!
谢谢!

斯文

嗨,Panagiotis, projPointOnPlane的帮助说“…PLANE是一个[N*9]数组(详见createPlane)”。createPlane的帮助对定义非常清楚。

不管怎样,我很高兴你的问题已经被发现了。另外需要注意的是,你的“其他”方向向量被指定为[0 11 1],这不是“正常化”(即,它的大小大于1)。这不会影响projPointOnPlane,但它可以影响其他函数,如planePosition,如果你打算使用它们。

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

panagiotis

@斯文
对于这个定义没有这样的通知。我不知道第三点决定了平面的方向。

斯文

@panagiotis:

你对平面的定义没有意义:

平面=[0 1 0 0 1 1 0 0];

注意,7:9的元素都是零。元素7:9给出了平面的y轴方向向量。一个全为0的向量根本没有方向,因此不可能将一个点投影到这个平面上,因为这个平面根本不存在。

panagiotis

@Sven(这个库的强大防御!)

点=[0 0 0];
平面=[0 1 0 0 1 1 0 0];
projPointOnPlane(点、平面)
ans = NaN NaN NaN

斯文

@panagiotis:

>> projPointOnPlane([100 100 0],[0 00 0 100 0 10])

ans =

100 100 0

...我觉得还好。请提供一个可重复的错误。

panagiotis

我发现的主要问题是在geom3d库中的projectionPointOnPlane。我们试着在一个平面上投影一个点这个点已经属于这个平面了。得到的结果是NaN而不是点的坐标。这导致了其他函数的一些问题,如交集。

Panagiotis

斯文

@panagiotis:请描述你发现的实际问题。我敢打赌,如果你发现了一个可重复的错误,大卫会很快解决它。只是说“十字路口有错误”实际上并没有多大帮助,也不会让任何人把包改进到你认为它应该得到的1星以上。

panagiotis

亲爱的大卫,
我使用你的图书馆几个月了,我发现了一些错误,特别是在投影点和交点上。
我想你可能会觉得有用。

Panagiotis

大卫Legland

你好查尔斯,
我在sourceforge上创建了一个名为“matgeom”的项目页面,收集了geom2d和geom3d。有一些论坛设施,所以这应该更容易张贴数据,我认为。
http://matgeom.sourceforge.net/

问候,
大卫

查尔斯

亲爱的大卫,
我试图使用surfToMesh和meshSurfaceArea函数来计算在X-Y平面上指定的X和Y坐标的点所覆盖的大致面积。但是,区域返回的值对我来说没有意义。我想知道我是否可以在这里附加矩阵,并获得一些帮助,为什么它在我的代码中不起作用。这些点几乎代表了一个半圆,结果给了我一个接近这个直径的圆的面积。在啮合上有一些公差设置吗?非常感谢!

最好的
查尔斯

学生大学

嗨,先生
基本上,我必须画出这个3D矩形,并划分它的面
不同的无限小区域,然后把矩形分成小块。
然后我需要采取区域和体积的顶点坐标和
也是它们中心点的坐标
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勒

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

大卫Legland

@Hoai-Nam,
我已经提交了一个新版本,其中有一些你应该会发现有用的新功能:
*函数'reversePlane'和'reverseLine3d',避免显式排列方向向量
*函数intersectPlaneMesh,返回平面和3D网格之间的交集。还不是一个完整的剪辑功能,但这应该有帮助!

问候,
大卫

尤里

大卫,非常感谢!尤里

大卫Legland

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

anglePoints3d(p1, j1, l1)
ans =
1.5708

Hoai-Nam勒

亲爱的大卫,

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

我用了你的一些函数,我发现了一些东西:

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

我想用一个平面来夹住这个凸包。这就得到了函数。

有2种方法可以用你的工具箱做到这一点:

1/使用函数clipConvexPolyhedronHP。这对我的问题有效!
但是如果我们想要有一面凸包(在平面的下方或上方)来剪辑,我们必须有一个正确的平面输入!!

例如:
chX = convhulln(Pts);%Pts: 3D点集

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

这个函数createPlane给了我:plane=[0,0,0.7,0,1,0,1,0,0]
然后函数clipConvexPolyhedronHP返回一个错误的多面体。所以我将平面的两个方向向量进行排列:plane=[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的一个简单的命令来控制我想要剪辑的多面体的侧面!

所以我反馈你这个纠正功能多面体切片!

我不知道是否有人问过这些事情…

问候,
不结盟运动

尤里

大卫,非常漂亮有用的包。谢谢。

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

然后是平面外的一点和平面上的投影点:

>> l1 = [40,40,40];
>> j1 = projPointOnPlane(l1, pl);

l1, j1与平面上任意一点的夹角为/2。然而,这是我得到的:

>> alpha_rad = sphericalAngle(l1, j1, p3)

alpha_rad =

1.5745 (~ pi/2)

>> alpha_rad = sphericalAngle(l1, j1, p1)

alpha_rad =

0 + 2.1073e-08i (= 0)

>> alpha_rad = sphericalAngle(l1, j1, p2)

alpha_rad =

3.1416 - 0.0000i (= pi)

你能解释一下这个函数的工作方式吗?

谢谢

马克

很好。谢谢

美联社

伟大的工具。

亨利·史

麦尔斯

Haochen唐

你好大卫,

谢谢你!我不理解定义。我以为这是原点和终点。非常感谢。

最好的
Haochen

爱德华多

你好大卫,
我将尝试使用其中的一些函数。首先,为了得到交点,我只想做一个切片,只有在那之后,我才会用其他平行平面来做。
谢谢。

问候,
爱德华多

大卫Legland

嗨,爱德华多,
你想做的似乎是可能的,但据我所知没有直接的方法。
在“meshes3d”子包中有一些函数可以帮助你,比如intersectLineMesh3d或polyhedronSlice。你也可以使用intersectEdgePlane ->你可以获得一个平面和所有边之间的交点的集合。如果你想将切片表示为3D多边形,你仍然需要以适当的顺序连接点。

@Haochen:
注意三维线的定义。在工具箱中,3D线用[x0 y0 z0 dx dy dz]表示。为了定义一条垂直线,你应该使用[0.6 0 0 0 0 0 10]。在这种情况下,你会得到正确的结果。

问候,
大卫

大卫Legland

嗨,爱德华多,
你想做的似乎是可能的,但据我所知没有直接的方法。
在“meshes3d”子包中有一些函数可以帮助你,比如intersectLineMesh3d或polyhedronSlice。你也可以使用intersectEdgePlane ->你可以获得一个平面和所有边之间的交点的集合。如果你想将切片表示为3D多边形,你仍然需要以适当的顺序连接点。

问候,
大卫

Haochen唐

你好大卫,

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

Pts3d = [-1 -1 5;1 -1 5;1 1 5];
Line =[0.6 0 0 0.6 0 10];
[inter inside] = intersectLinePolygon3d(line, pts3d);

我得到:
山=

0.9000 0 5.0000

在=

1

我们能得到inter = 0.6 0 5吗?

非常感谢,
Haochen

爱德华多

嗨,大卫
我试着切一个三角形的网格。我不是Matlab的专家,在实现这一点上我有一些困难。我有这些边,我正试图得到几个平行平面的交点……
你能帮我一下吗?
谢谢´s。

问候,
爱德华多

大卫Legland

嗨,阿曼达,
我不知道类似的图书馆scilab。我怀疑你需要重新编码所有的东西……
如果你正在寻找一个免费的替代方案,我可以提到一个端口到八度的库geom3d+geom2d:
http://octave.sourceforge.net/geometry/index.html

问候,
大卫

阿曼达

嗨,大卫
我已经使用这个包很多年了。真的很喜欢。谢谢你出色的工作。现在我正在研究使用Scilab取代Matlab的一些应用程序。搜索了scilab,但没有找到geom3d可用。任何建议吗?

阿曼达

天津大学

大卫Legland

嗨,近红外光谱,
你是说3D多边形还是3D网格?你好像在说网格,对吧?在这种情况下,您使用函数“intersectLineMesh”(包含在更新的提交中)。这个应该可以了。

@Benjamin:我也在更新中添加了一个函数polygonArea3d。

近红外光谱

嘿,大卫,
看来函数如下:
intersectRayPolygon3d
intersectLinepolygon3d
不能正常工作。
我有一个矩形3D多边形(相当简单,像一个拉长的立方体)由顶点和它的边的平面定义。
一条线或一条射线,在任意方向上的一个位置都应该生成一个交点。这行不通。不是为了一条线,也不是为了一条射线。

顶点:
0 0 0
00 2.7000
5.7000 00
5.7000 0 2.7000
5.7000 7.0000 0 .单击“确定”
5.7000 7.0000 2.7000
0 .0 .0
0 7.0000 2.7000


来源:2.8508 3.5013 1.3500
方向:-0.1 0.1

帮助吗?

汉斯·

谢谢你的伴侣。啤酒飞向你:)

大卫Legland

嗨,本,

你可以检查“polyhedronSlice”功能。它计算了由多面体与平面相交而得到的三维多边形。使用示例:
[nodes faces] = createCube;
plane = createPlane([.]5 .5 .5], [2 3 4]);
poly =多面体切片(节点,面,平面);
图;抓住;
drawMesh(nodes, faces, 'facealpha', .5);
fillPolygon3d(聚,“m”);

没有(还没有…)函数用于计算3D多边形的面积。然而,它可以通过投影在相交平面上得到:
poly2d = planePosition(poly, plane);
= abs(polygonArea(poly2d))

问候,大卫

本杰明Sanderse

你好大卫,

谢谢你的出色工作。我正在寻找一个例程,可以找到一个多边形的(面积),结果从一个平面和一个立方体之间的交集。你的图书馆能做到吗?

认为,本

大卫Legland

你好,帕特里克,

不,你没有错过,而且可能会有用。我将在未来的版本中添加它。

问候

帕特里克•Eschle

distanceLine3d作用于无限行a+t*b。有时(碰撞检测)需要线段AB和线段CD之间的距离。distanceSegment3d会很有用。

对于点(distancePointSegment)也是如此。

还是我错过了?

帕特里克•Eschle

写得很好,很好的评论-谢谢!

Shuhao曹

Sakshi

大卫Legland

@Qais,
您应该同时安装geom2d和geom3d,通常是在同一个目录中。然后你必须添加目录到路径,使用'addpath'函数,或'File->Set path'菜单)。你需要至少添加目录'geom2d', 'geom3d', 'polygons2d', 'meshes3d',最终添加'多项式curves2d '。

每个存档都提供了一些演示,您可以直接运行它们,并对语法有一个想法。

我还将尝试在matGeom网页(收集geom2d和geom3d)上添加一些信息,在http://matgeom.sourceforge.net

希望这能有所帮助

凯伊斯AlKhazraji

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

大卫Legland

@Khaled和Qais,
我想到的是使用以下程序:
*计算直线与多边形平面的交点
*投影多边形顶点到平面上(即,计算它们的2D坐标)
*项目交点到平面上
*检查2D交点是否在2D多边形内。
下面的代码段应该完成这项工作(假设poly3d是n × 3,并且行是1 × 6):
plane = createPlane(poly3d(1:3,:));
inter = intersectLinePlane(线,平面);
poly2d = projPointOnPlane(poly3d, plane);
pInt2d = projPointOnPlane(inter, plane);
inside = xor(isPointInPolygon(pInt2d, poly2d), polygonArea(poly2d) < 0);
Inter = Inter(内部,:);

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

问候

凯伊斯AlKhazraji

亲爱的大卫:
我读了你对Khaled问题的评论。我不清楚你说的“最好是使用3D平面,最终在平面上投影所有点,然后使用2D多边形的函数。”我们应该在3D平面上投影的点,从我的理解线相交多边形在一个点。
先谢谢你

大卫Legland

嗨,哈立德,
要创建一个3D多边形,你只需要将它们的坐标连接到一个n × 3的数组中,例如poly=cat(1,p1,p2,p3);
三维直线与三维多边形的交点没有函数。最好的方法是使用3D平面,最终在平面上投影所有点,然后使用2D多边形的函数。

哈立德

亲爱的eng。大卫,

谢谢,这个强大的工具箱非常有用。

我试着用4到3个3D点创建一个3D多边形,但是失败了。所以我尝试创建一个平面,但当找到与3D线的交点时,答案将不准确,因为平面是多边形。

有没有可能的方法来创建一个三维多边形从四个或三个点?而且
有没有可能找到三维直线和三维多边形的交点?

谢谢你的努力。

布兰登

布雷迪

非常有用的工具箱。主要是直观的函数调用,以及完整的文档,使集成变得容易。

李金坤邓

很有帮助。

斯文

出色的空间操作包。广泛的工具箱,直观地处理输入。为了完整起见,我唯一的建议是,为更晦涩的函数编写一些调用函数的方法的文档。如。,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.

大卫Legland

圆柱体的格式如下:[xv yv zy R xc yc zc],其中:
[xv yv zv]圆柱的方向向量,
R是圆柱体的半径
[xc yc zc]圆柱的原点。
没有使用help中给出的L参数。
圆柱被认为是无限的,如果你需要有限的圆柱,请使用“linePosition3d”。
请注意,这种格式与函数“drawCylinder”不一致。因此,函数“intersectlinec圆柱体”可能会在未来的版本中更改。
戴斯。莱纳姆:

Paklah Abd Rahman

你好,

我尝试了“intersectlinec圆柱体”的定义是什么:xa, ya, za和L圆柱体??请任何人

大卫Legland

你好,
我上传了一个新版本,修复了报告的错误,并添加了一些演示。演示可以通过发布的m-文件获得,并且可以通过上面的文件演示来访问。它们演示了一些使用可能性。

大多数绘图函数都遵循“plot”语法。首先给出数据,然后是可选的参数名和值。如果没有实现,尝试使用"h=drawMyShape(…)",然后使用"set(h, 'color', 'k')"来设置选项。

对于错误报告和建议,最好是直接发送给我和电子邮件(可以在我的作者页面中找到,将“DOT”替换为“。”)。

戴斯。莱纳姆:

这个软件包旨在解决我经常遇到的可视化问题。然而,我一直无法我正在尝试使用这个包,但遇到了一些问题:

1.如何控制绘制对象的颜色?
2.我想画一个圆柱形的箭头表示,因为quiver3和drawPlane不能很好地工作,可能是由于缺乏对绘制顺序的控制。相反,我想画粗箭头,我使用的是drawcylinder。m。但是,在第89行中使用了不存在的函数local2Global.m。如果localToGlobal3d第29行被替换为"center = varargin{1};",它似乎可以被localToGlobal3d替换。

对于改正建议等,最好的程序是什么?

谢谢你,乔

内森他们

这个库和它的伙伴geom2d是闪闪发光的宝石——对于在2d和3d空间中对对象进行非平凡计算不可或缺。

顺便说一下,将所有文件保留在geom3d目录中,并将该目录添加到您的路径中。然后您可以键入“帮助geom3d”或“文件geom3d”,并在命令窗口或帮助窗口中获得正确链接的帮助文本。内容。m文件是提供文档的合适的“MATLAB方式”。

我们

太糟糕了,这个(显然)成熟的软件包没有附带一个适当的、现代的帮助/介绍/示例模块,称为已发布的m-file…

到目前为止,对于一个天真的用户来说,必须费力地浏览各个帮助文件的帮助部分(或密集编写的content .m)是有些乏味的——而且它(很可能)不会给予您的包足够的关注……

我们

MATLAB版本兼容性
使用R2019a创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

demos-geom3d

demos-meshes3d

geom3d

geom3d /私

meshes3d

meshes3d /私