Generating random point in a cylinder

后端 未结 4 1353
旧时难觅i
旧时难觅i 2020-12-21 13:47

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?

4条回答
  •  温柔的废话
    2020-12-21 14:18

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

提交回复
热议问题