Generating random point in a cylinder

后端 未结 4 1351
旧时难觅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:04

    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)
    
    0 讨论(0)
  • 2020-12-21 14:08

    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.

    0 讨论(0)
  • 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.)

    0 讨论(0)
  • 2020-12-21 14:18

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

    0 讨论(0)
提交回复
热议问题