【问题标题】:Generating random point in a cylinder在圆柱体中生成随机点
【发布时间】:2012-02-09 14:43:06
【问题描述】:

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

【问题讨论】:

  • 这些答案一直假设圆柱体与 z 轴对齐。这些答案是否足够,或者您是否需要一种方法来计算沿非标准轴的类似圆柱体?
  • 下面的答案还假设您希望点均匀分布在圆柱体的体积内。如果这不是你想要的,你应该清楚地指出。
  • 如果圆柱体沿着非标准轴,我喜欢有一种方法
  • @user1198477:完成您想要做的事情的最简单方法是在标准圆柱体中创建点(例如,高度和半径均为 1 并以原点为中心,并沿其中之一对齐轴),然后使用仿射变换将这个标准圆柱内的点移动到您想要的圆柱内。直接在气缸中创建它们比采取两步方法要复杂得多。

标签: math geometry


【解决方案1】:

--在 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,它导致笛卡尔坐标中的分布不均匀,并且点集中在圆的中心。取平方根可以纠正这个问题,至少如果我的算术正确的话。

[啊,好像是sqrtwas right。]

(请注意,我没有考虑就假设圆柱体与 z 轴对齐,并且圆柱体中心位于 (0,0,H/2)。设置 (0, 0,0) 在圆柱体中心,在这种情况下,z 应选择在 -H/2 和 H/2 之间,而不是 0,H。)

【讨论】:

  • 如果圆柱体沿着非标准轴,我喜欢有一种方法
【解决方案2】:

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

【讨论】:

  • 这有可能需要很长时间才能终止。不值得对你投反对票,因为你没有错,但这是一个值得一提的警告。
【解决方案3】:

生成一个随机角度(可选小于 2π),一个小于半径的随机 r,以及一个小于高度的随机 z

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

【讨论】:

  • 您应该查看 DSM 帖子中的链接。虽然 OP 没有说这些点应该在圆柱体的体积内均匀分布,但似乎是隐含的。您的解决方案将沿 z 轴更密集地聚集点。要均匀分发,请将r 更改为sqrt(r)
  • @andand:是的。我已经为他投了赞成票,但我不想窃取他的答案。
【解决方案4】:

z轴很简单:-0.5 * h

x 和 y 等于一个圆将是: x^2 + y^2

但数学对我来说是很久以前的事了 :-)

【讨论】:

  • 对不起,不应该是0 <= z <= h吗?
  • 我认为这取决于您是否假设圆柱体以 z 方向为中心,我的“圆柱体”中心位于 (0, 0, 0)。
猜你喜欢
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2011-08-15
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多