方格的是一個矩形,需要繼承Rectangle2D類,使用它的靜態內部類Float的原因是它比靜態內部類Double精度小。
人的眼睛或者是計算機的渲染圖形是不會顯示那些計算中很低的位的,所以采用計算Float更快。
package yumu.chaos.lifegame.gui;import java.awt.geom.Rectangle2D;public class LifeRect extends Rectangle2D.Float { public LifeRect(float x, float y, float w, float h) { super(x, y, w, h); }}2.圖形顯示的框架
在構造函數中通過Toolkit獲取了屏幕的寬與高,把窗體顯示在屏幕的中央。
設置窗體的標題和圖標,這里可能是圖片本身的問題,設置了的圖標并沒有顯示在窗體上。
設置窗口關閉的時候退出應用,設置窗口可見。
package yumu.chaos.lifegame.gui;import java.awt.Component;import java.awt.Dimension;import java.awt.Image;import java.awt.Toolkit;import javax.swing.ImageIcon;import javax.swing.JFrame;public class GameFrame extends JFrame { public GameFrame(int width, int height) { Toolkit toolkit = Toolkit.getDefaultToolkit(); Dimension dimension = toolkit.getScreenSize(); int screenWidth = dimension.width; int screenHeight = dimension.height; setTitle("Conway Cellular Automata"); Image image = new ImageIcon("logo-icon.jpg").getImage(); setIconImage(image); setLocation(screenWidth/2 - width/2, screenHeight/2 - height/2); setSize(width + 30, height + 50); setResizable(false); setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } @Override public void remove(Component comp) { if(comp != null) super.remove(comp); }}3.在面板上繪制圖形構造函數中設置了需要繪制的數據,這個數據是從世界的存活細胞圖方法中獲得的。
確定方格的單位寬度和單位高度,存活顯示為黑色,死亡顯示為白色,周圍用淺灰色繪制方格的邊框。
畫筆和畫紙的行為被放置在Graphics2D的對象g2中,這里設置畫筆的顏色設置的是g2的內容。
package yumu.chaos.lifegame.gui;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Paint;import javax.swing.JPanel;public class DrawPanel extends JPanel{ PRivate boolean[][] arr; private int width; private int height; public DrawPanel(boolean[][] arr, int width, int height){ this.arr = arr; this.width = width; this.height = height; } @Override public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; int lenX = arr.length; int lenY = arr[0].length; float unitX = (float)width / lenX; float unitY = (float)height / lenY; for (int x = 0; x < lenX; ++x) { for (int y = 0; y < lenY; ++y) { Paint paint = arr[x][y] ? Color.BLACK : Color.WHITE; LifeRect rect = new LifeRect(unitX * x, unitY * y, unitX, unitY); g2.setPaint(paint); g2.fill(rect); g2.setPaint(Color.LIGHT_GRAY); g2.draw(rect); } } } @Override public Dimension getPreferredSize() { return new Dimension(width, height); }}4.把繪制好圖形的面板放置在框架中畫者默認有自己的一個畫板框架,調用繪制方法時,會把當前的畫板卸下來,并安置好新的畫板。
新的畫板已經預設好了圖像,只是看起來還是一張白紙,最后畫板框架使畫板中的圖像顯示出來。
下次的繪制中會重復,卸下白紙,粘上新白紙,顯示圖像的過程。
package yumu.chaos.lifegame.gui;public class Painter { private static final int DEFAULT_WIDTH = 500; private static final int DEFAULT_HEIGHT = 500; private GameFrame frame; private DrawPanel panel; public Painter() { frame = new GameFrame(DEFAULT_WIDTH, DEFAULT_HEIGHT); } public void paint(boolean[][] arr){ frame.remove(panel); panel = new DrawPanel(arr, DEFAULT_WIDTH, DEFAULT_HEIGHT); frame.add(panel); frame.paintAll(panel.getGraphics()); } }5.夏娃刻下了愛,可世界卻不是培養愛的容器 static int[][] LOVE = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,1,0,1,1,1,0,0,0,1,0,0,1,0}, {0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,1,0}, {0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0}, {0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0}, {0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} };當種子為LOVE時,運行:deus.createWorld(transpose(LOVE));


[混沌,awt和swing繪制平面圖形簡介](http://www.survivalescaperooms.com/kodoyang/p/Chaos_Graphics2D_Awt_Swing.html)
[混沌,細胞自動機與生命游戲](http://www.survivalescaperooms.com/kodoyang/p/Chaos_ConwayCellularAutomata_GameOfLife.html)
本篇是上一篇日志『混沌,細胞自動機與生命游戲』的圖形繪制部分。
請點擊正下方的『關注我』關注我!點擊右下方的推薦圖標推薦這片日志!
本文地址:http://www.survivalescaperooms.com/kodoyang/p/Chaos_ConwayCellularAutomata_GameOfLife_GraphDrawing.html
雨木陽子
2015年8月17日
新聞熱點
疑難解答