你能画出任意角度的极坐标吗?还是左上右下是唯一的选择?

51次观看(过去30天)
我想画一个极坐标图,上面的角度是飞行器的头部,就像你们在导航显示器上看到的那样。有办法做到这一点吗?我尝试使用视图功能来改变角度,但它失败了。有没有办法改变ax。ThetaZeroLocation到一个角度而不是列出的四个选项?

接受的答案

亚当Danz
亚当Danz 2020年9月28日
编辑:亚当Danz 2020年9月29日
这里有一个演示演示如何旋转直线对象和在极轴上的刻度。极轴的方向由uifig图中的uislider控制。滑块的回调函数更新 ThetaData 属性用于坐标轴上的所有对象。
限制和注意事项:
  1. 如果有任何绘图对象其角位置不是由“ThetaData属性(即文本对象),这将不得不适应工作与他们的位置属性。
  2. ThetaData所有对象的值都被更新,它们将不再保留原始值。例如,如果原来的值是0,它被旋转了15度,那么它的新值将是15。要获得原始的theta值,请查看滑块的用户数据属性,该属性存储相对于ThetaZeroLocation的当前极轴方向。
有关详细信息,请参阅内联注释。
为极坐标图创建数据
Th1 = linspace(0,pi*11/6,12);
R1 = cos(th1);
Th2 = linspace(5*pi/6,9*pi/6,20);
R2 = linspace(1,0.1,20);
创建极坐标图
对于此演示,此图只能包含具有
%角位置由'ThetaData'属性控制。
图= ufigfigure ();
Ax =极坐标(图);
(ax,“上”
极坐标(ax, th1, r1,“b -”“线宽”2);
极坐标(ax, th2, r2,“罗”“MarkerFaceColor”“r”);
极坐标(ax, 0, .9,“金伯利进程”“MarkerSize”, 16岁,“MarkerFaceColor”“y”
标题句柄=标题(ax,“朝向:0度”);
%添加滑块和标签
ax.Position((2、4))= ax.Position((2、4))+(酒精含量,原来);
uilabel(图,“位置”, [20 60, 400,20],“文本”'调整极轴的方向(deg from ThetaZeroLocation)');
您可以将“ValueChangingFcn”和“ValueChangedFcn”替换为同一个回调函数。
SLDR = uislider(图,“位置”, [20, 50, 520, 3],“价值”0,“限制”[-180180],...
“MajorTicks”180:30:180,“MinorTicks”[],“用户数据”0,...UserData存储当前旋转
“ValueChangingFcn”@ (sldr事件)updatePolarTicks (sldr、事件、ax titleHandle));
drawnow ();暂停(0.05)
定义滑块的回调函数来更新极轴的方向
%相对于TheatZeroLocation。
函数updatePolarTicks (sldr、事件、ax, titleHandle)
%更新标题和计算旋转量;在内存中存储新的方向。
titleHandle。字符串= sprintf(方向:%。0 f度', event.Value);
旋转=事件。值- sldr.UserData;% (+ = CCW, - = CW)
sldr。UserData = event.Value;
%将旋转角度转换为弧度,包装为[0,2pi]
dwrap = @ (d)国防部(d, 360) + (d > 0 &国防部(d, 360) = = 0) * 360;%包裹度到0:360
Deg = dwrap(旋转);
Rad = pi/180*deg;
%旋转线条对象
chil = ax.Children;
thData = get(child,“ThetaData”);
thDataRot = cellfun(@(c){c+rad},thData);
集(孩子,{“ThetaData”}, thDataRot)
%更新节拍
origTickLabs = ax.ThetaTickLabel;
[newTicks, tickLabIdx] = unique(dwrap(unique(mod(ax.ThetaTick,360),“稳定”) + deg));
斧子。ThetaTick = newTicks;
斧子。ThetaTickLabel = origTickLabs(tickLabIdx);
结束
5个评论
亚当Danz
亚当Danz 2020年9月29日
编辑:亚当Danz 2020年9月29日
瑞恩,如果你想在你分享的图片中重建无线电磁场指示器(或其他什么),你可以很容易地覆盖飞机的轮廓,使用 图像 显示亮度图像 ,或 imshow ,在适当缩放后,你也可以更换 ThetaTickLabels 与罗盘方向('N', 'E'等..),将保持在极轴旋转。

登录发表评论。

更多答案(1)

Sindar
Sindar 2020年9月28日
大概是这样:
Top_angle = 24;
%获得当前标签
Tt = taticks;
%旋转角度,使top_angle代替90
Tt_2 = mod(tt - 90 + top_angle,360);
thetaticklabels (tt_2)

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!