POV-Ray : Newsgroups : povray.advanced-users : New random distribution macros : New random distribution macros Server Time 2 Apr 2023 05:35:03 EDT (-0400)
 New random distribution macros
 From: Bald Eagle Date: 2 Mar 2021 17:35:00 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.603ebc7e3dd543ac1f9dae300%40news.povray.org",
"dateCreated": "2021-03-02T22:35:00+00:00",
"datePublished": "2021-03-02T22:35:00+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
After playing with greeble placement on a sphere, I realized that there were no
macros in rand.inc for generating random points on the surface of things like
cubes, tori, cylinders and cones, etc.

I've written a few, and am picking away at the remaining ideas on my list, but
would like to assemble a reasonably complete collection before publishing for
overall critical review and testing. (contributions welcome)

As always, most everything is a rough draft that is a proof of concept, and
everything including the name is up for revision.
Some are just basic task macros that are used in the actual random distribution
macros.

What I have so far is:

MakePerpendicularVector (v0) - basically just the alternate version of
VPerp_To_Vector (v0) with a different name to differentiate it.

Rand_Integer (Min, Max, RandSeed)
// Returns an integer from Min to Max, inclusive [Min ... Max]

Array_Of_Integers (Min, Max)
// Creates an array of integers from Min to Max inclusive [Min ... Max]

Rand_Element_In_Array (Array, Dim, RandSeed)
// Returns a random element of a dimension of an array

VRand_In_Rectangle (V_Plane, S_Width, S_Height, S_RandSeed)
// Returns a random point in a rectangle lying in the specified plane

VRand_ON_Box (RandSeed)
// Returns a random point on an origin-centered unit box

VRand_ON_Circle (RandSeed)
// Returns a random point on an origin-centered unit circle (radius = 1)

// Returns a random point on a cone (or cylinder)

// Returns a random point IN a cone (or cylinder)

VRand_ON_Parametric (UVstart, UVend, fnX, fnY, fnZ, RandSeed)
// Returns a random point on a parametric surface
This will probably be general purpose, with calls to it for generating
points on a torus, etc

I'm using the #if (input_file_name = "RandomDistributions.inc") trick to set up
a test scene (no #camera - only using the default), and every macro will have a
companion test macro to demonstrate that it works, and provide a working syntax
and code/usage example.
So VRand_ON_Parametric (UVstart, UVend, fnX, fnY, fnZ, RandSeed) will have a
VRand_ON_Parametric_TEST () macro to go along with it.

Remaining ideas slated for development are:
VRand_ON_SOR ()
VRand_ON_Lathe ()
VRand_ON_Prism ()
VRand_In_Polygon ()   Not sure "vrand in object" will work - will inside() tests
work with planar objects?
VRand_ON_BicubicPatch ()
VRand_ON_Isosurface ()

Folks are welcome to beat me to the punch, or write their own versions to
compare approaches, efficiency, flexibility, speed, etc.

Other areas of future interest:

Prism <x,z> syntax infuriates me, and so I'd like to write a tidy macro to use
<x,y,z> coordinates, probably from an array, and maybe another macro to take the
<x,z> part of a prism and create an array of proper <x, y, z> coordinates.

Is it somehow possible (in SDL) to divine how many arguments an extant function
requires?   That would be useful.  We have dimension_size for arrays...

clipka noted the shortcomings of HSV, and I was wondering if some of the people
who play with color spaces and interpolation might come up with something along
the lines of: https://www.alanzucconi.com/2017/07/15/improving-the-rainbow-2/
```