# Understanding implicit surface plot behavior

4 Ansichten (letzte 30 Tage)
Matt J am 11 Mär. 2021
Verschoben: Matt J am 15 Mai 2024
Here is some code that plots an implicit infinite, tilted cylinder.
Q=diag([0,1,1]./3^2);
axis([-5 5 -5 5 -5 5])
view([-2,11])
xlabel X, ylabel Y, zlabel Z
T=makehgtform('axisrotate',[0 1 0],pi/4);
h1.Parent=hgtransform('Matrix',T);
My first question is, why doesn't the cylinder, which is infinite, extend to the axis limits?
My second question is, below is the same code again, except at the very end, we double the extent of the axes. Why does the cylinder become invisible when this is done?
figure;
axis([-5 5 -5 5 -5 5])
view([-2,11])
xlabel X, ylabel Y, zlabel Z
T=makehgtform('axisrotate',[0 1 0],pi/4);
h2.Parent=hgtransform('Matrix',T);
axis([-5 5 -5 5 -5 5]*2) %<----makes the cylinder disappear!
xyz=[x(:).'; y(:).'; z(:).'];
d=reshape( (sum((Q*xyz).*xyz)-1), size(x));
end
##### 0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

Matt J am 15 Mai 2024
Verschoben: Matt J am 15 Mai 2024
Re-running the code in the latest release, R2024a, it appears the problem has been fixed.
Q=diag([0,1,1]./3^2);
axis([-5 5 -5 5 -5 5])
view([-2,11])
xlabel X, ylabel Y, zlabel Z
T=makehgtform('axisrotate',[0 1 0],pi/4);
h1.Parent=hgtransform('Matrix',T);
figure;
axis([-5 5 -5 5 -5 5])
view([-2,11])
xlabel X, ylabel Y, zlabel Z
T=makehgtform('axisrotate',[0 1 0],pi/4);
h2.Parent=hgtransform('Matrix',T);
axis([-5 5 -5 5 -5 5]*2) %<----makes the cylinder disappear!
xyz=[x(:).'; y(:).'; z(:).'];
d=reshape( (sum((Q*xyz).*xyz)-1), size(x));
end
##### 0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

### Weitere Antworten (1)

Nipun am 14 Mai 2024
Hi Matt,
Your observations touch on how MATLAB handles the rendering of implicit functions and the effects of axis scaling on graphical objects, particularly those transformed with hierarchical transformations like hgtransform.
The two sections below highlight the questions asked:
1. Finite Rendering of Infinite Shapes
The cylinder doesn't extend to the axis limits because fimplicit3 renders shapes within a finite bounding box based on the current axis limits for visualization, despite the theoretical shape being infinite.
2. Cylinder Becomes Invisible After Doubling Axis Limits
The cylinder becomes invisible because fimplicit3 generates a mesh based on the axis limits at the time of plotting. Expanding the axis limits afterwards doesn't recalculate this mesh. The transformation applied (hgtransform) affects the object's position and orientation but doesn't adjust the mesh to fit the new axis limits, causing the object to potentially fall outside the visible rendering area.
Below, I recommend a potential solution to address the issue.
Solution: To ensure visibility after changing axis limits, re-plot the cylinder with the new axis limits set beforehand. This approach makes MATLAB generate the mesh according to the updated viewport, ensuring the object remains visible.
Hope this helps.
Regards,
Nipun
##### 1 Kommentar-1 ältere Kommentare anzeigen-1 ältere Kommentare ausblenden
Matt J am 15 Mai 2024
Bearbeitet: Matt J am 15 Mai 2024
The cylinder doesn't extend to the axis limits because fimplicit3 renders shapes within a finite bounding box based on the current axis limits for visualization
Yes, but shouldn't it at least extend to the limits of that box? It doesn't seem to in my OP.
The cylinder becomes invisible because fimplicit3 generates a mesh based on the axis limits at the time of plotting. Expanding the axis limits afterwards doesn't recalculate this mesh.
I think it must recalculate the mesh. The fact that the surface can redraw itself is the whole point of it being an ImplicitSurface object instead of a run-of-the-mill meshplot. In the modified example below ,(with no rotation of the cylinder) changing the axis limits does indeed redraw the cylinder to fill the larger bounding box:
Q=diag([0,1,1]./3^2);
figure;
axis([-5 5 -5 5 -5 5])
view([-2,11])
xlabel X, ylabel Y, zlabel Z
T=makehgtform('axisrotate',[0 1 0],0);
h2.Parent=hgtransform('Matrix',T);
axis([-5 5 -5 5 -5 5]*2) %<----makes the cylinder disappear!
xyz=[x(:).'; y(:).'; z(:).'];
d=reshape( (sum((Q*xyz).*xyz)-1), size(x));
end

Melden Sie sich an, um zu kommentieren.

### Kategorien

Mehr zu Surface and Mesh Plots finden Sie in Help Center und File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by