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

Reply via email to