How to place/ define points on a triangulated meshed surface?
10 次查看(过去 30 天)
显示 更早的评论
Hello all,
I need your help and ideas to solve the following problem.
I have a surface that is meshed with triangles. I know the positions of the nodes, as well as the normal vector of the node and the surfaces (as a unit vector).
For example, the surface looks like this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/704257/image.png)
However, the surface can also be round, have holes in it or have a completely free external shape. In extreme cases, the surface is even curved in space (e.g. like a spherical surface).
I would now like to place as many cylinders as I want on this surface, which always have the maximum distance from each other.
Does anyone know how this can be done?
Or how can I find and define points on this "surface"?
Many thanks and greetings
Tom
2 个评论
采纳的回答
darova
2021-8-14
Here is another approach, but works only if you don't have points inside:
- pick a point inside a contour (center)
- convert data into polar coordinates
- sort by angle
coord = load('coordVERTICIES.mat');
coordVERTICES = coord.coordVERTICES;
xco = coordVERTICES(:,1,:);
yco = coordVERTICES(:,2,:);
zco = coordVERTICES(:,3,:);
[x,y,z] = deal(xco(:),yco(:),zco(:));
[t,r] = cart2pol(x-mean(x),y-mean(y)); % convert to polar system
[~,k] = sort(t); % sort angle
x1 = x(k);
y1 = y(k);
dl = hypot(diff(x1),diff(y1)); % find distance between points
k1 = find(dl > 0.01); % remove zero distances (duplicate points)
gd = [2;numel(k1);x1(k1);y1(k1)]; % geom descr
dl = decsg(gd); % decomposition
[p,e,t] = initmesh(dl); % build a new mesh
plot(x,y,'.g') % plot all points
hold on
plot(x(k),y(k)) % plot boundary curve
pdemesh(p,e,t) % plot mesh
plot(mean(x),mean(y),'ob','markersize',15,'linewidth',3) % center of a figure
hold off
axis equal tight
更多回答(2 个)
darova
2021-8-9
How about simple griddata with using initmesh
t = 0:.2:5;
x = [t; t]; % some data
y = [t*0; t*0+3]; % some data
z = [sin(t); sin(1.2*t)]; % some data
k = boundary(x(:),y(:)); % simply find only boundary
x1 = x(k(2:end)); % boundary should be unclosed curve
y1 = y(k(2:end)); % boundary should be unclosed curve
gd = [2;numel(x1);x1(:);y1(:)]; % geometry description
dl = decsg(gd); % decomposition
[p,e,t] = initmesh(dl,'Hmax',0.1);% build a mesh (control mesh size)
z2 = griddata(x(:),y(:),z(:),p(1,:),p(2,:)); % find Z coordinate for each point
pp.vertices = [p' z2(:)]; % create struct for patch
pp.faces = t(1:3,:)'; % create struct for patch
pp.facecolor= 'r'; % create struct for patch
h1 = plot3(x,y,z,'.-g');
h2 = patch(pp);
legend([h1(1) h2],'original data','gridata/initmesh')
light
axis equal
view(45,45)
Work with cartesian/spherical system of coordinates to manipulate elements of a spherical objects
7 个评论
darova
2021-8-12
I can't build a mesh with your data. Can you show how?
s1 = load('points.mat')
% p = s1.point_and_normal2;
s2 = load('coordVERTICIES.mat')
t = s2.coordVERTICES;
plot(squeeze(t(:,1,:))',squeeze(t(:,2,:))','k')
darova
2021-8-12
编辑:darova
2021-8-12
Here is another example with using feeBoundary. It find free edges. The problem with separating outer and inner edges remains.
% generating the data
t = linspace(0,2*pi,50);
[x1,y1] = pol2cart(t,1); % inner curvw
x2 = 2*x1 + 0.2*cos(5*t); % outer curve
y2 = 2*y1 + 0.2*sin(5*t);; % outer curve
x = zeros(numel(x1),10); % preallocation
y = x;
for i = 1:numel(x1)
x(i,:) = linspace(x1(i),x2(i),10); % create nodes between curves
y(i,:) = linspace(y1(i),y2(i),10);
end
h = surf(x,y,x*0); % create surface object
p = surf2patch(h,'triangles'); % conver surface object to patch
TR = triangulation(p.faces,p.vertices); % trinagulation
v = p.vertices;
E = freeBoundary(TR); % find boundary edges
p.vertices(:,1) = p.vertices(:,1) + 5; % move patch object
patch(p,'facecolor','r') % display triangles
line(v(E,1)+5,v(E,2),'color','g','linewidth',2) % ree boundary
view(0,90)
axis equal
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Surface and Mesh Plots 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!