How can a curved surface be generated with a thickness and density?
3 views (last 30 days)
Show older comments
I've got a weird problem here. I'm trying to generate a weird feature in 3d, a cell membrane EM density. Is there some way to generate a psuedorandom surface feature with a consistent thickness and intensity profile? Especially one that can fold back on itself or totally encapsulate a volume?
While i need it to be an array eventually, it seems like generating it as a higher-resolution point density first might be easier to generate in multiple ways with different standards (thickness, and density across depth, etc).
Any strategies to do this sort of thing or existing tools I couldn't find that do something similar?
Answers (2)
John D'Errico
on 20 Apr 2022
Sorry, but this is the kind of thing that is virtually impossible to do in any intelligent way. You are asking for some strange behaviours, but you have also been to vague to pin down what you want. And I think that means you don't really have any kind of mathematical definition of what you are looking for. Without an adequate definition, you are just asking for something unspecified. And that is not something you can pin down.
For example, suppose I asked you to generate a random number, but I won't tell you the required properties of that random number. It turns out this is a mathematically meaningless request. The same thing applies to your request. You want some sort of random surface, that may wrap around in any sort of way, and it "may" be a closed surface, but possibly not? Or it may cross itself in some way? Is a Klein bottle valid?
I assume that a surface that you do generate would be in the form of a triangulation. So you might use tools like an alpha shape, or perhaps an iso-surface, both based on random data to generate a surface. But then to have a surface with some thickness, it is no longer a surface, but a volume. And such a volume becomes yet more complicated to deal with.
As I said, one simple thing you can do is an alpha shape. On completely random data, it might look like this:
xyz = randn(10000,3);
S = alphaShape(xyz);
plot(S)
axis equal
The data was scattered following a 3-dimensional normal distribution, but because of the granularity of the data, the alpha shape will carve somewhat arbitrary divots into the surface. But I seriouly doubt this is what you are looking for. It sounds like you want some sort of smooth surface, yet one that is random in some undefined way.
You might do something where you start with essentially a Fourier series, with random coefficients. In spherical coordinates, represent the surface in terms of trigonometric perturbations to the surface of a sphere, or ellipsoid.
[theta,phi] = meshgrid(linspace(-pi,pi,500),linspace(-pi,pi,500));
a = rand(1);
b = rand(1);
c = rand(1);
r = 1 + a(1)*sin(theta + b(1)).*sin(phi + c(1));
x = r.*sin(phi).*cos(theta);
y = r.*sin(phi).*sin(theta);
z = r.*cos(phi);
surf(x,y,z)
shading interp
axis equal
There are infinitely many things you could do. But at the same time, it is inmpossible to know what you really want to do.
2 Comments
John D'Errico
on 20 Apr 2022
These questions always seem to morph into something completely different.
Bruno Luong
on 20 Apr 2022
Edited: Bruno Luong
on 21 Apr 2022
To generate random close surface, one might use spherical harmonics basis to deform a sphere. There is many library on FEX, I choose here a one posted by David Goodmanson for its simplicity:
theta=linspace(0,pi,31);
phi=linspace(0,pi*2,61);
[TT,PHI]=ndgrid(theta,phi);
r = 1;
for n=0:10
sigma = (0.1/(n+1)^(1/2));
for m=-n:n
dmn = harmonicY(n,m,theta,phi);
r = r + sigma*randn()*dmn;
end
end
r = real(r);
Z = r.*cos(TT);
X = r.*sin(TT).*cos(PHI);
Y = r.*sin(TT).*sin(PHI);
figure
surf(X,Y,Z);
axis equal
shading interp
% Code posted by David Goodmanson
% https://fr.mathworks.com/matlabcentral/answers/384348-how-to-find-the-value-of-spherical-harmonic-ylm
function Ylm = harmonicY(n,m,theta,phi)
% spherical harmonics, Condon-Shortley sign convention
% for 0 <= theta <= pi only
% phi and theta are in radians
% if theta and phi are both vectors, result is a matrix with
% theta changing down the columns, phi changing along the rows
%
% Ylm = Ylm(l,m,theta,phi)
%
% caution, no checking on validity of input variables
theta = theta(:);
phi = phi(:)';
Pn = legendre(n,cos(theta),'norm');
% sign change required for odd positive m
if m >= 0
Pn = (-1)^m*Pn(abs(m)+1,:);
else
Pn = Pn(abs(m)+1,:);
end
Ylm = (1/sqrt(2*pi))*Pn'*exp(i*m*phi);
% output of legendre(n,x) is the vector P(n,m,x) for 0<=m<=n.
% P(n,-m,x) = (-)^m P(n,m,x) by convention.
% Sign changes based on Matlab behavior that legendre(n,x) contains
% the Condon-Shortley factor (-)^m, but legendre(n,x,'norm') does not.
end
For the thickness, you can generate an inner surface by computing the rinner as
rinner = r - thickness(TT,PHI) / sqrt(1 + gradient(r)'*inv(FF)*gradient(r))
,
where FF is the first fundamental form.
If you want to draw sample of point cloud on the surface; you need to to specify us how you would specify the density on this surface, it can be done without issue using a mesh of the surface.
0 Comments
See Also
Categories
Find more on Surface and Mesh Plots in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!