Here is my stab at it...
function getGridRing( $r:Number, $c:Number, dist:Number, minRow:Number,
minCol:Number, maxRow:Number, maxCol:Number ):Array
{
// @ $r = start row
// @ $c = start column
// @ dist = destination ring
trace( 'row: ' + $r + ' col: ' + $c + ' ring: ' + dist);
// length of ring
var len = ( dist * 2 ) + 1;
// error check for single point
if ( len <= 1 ) return [{row:$r, col:$c}]; else var array = [];
// return only values in bounds [ optional ]
var inBounds = function ( r, c )
{
if(!isNaN(minRow)) {if ( minRow > r ) return false;}
if(!isNaN(minCol)) {if ( minCol > c ) return false;}
if(!isNaN(maxRow)) {if ( maxRow < r ) return false;}
if(!isNaN(maxCol)) {if ( maxCol < c ) return false;}
return true;
}
// TOP
for ( var i = 0; i < len ; i++ )
{
var c = $c - dist + i
var r = $r - dist;
if( inBounds( r,c )) array.push ({row:r, col:c })
}
// RIGHT
for ( var i = 1; i < len; i++ )
{
var c = $c + dist;
var r = $r - dist + i;
if( inBounds( r,c )) array.push ({row:r, col:c })
}
// BOTTOM
for ( var i = 1; i < len; i++ )
{
var c = $c + dist - i
var r = $r + dist;
if( inBounds( r,c )) array.push ({row:r, col:c })
}
// LEFT
for ( var i = 1; i < len-1; i++ )
{
var c = $c - dist;
var r = $r + dist - i;
if( inBounds( r,c )) array.push ({row:r, col:c })
}
return array;
}
function getGridRings ( r:Number, c:Number, minR:Number, minC:Number,
maxR:Number, maxC:Number ):Array
{
var maxLen = Math.max( Math.max ( Math.abs(maxC-c), Math.abs(minC-c)
), Math.max ( Math.abs(maxR-r), Math.abs(minR-r) ) );
if ( !isNaN(maxLen) )
{
var array = [];
for ( var i = 0; i <= maxLen; i++ )
{
array = array.concat( getGridRing ( r, c, i, minR,
minC, maxR, maxC ) );
}
return array;
}
return [];
}
//
//
// SINGLE RING
//
//
var array = getGridRing ( 2, 2, 0 );
var result = '';
for ( var i in array ) { result = '[' + array[i].col + ',' + array[i].row
+'] ' + result }
trace( result + newline )
// [2,2]
//> [2,2]
var array = getGridRing ( 2, 2, 1 );
var result = '';
for ( var i in array ) { result = '[' + array[i].col + ',' + array[i].row
+'] ' + result }
trace( result + newline )
// [1,1] [2,1] [3,1] [3,2] [3,3] [2,3] [1,3] [1,2]
//> [1,1] [2,1] [3,1]
//> [1,2] [2,2] [3,2]
//> [1,3] [2,3] [3,3]
var array = getGridRing ( 2, 2, 2, 0, 0, 4, 4 );
var result = '';
for ( var i in array ) { result = '[' + array[i].col + ',' + array[i].row
+'] ' + result }
trace( result + newline )
// [0,0] [1,0] [2,0] [3,0] [4,0] [4,1] [4,2] [4,3] [4,4] [3,4] [2,4] [1,4]
[0,4] [0,3] [0,2] [0,1]
//> [0,0] [1,0] [2,0] [3,0] [4,0]
//> [0,1] [1,1] [2,1] [3,1] [4,1]
//> [0,2] [1,2] [2,2] [3,2] [4,2]
//> [0,3] [1,3] [2,3] [3,3] [4,3]
//> [0,4] [1,4] [2,4] [3,4] [4,4]
//
//
// ALL RINGS
//
//
var array = getGridRings ( 2, 2, 0, 0, 4, 4 )
var result = '';
for ( var i in array ) { result = '[' + array[i].col + ',' + array[i].row
+'] ' + result }
trace( result + newline )
// [2,2] [1,1] [2,1] [3,1] [3,2] [3,3] [2,3] [1,3] [1,2] [0,0] [1,0] [2,0]
[3,0] [4,0] [4,1] [4,2] [4,3] [4,4] [3,4] [2,4] [1,4] [0,4] [0,3] [0,2]
[0,1]
var array = getGridRings ( 0, 0, 0, 0, 4, 4 )
var result = '';
for ( var i in array ) { result = '[' + array[i].col + ',' + array[i].row
+'] ' + result }
trace( result + newline )
// [0,0] [1,0] [1,1] [0,1] [2,0] [2,1] [2,2] [1,2] [0,2] [3,0] [3,1] [3,2]
[3,3] [2,3] [1,3] [0,3] [4,0] [4,1] [4,2] [4,3] [4,4] [3,4] [2,4] [1,4]
[0,4]
_____________________________
Jesse Graupmann
www.jessegraupmann.com
www.justgooddesign.com/blog/
_____________________________
-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Jiri
Heitlager | dadata.org
Sent: Saturday, June 16, 2007 5:16 AM
To: [email protected]
Subject: [Flashcoders] Grid / Math - getting neighbouring positions
Hello list,
I have the following grid and would like to find the neighbouring
positions of a certain point, going in a radius from in to out, covering
all the positions.
[0,0] [1,0] [2,0] [3,0] [4,0]
[0,1] [1,1] [2,1] [3,1] [4,1]
[0,2] [1,2] [2,2] [3,2] [4,2]
[0,3] [1,3] [2,3] [3,3] [4,3]
[0,4] [1,4] [2,4] [3,4] [4,4]
Let say I take point [2,2] then its neighbours are in the first ring
[1,1] [2,1] [3,1] [3,2] [3,3] [2,3] [1,3] [1,2]
I manage to get the first ring, but getting the other rings I haven't
got a clue on how to do that.
Can somebody help me?
Thank you,
jiri
_______________________________________________
[email protected]
To change your subscription options or search the archive:
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
Brought to you by Fig Leaf Software
Premier Authorized Adobe Consulting and Training
http://www.figleaf.com
http://training.figleaf.com