Divide the 3D surface into equal patches
9 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Trinh Nam
el 26 de Mayo de 2021
Movida: John D'Errico
el 29 de Jun. de 2023
Hi, I am looking for a method or algorithm to divide a 3D surface into equal patches. The detail is explained below
Background:
the initial plate has grids as in picture (1). initial position of A1 (a1,b1,c1) …. A121 (a121, b121, c121). All of this position is known. A1 is the origin A1(0,0,0)
After deformation, the plate becomes 3D curve and grids has new position A’1(u1,v1,w1) …A’100(u100, v100,w100).
Currently, I used 3D scanner to get the point cloud data of deformed plate and successfully get the equation of 3D surface.
My question is: How to divide the 3D surface into 100 patches with equal area to find the grid A’2 …A’100 position. (A’1 is the origin A1(0,0,0) and coincide with A1) I already tried matlab built-in function and other software but the result gives me the mesh with different in area. (example: area of S1 ≠ S2 ≠ S100)
Attachment is the point cloud data after processed
Thanks for your support.
0 comentarios
Respuesta aceptada
darova
el 29 de Mayo de 2021
Try arc length interpolation. Original link: LINK
function main
clc,clear
% generate some data
[x,y] = meshgrid(-1:0.4:1);
z = x.^2+y.^2;
surf(x,y,z,'facecolor','none')
% interpolation
[x1,y1,z1] = myinterp1(x,y,z);
[x2,y2,z2] = myinterp1(x1',y1',z1');
hold on
plot3(x2,y2,z2,'.r')
hold off
axis equal
function [x1,y1,z1] = myinterp1(x,y,z)
x1 = x*0;
y1 = y*0;
z1 = z*0;
for i = 1:size(x,1)
dx = diff(x(i,:)).^2;
dy = diff(y(i,:)).^2;
dz = diff(z(i,:)).^2;
t = [0 cumsum(sqrt(dx+dy+dz))]; % parameter
t1 = linspace(0,t(end),size(x,2)); % new parameter
x1(i,:) = interp1(t,x(i,:),t1);
y1(i,:) = interp1(t,y(i,:),t1);
z1(i,:) = interp1(t,z(i,:),t1);
end
end
end
4 comentarios
Akhila
el 29 de Jun. de 2023
Movida: John D'Errico
el 29 de Jun. de 2023
Hi Trinh
Did you get the solution to your problem?
I also need this from my work, if you have the solution could you share it with me?
Más respuestas (2)
darova
el 27 de Mayo de 2021
Try to interpolate in polar system. Find center of a circle
clc,clear
data = load('curve.txt');
x = data(:,1);
y = data(:,2);
z = data(:,3);
t = linspace(0,2*pi,20);
[x1,y1] = pol2cart(t,100);
plot3(x+15,y,z-100)
%line(x1,y1)
[t,r] = cart2pol(x+15,z-100);
t0 = linspace(max(t(:)),min(t(:)),10);
y0 = linspace(min(y(:)),max(y(:)),10);
[T,Y] = meshgrid(t0,y0);
R = griddata(t,y,r,T,Y);
[X,Z] = pol2cart(T,R);
hold on
plot3(X,Y,Z,'.r')
hold off
view(45,45)
0 comentarios
Ver también
Categorías
Más información sobre Polygons en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!