Phil Rhoades
9/9/2006 5:36:00 PM
Paul,
On Sat, 2006-09-09 at 17:50 +0900, Paul Lutus wrote:
> Philip Rhoades wrote:
>
> > People,
> >
> > I have been thinking about how to use Ruby for modelling populations - I
> > want to use circles on a grid to represent the size of individual
> > populations and determine if there is dispersal between pairs of
> > populations by testing whether there is overlap with the two circles.
>
> This is, strictly speaking, a math question. It is rather far removed from
> Ruby per se.
>
> For two circles (position x,y and radius r) x1,y1,r1 and x2,y2,r2, if:
>
> (x2-x1)^2+(y2-y1)^2 < (r2+r1)^2
>
> Then the circles overlap. With a little more math, you can compute the area
> of the overlapping region.
>
> > I need to keep track of:
> >
> > - all the individual circles (populations) on a grid
> >
> > - which other circles each circle overlaps with
> >
> > And I need to:
> >
> > - iterate through ALL the circles (for each generation of the
> > populations)
> >
> > I thought of using a two dimensional array, each row representing a
> > circle.
>
> At first glance, there's no need for a two-dimensional array. You have a set
> of circles and you want to find those that overlap. Simply create an
> algorithm that compares every circle with every other circle using the
> relation stated above. The fact that the problem exists in two-space
> doesn't mean the array needs two dimensions.
>
> > Elements 2-x of each row could point to another array
> > representing the other circles that this circle overlaps with -
>
> This is indeed rather cumbersome. You could create a result array of circles
> containing the degree to which they overlap (you can establish the area of
> overlap), and you could update this list by repeating the algorithm after
> making changes to the positions and sizes of the original circles.
>
> If you really need the specific degree of overlap of each circle with each
> of the other circles, then at that point you do need a two-dimensional
> array. If instead you only need the cumulative amount of overlap without
> having to identify the overlapping circles, then a single dimension will
> suffice.
>
> Now to touch on Ruby. The first step would be to create a class containing
> the circle descriptions:
>
> class PopCircle
> attr_accessor :x,:y,:r
> def initialize(x,y,r)
> # read the class variables
> end
> end
>
> Then you would create a list of such class instances by reading a data file
> that describes the circles. Then, having created the list, you would
> compare all the circles to each other to find overlaps, and create some
> sort of result array showing the overlaps.
>
> The difficult part will be deciding what the result means.
Thanks for that! - I know what I want to do with the population
simulation so this helps.
Regards,
Phil.
--
Philip Rhoades
Pricom Pty Limited (ACN 003 252 275 ABN 91 003 252 275)
GPO Box 3411
Sydney NSW 2001
Australia
Mobile: +61:(0)411-185-652
Fax: +61:(0)2-8221-9599
E-mail: phil@pricom.com.au