|
|
/*
Demos placement of random balls without overlap.
In response to a mushy query in pov.general by Ryan Twitchell
Alf
http://www.peake42.freeserve.co.uk
http://ourworld.compuserve.com/homepages/Alf_Peake/
*/
#version 3.1;
global_settings { assumed_gamma 1 }
#include "colors.inc"
camera{ location y*40 angle 20 look_at 0 }
light_source {<20, 100, -20> color White }
#declare R2=seed(1999);
#declare Wanted=40; // Number of balls
#declare Store=array[Wanted] // Stores ball positions
#declare Rad=0.5; // Size of ball
plane{ y,-Rad pigment{ checker rgb 0.3, rgb 0.7 } hollow }
// For randon sizes, #declare Kiss=(radius1+radius2) later
#declare Kiss = 2*Rad; file://Minimum separation
#declare BallPark=5; // Put 'em here
#declare Quit = 0; // Escape route
#declare Status = Green; // Will be a green or red torus on exit
#declare Count=0;
#while (Count<Wanted)
#declare RandAngl = rand(R2)*pi*2; // Random angle from origin
#declare RandDist=rand(R2)*BallPark-Rad; file://and distance
#declare New = <sin(RandAngl)*RandDist, 0, cos(RandAngl)*RandDist>;
#declare OK = true;
#if (Count>0) #declare Count2=0;
#while (Count2<Count)
#if (abs( vlength( Store[Count2]-New)) < Kiss )
#declare OK=false;
#end
#declare Count2=Count2+1;
#end
#end
#if (OK=true) // Use location now, or use the array later
sphere{ New, Rad pigment{ Yellow }
finish{ phong 1 phong_size 40 } } // Good 'un
#declare Store[Count]=New; // Keep it
#declare Count=Count+1;
#end
#declare Quit=Quit+1;
#if (Quit>1500) // Bails out if stuck
#debug concat("Quit at Ball ", str(Count, 4, 1),"\n")
#declare Count=Wanted; #declare Status = Red;
#end
#end
// Shows valid area and status
torus{ BallPark+0.05,0.1 pigment{ Status } }
Post a reply to this message
|
|