从带有球形障碍物的矩形框中随机抽取点

时间:2015-03-06 15:09:15

标签: matlab function random

工作区的名称为:

limits=[-1 4; -1 4; -1 4];

在这个工作空间中,有一个球形障碍,定义为:

obstacle.origin_x=1.6;
obstacle.origin_y=0.8;
obstacle.origin_z=0.2;
obstacle.radius_obs=0.2;
save('obstacle.mat', 'obstacle');

我想在lim区域创建随机点。我使用下面的代码创建了随机点:

function a=rndmpnt(lim, numofpoints)
x=lim(1,1)+(lim(1,2)-lim(1,1))*rand(1,numofpoint);
y=lim(2,1)+(lim(2,2)-lim(2,1))*rand(1,numofpoint);
z=lim(3,1)+(lim(3,2)-lim(3,1))*rand(1,numofpoint);

a=[x y z];

现在我想消除limits-obstacle区域内的点数。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您想要拒绝障碍物内的点数。当然,拒绝后你可能会得到比numofpoint更少的分数。因此,需要重复该过程,直到生成足够的点。此处while循环是合适的。

通过找到ix(可接受点的索引)并仅将这些点附加到矩阵a来完成拒绝。循环重复,直到有足够的循环,并返回所需的数字。

function a = rndmpnt(lim, numofpoints)
a = zeros(3,0);       % begin with empty matrix
while size(a,2) < numofpoint     % not enough points yet
    x=lim(1,1)+(lim(1,2)-lim(1,1))*rand(1,numofpoint);
    y=lim(2,1)+(lim(2,2)-lim(2,1))*rand(1,numofpoint);
    z=lim(3,1)+(lim(3,2)-lim(3,1))*rand(1,numofpoint);
    ix = (x - obstacle.origin_x).^2 + (y - obstacle.origin_y).^2 + (z - obstacle.origin_z).^2 > obstacle.radius_obs^2;
    a = [a, [x(ix); y(ix); z(ix)]];
end
a = a(:, 1:numofpoint);
end

如果用户传入的值不存在可接受的点,您可能需要添加一个针对无限循环的保护措施(对循环次数有一些限制)。