⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractgrid3d.java

📁 MASON代表多主体邻里或网络仿真(Multi-Agent Simulator of Neighborhoods or Networks)。它是乔治梅森大学用Java开发的离散事件多主体仿真核心库
💻 JAVA
字号:
package sim.field.grid;import sim.util.IntBag;/**   A concrete implementation of the Grid3D methods; used by several subclasses.   Note that you should avoid calling these methods from an object of type Grid3D; instead   try to call them from something more concrete (AbstractGrid3D or SparseGrid3D).     Otherwise they will not get inlined.  For example,   <pre><tt>   Grid3D foo = ... ;   foo.tx(4);  // will not get inlined   AbstractGrid3D bar = ...;   bar.tx(4);  // WILL get inlined   </tt></pre>*/public abstract class AbstractGrid3D implements Grid3D    {    // this should never change except via setTo    protected int width;    // this should never change except via setTo    protected int height;    // this should never change except via setTo    protected int length;    public final int getWidth() { return width; }        public final int getHeight() { return height; }        public final int getLength() { return length; }        public final int tx(final int x)         {         final int width = this.width;         if (x >= 0) return (x % width);         final int width2 = (x % width) + width;         if (width2 < width) return width2;        return 0;        }        public final int ty(final int y)         {         final int height = this.height;         if (y >= 0) return (y % height);         final int height2 = (y % height) + height;        if (height2 < height) return height2;        return 0;        }            public final int tz(final int z)         {         final int length = this.length;         if (z >= 0) return (z % length);         final int length2 = (z % length) + length;        if (length2 < length) return length2;        return 0;        }    public final int stx(final int x)         { if (x >= 0) { if (x < width) return x; return x - width; } return x + width; }        public final int sty(final int y)         { if (y >= 0) { if (y < height) return y ; return y - height; } return y + height; }    public final int stz(final int z)         { if (z >= 0) { if (z < length) return z ; return z - length; } return z + length; }    /*     * Gets all neighbors of a location that satisfy max( abs(x-X) , abs(y-Y), abs(z-Z) ) <= d     * Returns the x, y and z positions of the neighbors.     */    public void getNeighborsMaxDistance( final int x, final int y, final int z, final int dist, final boolean toroidal, IntBag xPos, IntBag yPos, IntBag zPos )        {        // won't work for negative distances        if( dist < 0 )            {            throw new RuntimeException( "Runtime exception in method getNeighborsMaxDistance: Distance must be positive" );            }        if( xPos == null || yPos == null || zPos == null )            {            throw new RuntimeException( "Runtime exception in method getNeighborsMaxDistance: xPos and yPos should not be null" );            }        xPos.clear();        yPos.clear();        zPos.clear();        // for toroidal environments the code will be different because of wrapping arround        if( toroidal )            {            // compute xmin and xmax for the neighborhood            final int xmin = x - dist;            final int xmax = x + dist;            // compute ymin and ymax for the neighborhood            final int ymin = y - dist;            final int ymax = y + dist;                                    final int zmin = z - dist;            final int zmax = z + dist;                                    for( int x0 = xmin; x0 <= xmax ; x0++ )                {                final int x_0 = stx(x0);                for( int y0 = ymin ; y0 <= ymax ; y0++ )                    {                    final int y_0 = sty(y0);                    for( int z0 = zmin ; z0 <= zmax ; z0++ )                        {                        final int z_0 = stz(z0);                        if( x_0 != x || y_0 != y || z_0 != z )                            {                            xPos.add( x_0 );                            yPos.add( y_0 );                            zPos.add( z_0 );                            }                        }                    }                }            }        else // not toroidal            {            // compute xmin and xmax for the neighborhood such that they are within boundaries            final int xmin = ((x-dist>=0)?x-dist:0);            final int xmax =((x+dist<=width-1)?x+dist:width-1);            // compute ymin and ymax for the neighborhood such that they are within boundaries            final int ymin = ((y-dist>=0)?y-dist:0);            final int ymax = ((y+dist<=height-1)?y+dist:height-1);                                    final int zmin = ((z-dist>=0)?z-dist:0);            final int zmax = ((z+dist<=length-1)?z+dist:length-1);                                    for( int x0 = xmin ; x0 <= xmax ; x0++ )                {                for( int y0 = ymin ; y0 <= ymax ; y0++ )                    {                    for( int z0 = zmin ; z0 <= zmax ; z0++ )                        {                        if( x0 != x || y0 != y || z0 != z )                            {                            xPos.add( x0 );                            yPos.add( y0 );                            zPos.add( z0 );                            }                        }                    }                }            }        }    /*     * Gets all neighbors of a location that satisfy abs(x-X) + abs(y-Y) + abs(z-Z) <= d     * Returns the x, y and z positions of the neighbors.     */    public void getNeighborsHamiltonianDistance( final int x, final int y, final int z, final int dist, final boolean toroidal, IntBag xPos, IntBag yPos, IntBag zPos )        {        // won't work for negative distances        if( dist < 0 )            {            throw new RuntimeException( "Runtime exception in method getNeighborsHamiltonianDistance: Distance must be positive" );            }        if( xPos == null || yPos == null || zPos == null )            {            throw new RuntimeException( "Runtime exception in method getNeighborsHamiltonianDistance: xPos and yPos should not be null" );            }        xPos.clear();        yPos.clear();        zPos.clear();        // for toroidal environments the code will be different because of wrapping arround        if( toroidal )            {            // compute xmin and xmax for the neighborhood            final int xmax = x+dist;            final int xmin = x-dist;            for( int x0 = xmin; x0 <= xmax ; x0++ )                {                final int x_0 = stx(x0);                // compute ymin and ymax for the neighborhood; they depend on the curreny x0 value                final int ymax = y+(dist-((x0-x>=0)?x0-x:x-x0));                final int ymin = y-(dist-((x0-x>=0)?x0-x:x-x0));                for( int y0 =  ymin; y0 <= ymax; y0++ )                    {                    final int y_0 = sty(y0);                    final int zmax = z+(dist-((x0-x>=0)?x0-x:x-x0)-((y0-y>=0)?y0-y:y-y0));                    final int zmin = z-(dist-((x0-x>=0)?x0-x:x-x0)-((y0-y>=0)?y0-y:y-y0));                    for( int z0 = zmin; z0 <= zmax; z0++ )                        {                        final int z_0 = stz(z0);                        if( x_0 != x || y_0 != y || z_0 != z )                            {                            xPos.add( x_0 );                            yPos.add( y_0 );                            zPos.add( z_0 );                            }                        }                    }                }            }        else // not toroidal            {            // compute xmin and xmax for the neighborhood such that they are within boundaries            final int xmax = ((x+dist<=width-1)?x+dist:width-1);            final int xmin = ((x-dist>=0)?x-dist:0);            for( int x0 = xmin ; x0 <= xmax ; x0++ )                {                final int x_0 = x0;                // compute ymin and ymax for the neighborhood such that they are within boundaries                // they depend on the curreny x0 value                final int ymax = ((y+(dist-((x0-x>=0)?x0-x:x-x0))<=height-1)?y+(dist-((x0-x>=0)?x0-x:x-x0)):height-1);                final int ymin = ((y-(dist-((x0-x>=0)?x0-x:x-x0))>=0)?y-(dist-((x0-x>=0)?x0-x:x-x0)):0);                for( int y0 =  ymin; y0 <= ymax; y0++ )                    {                    final int y_0 = y0;                    final int zmin = ((z-(dist-((x0-x>=0)?x0-x:x-x0)-((y0-y>=0)?y0-y:y-y0))>=0)?z-(dist-((x0-x>=0)?x0-x:x-x0)-((y0-y>=0)?y0-y:y-y0)):0);                    final int zmax = ((z+(dist-((x0-x>=0)?x0-x:x-x0)-((y0-y>=0)?y0-y:y-y0))<=length-1)?z+(dist-((x0-x>=0)?x0-x:x-x0)-((y0-y>=0)?y0-y:y-y0)):length-1) ;                    for( int z0 = zmin; z0 <= zmax; z0++ )                        {                        final int z_0 = z0;                        if( x_0 != x || y_0 != y || z_0 != z )                            {                            xPos.add( x_0 );                            yPos.add( y_0 );                            zPos.add( z_0 );                            }                        }                    }                }            }        }    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -