工作区的名称为:
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
区域内的点数。我怎么能这样做?
答案 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
如果用户传入的值不存在可接受的点,您可能需要添加一个针对无限循环的保护措施(对循环次数有一些限制)。