【问题标题】:Random sample of points from a rectangular box with a spherical obstacle带有球形障碍物的矩形框的随机点样本
【发布时间】:2015-05-08 05:27:59
【问题描述】:

工作空间如下:

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 区域内的点。我该怎么做?

【问题讨论】:

  • 你的意思是“在体积内”而不是“在区域内”,对吧?
  • 是的音量。不是区域。它在 3D 空间中。

标签: matlab function random


【解决方案1】:

您想拒绝障碍内的点。自然地,在被拒绝之后,你最终得到的分数可能会比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

您可能希望添加防止无限循环的保护措施(对循环数有一些限制),以防用户传入的值导致没有可接受的点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多