What we need to be doing is ignore subtraction of slopes of A.stl, which are too steep...
4 views (last 30 days)
Show older comments
we are subtracting (3D Subtraction) A.stl from B.stl. What we need to be doing is ignore subtraction of slopes of A.stl, which are too steep. PS: we can detect which points have greater than entered slope in A.stl
1 Comment
DGM
on 5 Apr 2025
Edited: DGM
on 5 Apr 2025
It's not clear what A and B are, how they relate geometrically, or what "subtraction" means in this context -- specifically what subtraction can mean if it's a slope-dependent process. It's also unclear how slope is being measured.
I suspect that A and B may be something like simple height maps, in which case I suspect that "ignore subtraction" is probably supposed to actually mean "clamp the minimum result". Otherwise, you're asking for a bunch of step discontinuities.
Answers (1)
DGM
on 5 Apr 2025
If I'm gonna guess, I might as well invest in it.
unzip saddles.zip
% these two files have directly correlated vertex lists
% this is not typical, so don't expect to meaningfully subtract random
% objects like this.
B = stlread('saddletop.stl');
A = stlread('saddletop90.stl');
isequal(A.Points(:,1:2),B.Points(:,1:2)) % x,y locations match
subplot(1,2,1); trisurf(B)
subplot(1,2,2); trisurf(A)
You could ignore cases where some angle criteria is exceeded.
% get some sort of "angle"
fn = vertexNormal(A);
th = acosd(fn(:,3)./vecnorm(fn,2,2)); % elevation angle
ignorethese = th > 45;
V = B.Points;
V(:,3) = V(:,3) - A.Points(:,3);
V(ignorethese,3) = B.Points(ignorethese,3);
T = triangulation(B.ConnectivityList,V);
% display it using patch()
figure
patch('faces',T.ConnectivityList,'vertices',T.Points, ...
'facecolor','w','edgecolor','k');
view(3); camlight; view(10,33)
axis equal; grid on
xlabel('X'); ylabel('Y'); zlabel('Z')
... or you could do something else.
% just do some sort of constrained difference
V = B.Points;
V(:,3) = max(V(:,3) - A.Points(:,3),-0.5); % clamp at some level
T = triangulation(B.ConnectivityList,V);
% display it using patch()
figure
patch('faces',T.ConnectivityList,'vertices',T.Points, ...
'facecolor','w','edgecolor','k');
view(3); camlight; view(10,33)
axis equal; grid on
xlabel('X'); ylabel('Y'); zlabel('Z')
... or something entirely different.
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

