//---------------------------------------------------------------------- // ナンバーエリア(四角に切れ) // // Copyright(C) 1996 Hirofumi Fujiwara // 本プログラムは、改造も含め、その商用利用は禁止します。 //---------------------------------------------------------------------- import java.awt.*; import java.applet.*; import java.lang.*; import java.io.*; import java.util.*; import java.net.*; public class NumberArea extends Applet { final int XLIM = 30; final int YLIM = 30; final int VERTEX_POS = 1; final int EDGE_POS = 2; final int FACE_POS = 3; final int DRAG_START = 4; final int DRAGGING = 5; final int DRAG_END = 6; static Dimension app_size; // アプレットのサイズ static int xn, yn, unit, wd; // サイズ、マズサイズ、線幅 static int bd_off; // 盤のボーダーオフセット // 領域面積:初期化時に、数値の与えられた個所にだけ面積が入り、他は0 public int areanum[][]; // 領域識別番号:初期化時に、数字のある個所だけ識別番号が入り、他は0 public int areaid[][]; // 領域所属番号:初期化時に、全て0。+は確定領域、−は部分領域 public int belongto[][]; public int ansid[][]; public Area areainfo[]; public int areacount; int updatetype = 0; Point mixPosition; Point dragStart, dragEnd, dragNew; Point pivot; // 有効領域のときの数値の書かれている位置 int pivotId; int invalidlist[][] = new int[XLIM*YLIM][2]; int invalidcount; final Color backcolor = Color.white; final Color guidecolor = new Color( 0xcf, 0xcf, 0xcf ); final Color echocolor = Color.cyan; final Color fixedcolor = new Color( 0x3f, 0xaf, 0x3f ); final Color subcolor = new Color( 0xdf, 0xaf, 0x5f ); Font areafont; public void init() { String filename = getParameter( "problemfile" ); loadData( filename ); app_size = this.size(); unit = (int)(app_size.width*0.92)/xn; wd = (unit+40)/20; setLayout( new BorderLayout() ); setBackground( Color.white ); bd_off = ( app_size.width - unit * xn ) / 2; Label copyright = new Label("Number Area V0.12" + " " + "Copyright(C)1996 Hirofumi Fujiwara.", Label.CENTER ); add( "South", copyright ); // copyright.reshape( 0, app_size.height-22, app_size.width, 20 ); } //---------------------------------------------------------------- // ボードの配列を確保する void newBoard() { areanum = new int[xn][yn]; areaid = new int[xn][yn]; ansid = new int[xn][yn]; belongto = new int[xn][yn]; } //---------------------------------------------------------------- // 領域で長方形データの配列を確保し、初期化する void newArea() { areacount = 0; for( int x=0; x ex ) { int w=sx; sx=ex; ex=w; } if( sy > ey ) { int w=sy; sy=ey; ey=w; } g.setColor( guidecolor ); g.fillRect( toPos(sx)+wd, toPos(sy)+wd, (ex-sx+1)*unit-wd, (ey-sy+1)*unit-wd ); g.setColor( c ); for( int i=sx; i<=ex; ++i ) for( int j=sy; j<=ey; ++j ) paintFace( g, new Point( i, j ), c ); } void drawNumber( Graphics g, int x, int y, int v ) { if( v == 0 ) return; if( areafont == (Font)null ) { areafont = new java.awt.Font( "Helvetica", 0, unit*8/10 ); } g.setColor( Color.black ); g.setFont( areafont ); String s = String.valueOf(v); FontMetrics fm = g.getFontMetrics(); int sWidth = fm.stringWidth(s); int sHeight = fm.getHeight(); int sAscent = fm. getAscent(); g.drawString( s, toXPos(x)+(unit-sWidth)/2, toXPos(y)+(unit+sAscent)/2-1 ); } //---------------------------------------------------------------- // マウス・ダウン public boolean mouseDown( Event evt, int x, int y ) { Point p = boxPos( x, y ); if( isInside( p ) ) { dragStart = dragEnd = dragNew = p; updatetype = DRAG_START; repaint(); } return true; } //---------------------------------------------------------------- // マウス・ドラッグ public boolean mouseDrag( Event evt, int x, int y ) { Point bp = dragNew = boxPos( x, y ); if( ! (updatetype == DRAG_START || updatetype == DRAGGING ) ) return true; if( ! isInside( bp ) ) return true; if( dragEnd.x == bp.x && dragEnd.y == bp.y ) return true; updatetype = DRAGGING; repaint(); return true; } //---------------------------------------------------------------- // マウス・アップ public boolean mouseUp( Event evt, int x, int y ) { if( updatetype == DRAG_START || updatetype == DRAGGING ) { updatetype = DRAG_END; repaint(); } else { updatetype = 0; } return true; } //---------------------------------------------------------------- // アップデイト public void update( Graphics g ) { switch( updatetype ) { case DRAG_START: paintFace( g, dragStart, echocolor ); fillId( g, dragStart, dragStart ); break; case DRAGGING: fillId( g, dragStart, dragEnd ); paintFace( g, dragStart, dragEnd, backcolor ); dragEnd = dragNew; fillId( g, dragStart, dragEnd ); paintFace( g, dragStart, dragEnd, echocolor ); break; case DRAG_END: checkValidityUpdate( g ); updatetype = 0; } } //---------------------------------------------------------------- // ペイント public void paint( Graphics g ) { g.setColor( backcolor ); g.fillRect( 0, 0, app_size.width, app_size.height ); g.setColor( guidecolor ); int vl = yn*unit+wd; for( int i=0; i<=xn; ++i ) { g.fillRect( toPos(i), toPos(0), wd, vl ); } int hl = xn*unit+wd; for( int j=0; j<=yn; ++j ) { g.fillRect( toPos(0), toPos(j), hl, wd ); } paintFixEdge( g ); paintFace( g, new Point(0,0), new Point(xn-1,yn-1), backcolor ); for( int i=1; i