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

📄 hexavaluegridportrayal2d.java

📁 MASON代表多主体邻里或网络仿真(Multi-Agent Simulator of Neighborhoods or Networks)。它是乔治梅森大学用Java开发的离散事件多主体仿真核心库
💻 JAVA
字号:
package sim.portrayal.grid;import sim.portrayal.*;import sim.field.grid.*;import java.awt.*;import java.awt.geom.*;import sim.util.*;/**   Portrayal for hexagonal grids (each cell has six equally-distanced neighbors) with double-precision real values.*/public class HexaValueGridPortrayal2D extends ValueGridPortrayal2D    {    int[] xPoints = new int[6];    int[] yPoints = new int[6];    double[] xyC = new double[2];    double[] xyC_ul = new double[2];    double[] xyC_up = new double[2];    double[] xyC_ur = new double[2];        public HexaValueGridPortrayal2D()        {        super();        }    public HexaValueGridPortrayal2D(String valueName)        {        super(valueName);        }    final static void getxyC( final int x, final int y, final double xScale, final double yScale, final double tx, final double ty, final double[] xyC )        {        xyC[0] = tx + xScale * (1.5 * x + 1);        xyC[1] = ty + yScale * (1.0 + 2.0 * y + (x<0?(-x)%2:x%2) );        }    // our object to pass to the portrayal    final MutableDouble valueToPass = new MutableDouble(0);    protected void hitOrDraw(Graphics2D graphics, DrawInfo2D info, Bag putInHere)        {        final Grid2D field = (Grid2D)(this.field);        if (field==null) return;                // first question: determine the range in which we need to draw.        final int maxX = field.getWidth();        final int maxY = field.getHeight();        if (maxX == 0 || maxY == 0) return;        final double divideByX = ((maxX%2==0)?(3.0*maxX/2.0+0.5):(3.0*maxX/2.0+2.0));        final double divideByY = (1.0+2.0*maxY);        final double xScale = info.draw.width / divideByX;        final double yScale = info.draw.height / divideByY;        int startx = (int)(((info.clip.x - info.draw.x)/xScale-0.5)/1.5)-2;        int starty = (int)((info.clip.y - info.draw.y)/(yScale*2.0))-2;        int endx = /*startx +*/ (int)(((info.clip.x - info.draw.x + info.clip.width)/xScale-0.5)/1.5) + 4;  // with rounding, width be as much as 1 off        int endy = /*starty +*/ (int)((info.clip.y - info.draw.y + info.clip.height)/(yScale*2.0)) + 4;  // with rounding, height be as much as 1 off        //        //        // CAUTION!        //        // At some point we should triple check the math for rounding such        // that the margins are drawn properly        //        //                // next we determine if this is a DoubleGrid2D or an IntGrid2D                final Rectangle clip = (graphics==null ? null : graphics.getClipBounds());        final boolean isDoubleGrid2D = (field instanceof DoubleGrid2D);        final double[][] doubleField = (isDoubleGrid2D ? ((DoubleGrid2D) field).field : null);        final int[][] intField = (isDoubleGrid2D ? null : ((IntGrid2D) field).field);        int argb;        if( startx < 0 ) startx = 0;        if( starty < 0 ) starty = 0;        if (endx > maxX) endx = maxX;        if (endy > maxY) endy = maxY;        for(int y=starty;y<endy;y++)            for(int x=startx;x<endx;x++)                {                getxyC( x, y, xScale, yScale, info.draw.x, info.draw.y, xyC );                getxyC( field.ulx(x,y), field.uly(x,y), xScale, yScale, info.draw.x, info.draw.y, xyC_ul );                getxyC( field.upx(x,y), field.upy(x,y), xScale, yScale, info.draw.x, info.draw.y, xyC_up );                getxyC( field.urx(x,y), field.ury(x,y), xScale, yScale, info.draw.x, info.draw.y, xyC_ur );                xPoints[0] = (int)(xyC_ur[0]-0.5*xScale);                yPoints[0] = (int)(xyC_ur[1]+yScale);                xPoints[1] = (int)(xyC_up[0]+0.5*xScale);                yPoints[1] = (int)(xyC_up[1]+yScale);                xPoints[2] = (int)(xyC_up[0]-0.5*xScale);                yPoints[2] = (int)(xyC_up[1]+yScale);                xPoints[3] = (int)(xyC_ul[0]+0.5*xScale);                yPoints[3] = (int)(xyC_ul[1]+yScale);                xPoints[4] = (int)(xyC[0]-0.5*xScale);                yPoints[4] = (int)(xyC[1]+yScale);                xPoints[5] = (int)(xyC[0]+0.5*xScale);                yPoints[5] = (int)(xyC[1]+yScale);                                    if (graphics == null)                    {                    generalPath.reset();                    generalPath.moveTo( xPoints[0], yPoints[0] );                    for( int i = 1 ; i < 6 ; i++ )                        generalPath.lineTo( xPoints[i], yPoints[i] );                    generalPath.closePath();                    Area area = new Area( generalPath );                    if( area.intersects( info.clip.x, info.clip.y, info.clip.width, info.clip.height ) )                        {                        valueToPass.val = isDoubleGrid2D ?  doubleField[x][y] : intField[x][y];                        putInHere.add( getWrapper(valueToPass.val, x, y) );                        }                    }                else                    {                    Color c = map.getColor(isDoubleGrid2D ?  doubleField[x][y] : intField[x][y]);                    if (c.getAlpha() == 0) continue;                    graphics.setColor(c);                                        // MacOS X 10.3 Panther has a bug which resets the clip, YUCK                    //                    graphics.setClip(clip);                    graphics.fillPolygon(xPoints,yPoints,6);                    }                }                }    GeneralPath generalPath = new GeneralPath();    }

⌨️ 快捷键说明

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