2012-02-08 292 views
2

如果圆柱体的半径r和高度h已给定,那么在圆柱体的体积内生成随机3d点[x,y,z]的最佳方法或算法是什么?在圆柱体中生成随机点

+0

这些答案一直假设圆柱体与z轴对齐。这些答案是否足够,或者您是否需要一种方法来计算类似的圆柱体,也就是说,沿非标准轴线? – 2012-02-09 00:42:46

+0

下面的答案也假设您希望均匀分布在圆柱体积内的点。如果那不是你想要的,你应该清楚地指出。 – andand 2012-02-09 06:41:19

+0

如果圆柱体沿着非标准轴线,我喜欢有一个方法 – user1198477 2012-02-09 16:50:56

回答

2

在外接圆柱体的长方体内部生成一个随机点;如果它位于圆柱体内部(概率为π/ 4),则保留它,否则丢弃并重试。

+1

这有**花费很长时间终止的可能性**。不值得让你失望,因为你没有错,但这是一个值得提及的警告。 – 2012-02-09 00:40:22

0

生成随机角度(任选地小于2π),小于半径的随机r,并且比高度更小的随机z

x = r * cos(angle) 
y = r * sin(angle) 
+1

您应该查看DSM帖子中的链接。尽管OP没有说这些点应该均匀分布在圆柱体积内,但它似乎是隐含的。您的解决方案将更密集地沿着z轴聚集点。为了均匀分配,将'r'改为'sqrt(r)'。 – andand 2012-02-09 06:38:49

+0

@andand:是的。我已经提出了他的建议,但我不想窃取他的答案。 – SLaks 2012-02-09 18:15:23

0

z轴很容易:-0.5 * H < = Z < = 0.5 * H

x和y等于圆将是: 的x^2 + Y^2 < = R^2

Buth数学是很久以前我:-)

+0

特赦,但不应该是'0 <= z <= h'? – 2012-02-09 00:41:28

+0

我认为这取决于你是否假设圆柱体在z方向居中,我的'圆柱体'中心位于(0,0,0)。 – 2012-02-09 01:03:44

+0

啊。对。很公平。 – 2012-02-09 19:39:19

9

怎么样 - 在Python伪代码,让R上的半径和H是高度:

s = random.uniform(0, 1) 
theta = random.uniform(0, 2*pi) 
z = random.uniform(0, H) 
r = sqrt(s)*R 
x = r * cos(theta) 
y = r * sin(theta) 
z = z # .. for symmetry :-) 

简单地取x = r * cos(angle)y = r * sin(angle)的问题是,那么当r很小时,即在圆的中心,r的微小变化不会很大地改变x和y位置。 IOW,它导致笛卡尔坐标中的非均匀分布,并且这些点集中在圆的中心。以平方根来纠正这一点,至少如果我正确地完成了我的算术。

[AH,它看起来像SQRT was right。]

(请注意,我假定不考虑它,所述气缸与z轴对齐和气缸中心位于(0,0, H/2),在圆柱体中心设置(0,0,0)不那么随意,在这种情况下,z应选择在-H/2和H/2之间,而不是0,H。)

+0

如果圆柱体沿着非标准轴,我喜欢有一个方法 – user1198477 2012-02-09 16:51:33