Generating random point in a cylinder

2019-01-28 23:10发布

What is best way or an algorithm for generating a random 3d point [x,y,z] inside the volume of the circular cylinder if radius r and height h of the cylinder are given?

标签: math geometry
4条回答
ゆ 、 Hurt°
2楼-- · 2019-01-28 23:33

Generate a random point inside the rectangular solid circumscribing the cylinder; if it's inside the cylinder (probability pi/4), keep it, otherwise discard it and try again.

查看更多
做个烂人
3楼-- · 2019-01-28 23:36

Generate a random angle (optionally less than 2π), a random r less than the radius, and a random z less than the height.

x = r * cos(angle)
y = r * sin(angle)
查看更多
家丑人穷心不美
4楼-- · 2019-01-28 23:45

How about -- in Python pseudocode, letting R be the radius and H be the height:

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 :-)

The problem with simply taking x = r * cos(angle) and y = r * sin(angle) is that then when r is small, i.e. at the centre of the circle, a tiny change in r doesn't change the x and y positions very much. IOW, it leads to a nonuniform distribution in Cartesian coordinates, and the points get concentrated toward the centre of the circle. Taking the square root corrects this, at least if I've done my arithmetic correctly.

[Ah, it looks like the sqrt was right.]

(Note that I assumed without thinking about it that the cylinder is aligned with the z-axis and the cylinder centre is located at (0,0,H/2). It'd be less arbitrary to set (0,0,0) at the cylinder centre, in which case z should be chosen to be between -H/2 and H/2, not 0,H.)

查看更多
【Aperson】
5楼-- · 2019-01-28 23:49

The z axis is easy: -0.5 * h <= z <= 0.5 * h

The x and y are equal to a circle will be: x^2 + y^2 <= r^2

Buth math is long ago for me :-)

查看更多
登录 后发表回答