12 views (last 30 days)

Show older comments

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.

darova
on 29 May 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

darova
on 27 May 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)

Trinh Nam
on 28 May 2021

darova
on 28 May 2021

- 1. Why the 3D surface is translated along the X axis after running the code ?

I don't understand the question. What translation?

- 2. Why we cannot calculate the "Red point" in the Top and Bottom edge of the 3D surface while it can find the "Red point" along Left edge and Right edge.

We can. Try griddedInterpolant instead. It has extrapolation property

- 3. Why we need to translate the X +15 unit and Z for -100 unit ? , According to the code

It's needed to place your data on the circle (to interpolate it in polar syste)

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!