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万+

被折叠的 条评论
为什么被折叠?



