MATLAB 根据任意角度、取样点数(分辨率)、位置、大小画椭圆代码

20个点,偏斜30度。 借鉴了别忘记点赞哦。

1、效果

2、代码

function ellipse_point = get_ellipse(center_point, r_a_b, angle_in, point_num)
% 调用例子
% r_a = 20;%长半径
% r_b = 10;%短半径
% angle = 30; % 旋转角度
% a = 20;%圆心横坐标
% b = 10;%圆心纵坐标
% point_num = 20; % 取样点数
% point = get_ellipse([a b], [r_a, r_b],angle,20);
% figure(2)
% plot(point(:,1)',point(:,2)','-')
% axis equal

    r_a = r_a_b(1);%长半径
    r_b = r_a_b(2);%短半径
    angle = deg2rad(angle_in);
    a = center_point(1);%圆心横坐标
    b = center_point(2);%圆心纵坐标
    theta = 0:2*pi/point_num:2*pi; %角度[0,2*pi] 
    x = a+r_a*cos(theta);
    y = b+r_b*sin(theta);
    R = [cos(angle) sin(angle) 0; -sin(angle) cos(angle) 0; 0 0 1]; % 旋转矩阵
    data_length = length(x); 
    for i=1 : data_length
        temp = [x(i),y(i),1]*R;
        x(i) = temp(1);
        y(i) = temp(2);
    end
    ellipse_point = [x',y'];
end

3、得到两智能体间障碍物阻隔视线邻接矩阵(两点连线穿过障碍物视为通信中断)

 

close all;clear all;clc;
point_num = 600; % 障碍物取样点数

%第一个椭圆障碍物
r_a = 3.5;%长半径
r_b = 3.5;%短半径
o_x = 160;%圆心横坐标
o_y = 9;%圆心纵坐标
point_1 = get_ellipse([r_a, r_b],10,point_num);
point_1(:,1) = point_1(:,1)+o_x;
point_1(:,2) = point_1(:,2)+o_y;

R_s=12;
im_point = [159,12; 161,15.5; 160,10; 167,10; 180,12; 170,14];
% im_point = [160,18;161,7];
nn = size(im_point,1);
neighbor  = zeros(nn, nn); %智能体间可视邻接矩阵
for i = 1:nn
    pi = im_point(i, :);
    xi = pi(1);
    yi = pi(2);
    for m = 1:nn
        if i==m
            neighbor(i,m) = 1;
        elseif m > i-1
            pm = im_point(m, :);
            xm = pm(1);
            dis_im = pm - pi;
            dis_im_norm = sqrt(dis_im(1).^2 + dis_im(2).^2); %计算m相对于i的距离
            theta_s = atan2(dis_im(2),dis_im(1));  %计算m相对于i的方向角度
            if dis_im_norm<R_s  && dis_im_norm~=0 % m在i的感知范围之内
                up_p_num   = 0;
                dowm_p_num = 0;
                pi_plus = [xi*ones(point_num,1) yi*ones(point_num,1)];
                dis_derta = point_1 - pi_plus;
                dis_l = sqrt(dis_derta(:,1).^2 + dis_derta(:,2).^2);
                for k = 1 : size(point_1,1)
                    if dis_l(k)<R_s
                         %得到原点在智能体i位置,由i指向m作为x轴正方向的旋转矩阵
                        p_im_obs = [cos(theta_s), sin(theta_s); -sin(theta_s), cos(theta_s)]*[point_1(k,1)-xi;point_1(k,2)-yi];
                        if p_im_obs(1)>=0 && abs(p_im_obs(2)) < 1
                            if abs(p_im_obs(2)) < 0.01 % 如果直线穿过障碍物点
                                up_p_num   = up_p_num + 1;
                                dowm_p_num = dowm_p_num+1;
                            elseif p_im_obs(2) > 0.01  % im两点连线左边,存在障碍物
                                up_p_num   = up_p_num + 1;
                            else                       % im两点连线右边,存在障碍物
                                dowm_p_num = dowm_p_num+1;
                            end
                        end
                    end
                end
                if up_p_num && dowm_p_num % 如果im连接直线上下方都有障碍物
                    neighbor(i,m) = 1; % 则判断i和m智能体看不到
                    continue;
                end
            else
                neighbor(i,m) = 1; % 则判断i和m智能体看不到
            end
        else
            neighbor(i,m) = neighbor(m,i);
        end
    end
end

neighbor


%效果显示
figure;
for i=2:nn
    hold on;
    if neighbor(1,i) 
        plot([im_point(1,1), im_point(i,1)],[im_point(1,2), im_point(i,2)],"k--");
    else
        plot([im_point(1,1), im_point(i,1)],[im_point(1,2), im_point(i,2)],"b-");
    end
end
plot(point_1(:,1),point_1(:,2),"r.");
hold on;
plot((im_point(2:end,1))', (im_point(2:end,2))',"bo");
hold on;
plot((im_point(1,1))', (im_point(1,2))',"b^");
hold off;
axis equal
daspect([1 1 1]);

%% 生成障碍物
function ellipse_point = get_ellipse(r_a_b, angle_in, point_num)
point_num = point_num - 1;
% 调用例子
% r_a = 20;%长半径
% r_b = 10;%短半径
% angle = 30; % 旋转角度
% a = 200;%圆心横坐标
% b = 10;%圆心纵坐标
% point_num = 200; % 取样点数
% point = get_ellipse( [r_a, r_b],angle,20);
% figure(2)
% plot(point(:,1)',point(:,2)','-')
% axis equal
 
    r_a = r_a_b(1);%长半径
    r_b = r_a_b(2);%短半径
    angle = deg2rad(angle_in);
    a = 1000;%圆心横坐标
    b = 1000;%圆心纵坐标
    theta = 0:2*pi/point_num:2*pi; %角度[0,2*pi] 
    x = a+r_a*cos(theta);
    y = b+r_b*sin(theta);
    R = [cos(angle) sin(angle) 0; -sin(angle) cos(angle) 0; 0 0 1]; % 旋转矩阵
    data_length = length(x); 
    for i=1 : data_length
        temp = [x(i),y(i),1]*R;
        x(i) = temp(1);
        y(i) = temp(2);
    end
    x = (x - min(x))';
    y = (y - min(y))';
    
    ellipse_point =[x,y];
end
%% 坐标系平移旋转实例
% angle = pi/6;  %旋转
% move  = [3,4]; %平移
% %逆时针
% rot_mat_x = [cos(-angle), sin(-angle); -sin(-angle), cos(-angle)]*[1;0] + [3,4]';
% rot_mat_y = [cos(-angle), sin(-angle); -sin(-angle), cos(-angle)]*[0;1] + [3,4]';
% plot([3,rot_mat_x(1)],[4,rot_mat_x(2)],"b-");
% hold on;
% plot([3,rot_mat_y(1)],[4,rot_mat_y(2)],"r-");
% hold on;
% plot([0,1],[0,0],"b-");
% hold on;
% plot([0,0],[0,1],"r-");
% axis equal
% daspect([1 1 1]);

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值