matlab 绘制椭圆锥波束指向示意图

参考了matlab 绘制任意方向和位置的空间圆锥体中绘制圆锥的思路,在此基础上加了我需要的应用。就是绘制波束扫描示意图。

1 原理

  • 根据波束宽度得到在归一化威力值上的弧长。
  • 然后根据方位和俯仰向弧长产生一个模拟波束参数的圆柱的坐标点。
  • 将圆柱以半径修正高度坐标,转换成圆锥。
  • 修正因为绕轴旋转带来的波束角度偏差。
  • 将波束旋转到波束指向位置。
  1. cylinder
    [X,Y,Z] = cylinder(r,n) 返回具有指定剖面曲线 r 和圆周上 n 个等距点的圆柱的 x、y 和 z 坐标。该函数以三个 (n+1)×(n+1) 矩阵形式返回 x、y 和 z 坐标。

  2. makehgtform
    使用 makehgtform 创建用于转换、缩放和旋转图形对象的变换矩阵。M = makehgtform(‘axisrotate’,[ax,ay,az],t) 围绕轴 [ax ay az] 旋转 t 弧度。

  3. rotate
    将对象根据给定的坐标轴旋转给定的角度。
    rotate(h,direction,alpha,origin) 将图形对象 h 旋转 alpha 度。指定 h 为曲面、补片、线条、文本或图像对象。direction 是一个二元素或三元素向量,它与旋转轴原点共同确定旋转轴。旋转轴的原点为origin,默认原点是图框中心。
    在这里插入图片描述
    在这里插入图片描述

2 效果

  1. 单个波束

示例:产生指向[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');

在这里插入图片描述

在这里插入图片描述

  1. 波束扫描示意图
    在这里插入图片描述

3 函数代码

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lu-ming.xyz

觉得有用的话点个赞吧 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值