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: flashcoders@chattyfig.figleaf.com 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 _______________________________________________ Flashcoders@chattyfig.figleaf.com 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