图片缩略图

geom3d

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

156下载

更新9月26日

查看版本历史

查看许可协议

编者按:该文件被选为MATLAB中央本周精选

geom3d库的目的是处理和可视化三维几何原语,如点,线,平面,多面体…它提供了操作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网格(表面补丁),以及它的轮廓(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 0 1 0];%全球基
Plane2 = [2 3 4 0 1 0 1 0 1];另一种基
transo = createBasisTransform3d(plane1, plane2);
plane2T = transformPlane3d(plane2, transform) %结果标识

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

Ana Guerra Langan

莫特Aslanturk

你好大卫,

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

了=
0 0 0 0 1 -1 0 0

我期望有out = target。如果你能解释一下我错过了什么,我会非常感激。谢谢你的宝贵时间。
最好的

大卫Legland

你好,张约翰,

为了从顶点创建网格的“面”元素,有不同的方法,但这需要添加关于哪些顶点是相邻顶点的假设。在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: 3D实体网格不受geom3d库管理。我尝试了顶点+边+面+固体结构,但没有得到足够稳定的结果。

大胡

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

效果很好,大卫,谢谢你。

大卫Legland

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

约旦格雷厄姆

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

晶晶孟

大卫Legland

嗨,约旦,

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

约旦格雷厄姆

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

Florian Reinbold

大卫Legland

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

Sadeep Thilakarathna

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

大卫Legland

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

克里斯托弗Riehs

neuromechanist

@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

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”改为“dist”。
2-在113行将“dist”改为“minDist”

谢谢,圣诞快乐。

塞吉奥ABP

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

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

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

漂亮的图书馆!

大卫Legland

@Tao Zhang:谢谢你的修复!我已经将它们包含到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)替换,以便工具箱是自包含的。
"polygonCentroid3d" line33: elseif nargin == 2应该是elseif nargin == 3

大卫Legland

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

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

Chintan甘地

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

Laszlo Kormoczi

你好大卫,

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

大卫Legland

当然!创建这个函数是为了管理面有很多顶点的多边形网格。你可以尝试以下方法:
[V, E, F] = createDodecahedron;
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: cell函数是Matlab很多年的一部分,所以我真的不明白这个问题是从哪里来的…它的目的是分配一个给定大小的数组(这里是1 × nfaces),包含各种类型或维度的数据。另外,您所说的“生成代码”是什么意思?

RESMI约翰逊

你好大卫,
我在我的一个模拟中使用函数'intersectPlaneMesh(plane, v, f)'。当我试图为这个生成代码时,它给了我一个错误,因为" cell "函数。你能建议一个替代的解决方案,使它的代码可生成。
先谢了。

pcidreir

Nawar Alwesh

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

大卫Legland

嗨Nawar,
对不起,orientedBox3d函数中有一个bug…作为一种快速修复方法,您可以用以下代码替换第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

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

克劳迪奥·卡拉拉

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

(Sunita萨哈

(Sunita萨哈

@David谢谢你的建议,你的代码真的很有帮助。
@David 'clipConvexPolygon3dHP'函数是否可以在立方体内部裁剪三角形曲面的区域?它是否给出了三角曲面与立方体的交点,即立方体内部的交点?

大卫Legland

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

帕特里克·谢

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

帕特里克·谢

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

大卫Legland

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

(Sunita萨哈

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

(Sunita萨哈

使用intersectplansphere错误(第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

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

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

谢谢你!

Abdelrhman Hany

汉娜

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

大卫Legland

@sarvenaz: 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个平面,每个端点一个)。然后可以测试交点与圆柱主轴之间的距离是否小于圆柱半径。我将尝试在下一个版本中添加这种行为。

汉娜

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

帕特里克博览

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

Miten帕特尔

你好大卫,

我试图理解如何使用geom3d库翻译一系列共面点到一个由不同的共面点系列定义的平面上。

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

为了测试我的理解能力,我建立了一个矩阵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('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方法。似乎你在以后的版本中添加了阈值变量,但是我认为它并没有像它应该的那样工作。在调查这个阈值是如何使用的之后,我发现它有两个用途。第一个是检验两个法向量的外积的值。当候选节点在isCoplanar方法中测试共面性时,第二个方法稍后在mergeCoplanarFaces中使用。这样做的问题是,虽然第一个阈值只对0到1之间的值有意义,但第二个阈值可以是大于0的任何值,并且对于不同比例的几何图形的表现不同。

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

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

大卫Legland

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

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

问候,
大卫

莱昂纳多Colavitti

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

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

ThT基金会

你好大卫,

谢谢图书馆和你的努力。我有一个关于我面临的问题的问题。我正在加载一个CAD模型在matlab从。stl文件。这给出了两个带有模型顶点和面的矩阵,它们已经是三角形了。然而,现有的三角剖分有点奇怪,因此我试图以更好的方式重新格式化它。因此,我使用“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域在球面上的球角,则有另一项贡献(估计三维图像中的表面积)。我认为你可以从源代码中获取一些代码:
https://github.com/dlegland/matImage/blob/master/matImage/imMinkowski/private/sphericalVoronoiDomainArea.m

的问候!

亚历克的一天

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

谢谢!

亚历克。

大卫Legland

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

大卫Legland

@Chirag,
我不知道你的问题究竟从何而来。你能识别出引起麻烦的网格的一些特性吗?你能发邮件给我一个有问题的网眼吗?
调查的一些方法:
*可能在计算之前使用trimMesh函数可能会有帮助。
在计算平滑之前先应用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(varargout)
填充一个由点列表指定的3D多边形

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

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

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

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

%参见:
% polygons3d, drawPolygon, drawPolyline3d

%——
作者:大卫·莱格兰
% e-mail: david.legland@nantes.inra.fr
%已创建:2007-01-05
版权所有2007 INRA - BIA PV Nantes - MIAJ Jouy-en-Josas。


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

%提取曲线坐标
如果size(var, 1)== 1% <=======检查var是否为1 × 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包中使用“质心”函数。
对于计算边界框的表面积,我建议将每个面的面积相加。每个面的面积可以通过相应的边长乘以得到。

问候

tariq bdair

你好大卫,

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

谢谢你!

大卫Legland

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

问候,

沙基尔·汗医生

你好大卫,

伟大的提交。我一直在研究“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
由Microsoft Kinect Fusion创建的评论文件
元素顶点2959173
属性float 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 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

沙基尔·汗医生

但是我需要处理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
由Microsoft Kinect Fusion创建的评论文件
元素顶点2959173
属性float 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 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多边形转换成一组三角形面,我想你可以使用“曲面兴趣”来计算交点。

问候,

亚历克斯谨言

你好大卫,

谢谢你的解释和修改代码。
我还有一个问题。是否有可能以某种方式剪辑一个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

你好大卫,

谢谢你的回答。
我有另一个问题要麻烦你。
文本人编译多面体质心。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。如果value在0到1之间,则点位于P0和P0+V组成的线段上。

希望这能有所帮助,
大卫

戴尔炸

你好大卫,

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

我不知道intersectLinePolygon3d和intersectRayPolygon3d之间的功能区别是什么。

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

我误解了什么?

谢谢。

戴尔

Krisztian Szucher

穆纳马吉德

你好大卫,

真正伟大的工具,非常好!它帮我解决了很多问题。谢谢你和我们分享。
请,我问你我可以裁剪或分割的类型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,大卫:

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

最美好的祝福!

马特奥

你好大卫,

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

大卫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

这个命令
[inters pos inds] = intersectLineMesh3d(LINE,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.000
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.000
0.1259 0.8741 1.000];

顶点= 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,如果PRECISION被设置为> 1e-5, mergePlanarFaces只合并面。这让我吃惊,因为这个特殊的多面体不是由我修改的,而是直接来自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行)
聚醚geindex =[聚醚geindex];% #好< AGROW >

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

然而,当N=15时,不存在执行问题

代码:

%创建一个平面
plane = createPlane([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);
抓住;

相交多边形
polyys = 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

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

i = 1:长度(脸)
Face = faces{i};
%计算第一个边的向量
V1 =节点(face(2),1:3) -节点(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);
结束
normalizeVector3d(normals);%修正GTG 2014
结束

---------------
最好在最后进行规范化,否则由于交叉计算中的四进等错误,最终的法线没有规范化,这也有消除2个normalizeVector3d调用的好处,使facnormmal稍微快一点。

samart

哈立德•凯利

经过一些小的调整后,我发现这是一个非常有帮助的任务。尽管它很大,但所有部分似乎都无缝地配合在一起。谢谢大卫。

Shaoshuai

很有帮助!感谢楼主分享!

jr !Menzinger

非常有用的。

大卫Legland

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

faceCenter =均值(顶点(faceVertices,:), 1);

这应该也能工作。

问候,
大卫

塞德里克

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

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

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

大卫Legland

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

大卫Legland

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

尹勇敏

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

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

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

尹勇敏

@David
你的代码完全是我想要的。我会试着修正你的代码。你能解释一下你的职能有什么问题吗?

大卫Legland

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

尹勇敏

@大卫·莱格兰

嗨,首先,我非常感谢你的密码。我对你的"intersectPlaneMesh函数"有一些问题。

我试图得到一些脊椎的横截面信息。您的代码将被用来弥补这一点。

当我使用该编码与椎骨网格数据,2个轮廓预期显示横截面。然而,图中只显示了一个轮廓。

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

如果是对的,你能解释一下如何按平面设置多条等高线吗?

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

你的intersectPlaneMesh函数中的intersectionsPoints似乎准确地显示了网格数据上的相交点。

埃文

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

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

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

斯文

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

斯文

@Evan,
我正在研究这方面的东西。会随时通知你。

大卫Legland

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

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

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

希望这能有所帮助?

埃文

你好,大卫,我有一个关于计算法线的问题。在函数facnormal中,您提到没有定义方向。但是在vertexNormals中,fac诺曼用于计算顶点的法线。这会不会导致一些问题,或者我错过了什么?

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

尹勇敏

嗨,首先,我非常感谢你的密码。我对你的"intersectPlaneMesh函数"有一些问题。

我试图得到一些脊椎的横截面信息。那是用你的代码做的。

当我使用该编码与椎骨网格数据,2个轮廓预期显示横截面。然而,只有一个轮廓显示的数字。

我认为你的返回(多边形)是用来表示多个等高线来表示被平面相交的区域。

我的想法对吗?如果是对的,你能解释一下如何按平面设置多条等高线吗?

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

你的intersectPlaneMesh函数中的intersectionsPoints似乎准确地显示了网格数据上的相交点。

大卫Legland

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

便雅悯

亲爱的大卫,

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

我一直在尝试使用气缸网格功能,但很少成功。我甚至尝试了“画一个旋转的圆柱体”的例子,但我得到的是
索引超过矩阵维数。

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

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

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

便雅悯

大卫Legland

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

问候,
大卫

哈立德•凯利

我很尊重你的宝贵意见。我确实有一些小小的批评。我下载了geom3d来“快速”检查我的代码来确定球角,就像函数“sphericalAngle”承诺的那样。我只是完全按照它的帮助中所示调用了sphericalAngle。最后,我浪费了两个小时的宝贵时间来解决各种各样的问题。[1]调用名称已更改的函数。对不起,但我只是停止跟踪(一些已经在这些评论中提到)和[2]createPlane,被调用从球的角度显然与错误的维度。[3] intersectLinePlane抱怨第71行上矩阵尺寸不匹配。老实说,我认为毅力是我的强项之一,但我在这一点上放弃了,因为我不知道如果我继续使用geom3d,这个非常简单的操作会/应该花费我多少时间。抱歉,但是流畅的程序流程真的很重要,特别是在像这样的大量代码提交中。

大卫Legland

嗨Orestis,

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

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

问候,
大卫

Orestis

亲爱的大卫

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

目的是计算每个片中由stl文件限定的区域。

致以最良好的问候

大卫Legland

亲爱的俄罗斯,

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

问候,
大卫

Dmitri Kamenetsky

很棒的包!一些小bug:

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

Dmitri Kamenetsky

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

panagiotis

@Sven
我很抱歉,但是我不知道平面创造的这种观点。我的背景书目不包括这些信息。谢谢你通知我。

斯文

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

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

-起点
- x方向向量
- y方向向量

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

PLANE = 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 1 1],这不是“规范化的”(即,它的大小大于1)。这不会影响projPointOnPlane,但它可以影响其他函数,如planePosition,如果你打算使用它们。

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

panagiotis

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

斯文

@panagiotis:

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

Plane =[0 1 0 0 1 1 0 0];

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

panagiotis

@Sven(为这个图书馆做了强有力的辩护!)

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

斯文

@panagiotis:

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

ans =

100 100 0

...我觉得挺好的。请提供可重复错误。

panagiotis

我发现的主要问题是在投影pointonplane在geom3d库。我们试着在一个平面上投射一个点,这个点已经属于这个平面。得到的结果是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勒

亲爱的大卫,

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

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

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

我想用一个平面来夹住这个凸包。这就引出了你的函数。

+有两种方法来使用你的工具箱:

1/使用clipConvexPolyhedronHP函数。它对我的问题有效!
然而,如果我们想要有凸包的一面(低于或高于平面)来剪辑,我们必须有一个正确的平面输入!!

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

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

createPlane =[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的一个简单命令来控制我想剪辑的多面体的一边!

所以我反馈你这个修正函数多面体切片!

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

问候,
不结盟运动

尤里

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

我有一个关于球角函数的问题。我定义了以下平面:
>> 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线的定义。在工具箱中,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];
[internal 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 70000 0 .单击“确定”
5.7000 7.0000 2.7000
0 7.0000 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);
area = 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和可能我的问题是dump问题的大内行。我非常感激。

大卫Legland

@Khaled和Qais,
我想到的是使用以下程序:
*计算直线与多边形平面的交点
*在平面上投影多边形顶点(即计算它们的2D坐标)
*在平面上投影交点
*检查2D交点是否在2D多边形内。
下面的代码应该可以完成这项工作(假设poly3d是n × 3,而line是1 × 6):
平面= 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。大卫,

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

我试着从四个或三个3D点创建一个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是圆柱体的半径
这个圆柱体的起源。
在help中给出的L参数没有被使用。
圆柱体被认为是无限的,如果你需要有限的圆柱体,请使用"linePosition3d"。
请注意,这种格式与函数"drawCylinder"不一致。因此,函数" intersectlineccylinder "很可能在未来的版本中更改。
戴斯。莱纳姆:

Paklah Abd Rahman

你好,

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

大卫Legland

你好,
我上传了一个新版本,修复了报告的bug,并添加了一些演示。演示以已发布的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目录中,并将该目录添加到您的路径中。然后,您可以输入“help geom3d”或“doc geom3d”,并在命令窗口或帮助窗口中获得正确链接的帮助文本。内容。m文件是合适的“MATLAB方式”提供文档。

我们

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

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

我们

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

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!

demos-geom3d

demos-meshes3d

geom3d

geom3d /私

meshes3d

meshes3d /私