如何在三角网格表面上放置/定义点?

2次查看(最近30天)
汤姆恩格斯
汤姆恩格斯 2021年8月6日
评论道: 汤姆恩格斯2021年8月16日
你好所有的,
我需要你的帮助和想法来解决下面的问题。
我有一个由三角形组成的曲面。我知道节点的位置,以及节点和曲面的法向量(作为单位向量)。
例如,表面看起来是这样的:
然而,表面也可以是圆形的,其中有孔或具有完全自由的外部形状。在极端情况下,表面甚至在空间中弯曲(例如,像球面)。
我现在想要在这个曲面上放置任意多的圆柱体,它们之间的距离总是最大的。
有人知道这是怎么做到的吗?
或者我如何在这个“表面”上找到并定义点?
非常感谢和问候
汤姆
2的评论
汤姆恩格斯
汤姆恩格斯 2021年8月9日
下面的例子代表了一个极端的例子:
对于一个圆柱体,我确定其表面的质心,并使用局部曲率来检查是否可以将其放置在那里。

登录评论。

接受的答案

darova
darova 2021年8月14日
这里有另一种方法,但只有在你没有观点的情况下才有效:
  • 选取等高线内的一个点(中心)
  • 将数据转换为极坐标
  • 按角度排序
coord =负载(“coordVERTICIES.mat”);
coordVERTICES = coord.coordVERTICES;
XCO = Coordvertices(:1,:);
公司yco = coordVERTICES (: 2:);
zco = coordVERTICES (: 3:);
[x, y, z] =交易(xco(:),公司yco (:), zco (:));
(t, r) = cart2pol (x-mean (x) y-mean (y));%转换为极性系统
(~ k) = (t)进行排序;%这种角
x1 = x (k);
日元= y (k);
DL =惊奇(Diff(X1),Diff(Y1));求点之间的距离
K1 = find(dl > 0.01);%删除零距离(重复点)
gd = [2; numel(k1); x1(k1); y1(k1)];%几何学备注说明
dl = decsg (gd);%分解
[p, e t] = initmesh (dl);建立一个新的网格
情节(x, y,'。G'%绘制所有点
持有
情节(x (k), y (k))绘制边界曲线
pdemesh (p, e, t)%画网格
情节(意味着(x),意味着(y),“ob”“markersize”15岁的'行宽'3)一个数字的中心
持有
平等的紧
1评论
汤姆恩格斯
汤姆恩格斯 2021年8月16日
你好darova,
非常感谢您的支持。金宝app有了这个想法,我可以毫无干扰地服务于所有平面。
问候
汤姆

登录评论。

更多的答案(2)

darova
darova 2021年8月9日
如何简单的 griddata 使用 initmesh
t = 0: .2:5;
x = [t;t];%一些数据
y = [t * 0;t * 0 + 3];%一些数据
z =[罪(t);罪(1.2 * t)];%一些数据
k =边界(x (:), y (:));简单地找到唯一的边界
x1 = x (k(2:结束);%边界应为未闭合曲线
日元= y (k(2:结束);%边界应为未闭合曲线
gd =[2;元素个数(x1); x1(:);日元(:));%的几何描述
dl = decsg (gd);%分解
[p, e t] = initmesh (dl,“Hmax”, 0.1);%构建一个网格(控制网格大小)
z2 = griddata (x (:), y(,)、z (:), p(1:)、p (2:));找到每个点的Z坐标
p.vertices = [p' z2(:)];为补丁创建结构体
pp.faces = t(1:3:)”;为补丁创建结构体
pp.facecolor =“r”为补丁创建结构体
h1 = plot3 (x, y, z,“g”);
h2 =补丁(pp);
传奇(h1 h2 (1),“原始数据”“gridata / initmesh”
平等的
查看(45,45)
使用笛卡儿/球坐标系来操作球物体的元素
7评论
darova
darova 2021年8月12日
这是另一个使用的例子 feeBoundary .它找到了自由边。分离外边和内边的问题仍然存在。
生成数据的%
t = linspace(0, 2 *π,50);
(x1, y1) = pol2cart (t, 1);%内曲线
x2 = 2 * x1 + 0.2 * cos(5 * t);%外曲线
Y2 = 2 * Y1 + 0.2 * SIN(5 * T);%外曲线
x = 0(元素个数(x1)、10);%预先配置
y = x;
i = 1:元素个数(x1)
x(我:)= linspace (x1(我),x2 (i), 10);%在曲线之间创建节点
y(我:)= linspace (y1 (i), y2(我),10);
结束
h =冲浪(x, y, x * 0);%创建曲面对象
p = surf2patch (h,“三角形”);%转换表面对象到补丁
tr =三角测量(p.faces,p.verces);% trinagulation
v = p.vertices;
e = freeboundary(tr);查找边界边
P.vertices (:,1) = P.vertices (:,1) + 5;%移动补丁对象
补丁(p,“facecolor”“r”%显示三角形
线(v (E, 1) + 5 v (E, 2),“颜色”‘g’'行宽', 2)% ree边界
查看(0,90)
平等的

登录评论。


汤姆恩格斯
汤姆恩格斯 2021年8月13日
你好davora。谢谢你的回答和帮助。我目前从.stl文件中的数据创建网络如下:
coord =负载(“coordVERTICIES.mat”
coordVERTICES = coord.coordVERTICES;
xco = squeeze(coordVERTICES(:,1,:))';
yco = squeeze(coordVERTICES(:,2,:)))';
zco = squeeze(coordVERTICES(:,3,:)))';
补丁(xco公司yco zco,“k”“EdgeColor”“k”“FaceColor”“# a8afb3”);
平等的紧
不幸的是,如果我正确地理解了自由边界命令,它仅限于二维表面的网格划分。因此,很不幸,考虑曲率是不可能的。
你知道我如何用另一种方法有效地在表面上创建点吗?
汤姆问候

下载188bet金宝搏


释放

R2020b

社区寻宝

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

开始狩猎!