[Tutor] Find Integer co-ordinates lying on a circle
Dave Angel
davea at ieee.org
Sun Nov 15 03:59:40 CET 2009
Shashwat Anand wrote:
> How to find all possible integer co-ordinates lying on a circle of given
> radius 'r'.
> If given the upper bound of 'r', I want to calculate all given co-ordinates
> lying for 0 <= r <= n
>
> Let's say the upper bound of radius is 5
> All possible results are:
> radius 'r' - (x, y)
> 0 - (0, 0)
> 1 - (1, 0), (0, 1), (-1, 0), (0, -1)
> 2 - (2, 0), (0, 2), (-2, 0), (0, -2)
> 3 - (3, 0), (0, 3), (-3, 0), (0, -3)
> 4 - (4, 0), (0, 4), (-4, 0), (0, -4)
> 5 - (5, 0), (0, 5), (-5, 0), (0, -5), (3, 4), (4,3), (3, -4), (4, -3), (-3,
> 4), (-4, 3), (-3, -4), (-4, -3)
>
> Also for a particular radius, lots of possible combination of (x, y) is
> possible so best datastructure could be defaultdict for further operations
> IMHO.
> So my desired output is:
> defaultdict(<type 'list'>, {0 : [(0, 0)], 1: [(1, 0), (0, 1), (-1, 0), (0,
> -1)], 2: [(2, 0), (0, 2), (-2, 0), (0, -2)], 3: [(3, 0), (0, 3), (-3, 0),
> (0, -3)], 4: [(4, 0), (0, 4), (-4, 0), (0, -4)], 5: [(5, 0), (0, 5), (-5,
> 0), (0, -5), (3, 4), (4,3), (3, -4), (4, -3), (-3, 4), (-4, 3), (-3, -4),
> (-4, -3)]})
>
> My approach using pythagorean triplets:
>
>>>> d = collections.defaultdict(list)
>>>> s = list(set([((u*u + v*v), (v*v - u*u, 2*u*v)) for u in range(10) for v
>>>>
> in range(u+1, 10)]))
>
>>>> [d[k].append(v) for k,v in s]
>>>>
> However it sure is wrong and fails in my case.
>
> Any suggestions as to how can I reach my desired goal, or are there any
> other options to tackle this problem?
>
>
Your "all possible results" isn't even close to all the points that
match the 0<= r <= 5. And I don't know how either spec justifies the
set logic you quoted.
So I have to start over. I think you're trying to find all integer
co-ordinates which lie on or within a circle of given radius (sample 5).
Taking only the first quadrant to keep the number of values smaller, I see:
( 0 , 0 ) ( 0 , 1 ) ( 0 , 2 ) ( 0 , 3 ) ( 0 , 4 ) ( 0 , 5 )
( 1 , 0 ) ( 1 , 1 ) ( 1 , 2 ) ( 1 , 3 ) ( 1 , 4 )
( 2 , 0 ) ( 2 , 1 ) ( 2 , 2 ) ( 2 , 3 ) ( 2 , 4 )
( 3 , 0 ) ( 3 , 1 ) ( 3 , 2 ) ( 3 , 3 ) ( 3 , 4 )
( 4 , 0 ) ( 4 , 1 ) ( 4 , 2 ) ( 4 , 3 )
( 5 , 0 )
To find them, just write a doubly nested loop, each with range from
-radius to radius, checking x*x + y*y <= radius*radius. Add to the
result set, each value that meets the comparison.
There are some optimizations you can do, but first get it working in the
form you want.
DaveA
More information about the Tutor
mailing list