Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

uniform generation of 3D points on cylinder/cone

I wish to randomly and uniformly generate points on a cylinder and a cone (separately). The cylinder is defined by its center, its radius and height. Same specifications for the cone. I am able to get the bounding box for each shape so I was thinking of generating points within the bounding box. However, I'm not sure how to project them onto the cylinder/cone or if this is the best idea.

Any suggestions?

Thanks.

like image 907
Myx Avatar asked Apr 20 '10 20:04

Myx


3 Answers

The cylinder case is trivial. If the cylinder of radius r > 0 and height h > 0 is the image of (x, y, z) = (r cos φ, r sin φ, z) on φ ∈ [0, 2π[ and z ∈ [-h/2, h/2], then simply choose φ and z randomly on these intervals. Of course one can simply parametrise the cone as well using the standard parametrisation, but then the area element will not be constant on the parameter plane, and so the distribution of points will not be random. Thus you need to find a different parametrisation. I have discussed this topic in detail for a sphere at my AlgoSim site.

like image 97
Andreas Rejbrand Avatar answered Nov 12 '22 15:11

Andreas Rejbrand


One way to think of this is that both the cylinder and the cone can be unwrapped into flat surfaces - just cut each one with a straight line from top to bottom.

The cylinder unwraps to a rectangle (if you're including the top and bottom, then add a couple of disks).

The cone unwraps to a triangle with a curved bottom that is the arc of a circle (if you're including the base of the cone, then add a disk).

It's easy enough to embed these flat surfaces inside a rectangle R on the xy plane. Generate uniformly distributed points in R, and whenever they are inside the flat surfaces, map them back to the original surfaces.

Watch out for some of the other answers here which try to co-ordinatize a cone in terms of angle and height. Although the points will be uniformly distributed with respect to angle and height, they will not be uniformly distributed w.r.t. area. They will be more densely distributed at the tip.

like image 39
brainjam Avatar answered Nov 12 '22 14:11

brainjam


It would be simpler to generate the points directly on the cylinder or cone.

It's been a while since I did this, but parametrise the axis of the cylinder and then for each point parametrise the circle at that height. This will create points on the surface. The radius of the circle is the radius of the cylinder.

For the cone you need to reduce the radius of the circle as you move from the base to the apex.

like image 23
ChrisF Avatar answered Nov 12 '22 13:11

ChrisF