How to display the coordinate system of the figure (UCS icon)?

39 ビュー (過去 30 日間)
yu sh
yu sh 2016 年 9 月 6 日
回答済み: George Abrahams 2024 年 3 月 20 日
I have a 3D object having irregular shape and volume changing along the axes direction. I want to show the coordinate system icon in the figure associated with that object so that when I will rotate the object it will also change,like available in different CAD/CAE systems. How can I get this in MATLAB?
  2 件のコメント
Henry Giddens
Henry Giddens 2016 年 9 月 6 日
I normally plot this myself in the corner of the axis using the 'line' and 'text' functions. As long as you use these, and not the annotation, then they will rotate with the associated axis. You wont have the arrowheads however.
I don't know whether it can just be turned on but I have never come across it.
yu sh
yu sh 2016 年 9 月 6 日
Thanks Henry I don't need arrowheads, do you have a written code for it?

サインインしてコメントする。

採用された回答

Henry Giddens
Henry Giddens 2016 年 9 月 6 日
編集済み: Henry Giddens 2016 年 9 月 9 日
Hi yu, Yes I have done it a few times. You should be aware that this will work for me because the scale on each axis is equal. For example:
%before this you have plotted a surface in axis hAx
axis(hAx,'equal')
%Get X, Y and Z data for plotting the axes...
X_range = hAx.XLim(2) - hAx.XLim(1);
X_start = hAx.XLim(1);
X_delta = X_range/20;
Y_delta = (hAx.YLim(2) - hAx.YLim(1))/20;
Y_start = hAx.YLim(1);
Z_delta = (hAx.ZLim(2) - hAx.ZLim(1))/20;
Z_start = hAx.ZLim(1);
X_Line = line(hAx,[X_start+X_delta X_start+X_delta*5],[Y_start+Y_delta Y_start+Y_delta],[Z_start+Z_delta Z_start+Z_delta]); % x Line
Y_Line = line(hAx,[X_start+X_delta X_start+X_delta],[Y_start+Y_delta Y_start+Y_delta*5],[Z_start+Z_delta Z_start+Z_delta]); % Y Line
Z_Line = line(hAx,[X_start+X_delta X_start+X_delta],[Y_start+Y_delta Y_start+Y_delta],[Z_start+Z_delta Z_start+Z_delta*5]); %Z Line
X_text = text(hAx,X_start+X_delta*6,Y_start+Y_delta,Z_start+Z_delta,'x');
Y_text = text(hAx,X_start+X_delta,Y_start+Y_delta*6,Z_start+Z_delta,'y');
Z_text = text(hAx,X_start+X_delta,Y_start+Y_delta,Z_start+Z_delta*6,'z');
You can then play around with how long you want each line, the colors of the lines and text etc... I tend to use linkprop to link the properties of the lines that need to stay the same. If you do not have equal axis scales, this method wont really work...
Henry
  11 件のコメント
yu sh
yu sh 2016 年 9 月 9 日
Its finally working Henry! I have just removed 'hAx' from the text function and it works perfect. Thanks again it is of great for me. Btw my version is 2015a.
Divin Xavier
Divin Xavier 2021 年 1 月 8 日
編集済み: Divin Xavier 2021 年 1 月 8 日
Instead of Line command you could use annotation to get the arrow heads (version 2020b)
X_Line = annotation('textarrow',[X_start+X_delta X_start+X_delta*1.5],[Y_start+Y_delta Y_start+Y_delta],'Color','k'); % x Line
Y_Line = annotation('textarrow',[X_start+X_delta X_start+X_delta],[Y_start+Y_delta Y_start+Y_delta*1.5],'Color','k'); % Y Line

サインインしてコメントする。

その他の回答 (1 件)

George Abrahams
George Abrahams 2024 年 3 月 20 日
Heres what I think is a pretty nice solution. The coordinate system bases (arrows) are plotted with my plotframe function on File Exchange.
% The main axes containing the object or data of interest.
axObj = axes;
[ X, Y, Z ] = peaks( 25 );
mesh( axObj, X, Y, Z ./ 3 )
% The small, corner axes containing the coordinate system plot.
axIcon = axes( Position=[0.75 0.75 0.2 0.2] );
plotframe( Parent=axIcon, LabelBasis=true )
% Synchronise the axes cameras.
linkprop( [axObj axIcon], [ "View", "CameraUpVector" ] );
% Some beautification.
set( gcf, Color=axObj.Color )
set( axIcon, CameraViewAngleMode="manual", ...
Color="none", XColor="none", YColor="none", ZColor="none" )
set( [axObj axIcon], DataAspectRatio=[1 1 1], PlotBoxAspectRatio=[1 1 1], View=[50 30] )

カテゴリ

Help Center および File ExchangeLighting, Transparency, and Shading についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by