参考了matlab 绘制任意方向和位置的空间圆锥体中绘制圆锥的思路,在此基础上加了我需要的应用。就是绘制波束扫描示意图。
1 原理- 根据波束宽度得到在归一化威力值上的弧长。
- 然后根据方位和俯仰向弧长产生一个模拟波束参数的圆柱的坐标点。
- 将圆柱以半径修正高度坐标,转换成圆锥。
- 修正因为绕轴旋转带来的波束角度偏差。
- 将波束旋转到波束指向位置。
-
cylinder [X,Y,Z] = cylinder(r,n) 返回具有指定剖面曲线 r 和圆周上 n 个等距点的圆柱的 x、y 和 z 坐标。该函数以三个 (n+1)×(n+1) 矩阵形式返回 x、y 和 z 坐标。
-
makehgtform 使用 makehgtform 创建用于转换、缩放和旋转图形对象的变换矩阵。M = makehgtform(‘axisrotate’,[ax,ay,az],t) 围绕轴 [ax ay az] 旋转 t 弧度。
-
rotate 将对象根据给定的坐标轴旋转给定的角度。 rotate(h,direction,alpha,origin) 将图形对象 h 旋转 alpha 度。指定 h 为曲面、补片、线条、文本或图像对象。direction 是一个二元素或三元素向量,它与旋转轴原点共同确定旋转轴。旋转轴的原点为origin,默认原点是图框中心。
- 单个波束
示例:产生指向[30,30],波束宽度为[5,8],归一化威力为1的波束1 以及 指向[15,7.5],波束宽度为[15,15],归一化威力为0.5的波束1 代码:
clear all; close all; %% 波束参数 phi = [30 15]; theta = [30 7.5]; bw_azim = [5 15]; bw_elev = [8 15]; r = [1 0.5]; %% 绘图 figure; for i = 1:length(r) [XSdat,YSdat,ZSdat,XPdat,YPdat,ZPdat] = beam_point(phi(i),theta(i),bw_azim(i),bw_elev(i),r(i)); mesh(XSdat,YSdat,ZSdat,(XSdat.^2 + YSdat.^2 + ZSdat.^2));hold on; fill3(XPdat,YPdat,ZPdat,'b');hold on; end xlim([0 1]);ylim([-1 1]);zlim([0 1]); title('归一化波束指向'); xlabel('x');ylabel('y');zlabel('z');
-
波束扫描示意图
function [XSdat,YSdat,ZSdat,XPdat,YPdat,ZPdat] = beam_point(phi,theta,bw_azim,bw_elev,r) %--------------------- 绘制波束指向椭圆锥示意图 --------------------- % 功能:根据给定的波束指向、波束宽度和归一化威力绘制波束指向示意图; % 参数:phi : 方位角(角度制), % theta: 俯仰角(角度制), % bwx : 波束方位向宽度(角度制), % bwy : 波束俯仰向宽度(角度制), % r : 归一化威力; % 作者: w0shishabi %------------------------------------------------------------------ % 测试 % theta = 30; % phi = 30; % bw_azim = 5; % bw_elev = 8; % r = 1; % 计算圆锥对应在威力球面上的弧长 arc_length_beam_azim = bw_azim * pi * r / 180; arc_length_beam_elev = bw_elev * pi * r / 180; % 计算笛卡尔坐标 px = cosd( theta ) * cosd( phi ); py = cosd( theta ) * sind( phi ); pz = sind( theta ); rotate_axis = [px py pz+1]; % 绘制椭圆锥 [x,y,z]=cylinder(linspace(1,0,50),100); x = x * arc_length_beam_azim/2; y = y * arc_length_beam_elev/2; z=(1-z)*r ; % 绘制椭圆锥 fig = figure; EndPlate1=fill3(x(1,:),y(1,:),z(1,:),'b'); hold on; Cylinder=mesh(x,y,z); % xlim([-1 1]);ylim([-1 1]);zlim([0 1]); % rotate是绕轴旋转,所以需要线修正因为旋转造成的波束角度偏差 rotate_h = makehgtform('axisrotate',rotate_axis,pi); azim_v = rotate_h(1:3,1:3) * [0;1;0]; angle_correction = acos(dot([0 0 1],azim_v.')/(norm([0 0 1])*norm(azim_v.'))) / pi * 180; rotate(Cylinder,[0 0 1],-angle_correction,[0 0 0]); rotate(EndPlate1,[0 0 1],-angle_correction,[0 0 0]); % 将修正后的波束转到指向角 rotate(Cylinder,rotate_axis,180,[0 0 0]); rotate(EndPlate1,rotate_axis,180,[0 0 0]); % 获取模型数据 XSdat = get(Cylinder,'XData'); YSdat = get(Cylinder,'YData'); ZSdat = get(Cylinder,'ZData'); XPdat = get(EndPlate1,'XData'); YPdat = get(EndPlate1,'YData'); ZPdat = get(EndPlate1,'ZData'); % 关闭临时figure close(fig); end