如何在Matlab中绘制椭圆内随机点

3

我想在这个椭圆内填充N个随机点,请帮忙。

clear ,close all;
xCenter = 15;
yCenter = 10;
xRadius = 3.5;
yRadius = 8;
theta = 0 : 0.01 : 2*pi;
N = 100; % N rand points

x = xRadius * cos(theta) + xCenter;
y = yRadius * sin(theta) + yCenter;    

plot(x, y, 'LineWidth', 1);

axis square;

grid on;

我尝试使用这段代码来生成100个椭圆内的点,但是未能达到我的目标:

xCenter = 5;
yCenter = 3;
xRadius = 3.5;
yRadius = 8;
theta = 0 : 0.01 : 2*pi;
N = 100;

x = xRadius * cos(theta) + xCenter;
y = yRadius * sin(theta) + yCenter;

xq=(rand(N,1)*(2*yRadius) - yRadius);
yq=(rand(N,1)*(2*yRadius) - yRadius);    

in = inpolygon(xq,yq,x,y);
hold on
inX = xq(in);
inY = yq(in);
outX = xq(~in);
outY = yq(~in);
plot(inX, inY , 'ro');
plot(outX, outY, 'b*');
plot(x, y, 'LineWidth', 1);

axis square;

grid on;

我的目标是在椭圆区域内绘制N个随机点。 - azdoud
我将编辑问题。 - azdoud
1
您之前的问题中没有接受任何答案。其中一些有非常好的书面答案。请考虑重新访问您以前的问题,并通过单击答案左侧的 标记解决您问题的最佳答案(每个问题只能标记一个答案为已接受)。如果您喜欢,您还可以通过单击答案左侧的 标记来 upvote 最佳和所有其他有用的答案。 - Sardar Usama
2个回答

7

Sardar的答案产生的点在椭圆内分布不均匀。这段代码可以产生均匀分布的点:

xCenter = 15;
yCenter = 10;
xRadius = 3.5;
yRadius = 8;
N = 100;

% Generate points in the ellipse
t = 2*pi * rand(N,1);
d = sqrt(rand(N,1));
x = xCenter + xRadius * d .* cos(t);
y = yCenter + yRadius * d .* sin(t);
plot(x,y,'o')

差异在于归一化(0到1)距离原点d上的平方根。通过计算这个平方根,您可以增加靠近椭圆边缘的点的密度。这弥补了点在中心附近过于密集的情况。沿着归一化距离的均匀分布导致点在中心附近的密度更高。

错误输出显示 Error using .* 矩阵维度必须相同。 - azdoud
你有旧版本的MATLAB吗?这段代码假定了隐式单例扩展,这是自去年以来MATLAB的新功能。我修改了代码,使其适用于没有此新功能的旧版本。 - Cris Luengo
1
在我了解这个技巧之前,我通常会在椭圆的边界框内均匀生成点,并丢弃未落入椭圆内的点。对于更复杂的形状,如任意多边形,仍然可以采用这种方法。 - Cris Luengo
是的,你说得完全正确,当我选择N = 7000个点时,我可以看到差异,你的答案更准确,但还是感谢大家。 - azdoud

1
生成 x 轴和 y 轴的随机数,范围限定在 xRadiusyRadius 之间。请参考在特定范围内生成随机数了解如何生成这些随机数。请注意保留 HTML 标签。
hold on;
RndAngles = rand(N,1);      %Same angle should be used
Xpoints = (xRadius.*rand(N,1) .*cos(2*pi*RndAngles))+ xCenter;   
Ypoints = (yRadius.*rand(N,1) .*sin(2*pi*RndAngles))+ yCenter;
plot(Xpoints,Ypoints,'o');  %Plot those points

输出:

输出


这会在椭圆中心产生过多的点。请查看我的答案以获得正确的点分布。 - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接