2012-11-04 24 views
0

我有一个assigment,我需要动画一个3d立方体绘制与逐一连接形成立方体的线条。之后,立方体的每一面都需要用不同的颜色着色,一旦每个着色,暂停,然后着色下一侧。java GUI三维立方体在所有侧面着色

我该如何去做这件事?我提供我的代码,我在后台广场上尽量填充立方体作出后,但我得到了以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds! 
    at sun.awt.image.IntegerInterleavedRaster.getDataElements(IntegerInterleavedRaster.java:203) 
    at java.awt.image.BufferedImage.getRGB(BufferedImage.java:881) 
    at drawCube.floodFill(drawCube.java:50) 
    at drawCube.main(drawCube.java:181) 

这里是我的代码,让我知道什么是最好的方式做,这将是。

import java.awt.image.BufferedImage; 
import javax.swing.JLabel; 
import javax.swing.ImageIcon; 
import java.awt.Point; 

class drawCube 
{ 
    static void fillImage(BufferedImage image, int red, int green, int blue) 
{ 
int packedRGB = packRgb(255,255,255);//white 

for (int y=0;y<image.getHeight(null);y++) 
{ 
    for (int x=0;x<image.getWidth(null);x++) 
    image.setRGB(x,y,packedRGB); 
} 
} 

public static void floodFill(BufferedImage image, int x,int y, int fillColor) 
{ 
java.util.ArrayList<Point> examList=new java.util.ArrayList<Point>(); 

int initialColor=image.getRGB(x,y); 
examList.add(new Point(x,y)); 

while (examList.size()>0) 
{ 
    Point p = examList.remove(0); // get and remove the first point in the list 
    if (image.getRGB(p.x,p.y)==initialColor) 
    { 
    x = p.x; y = p.y; 
    image.setRGB(x, y, fillColor); // fill current pixel 

    examList.add(new Point(x-1,y));  // check west neighbor 
    examList.add(new Point(x+1,y));  // check east neighbor 
    examList.add(new Point(x,y-1));  // check north neighbor 
    examList.add(new Point(x,y+1));  // check south neighbor 

    // waitNS(1); // delay to see floodFill() work 
    // repaintImage(image); 

    } 
} 
} 

private static void repaintImage(BufferedImage image) 
{ 
_imageLabel.setIcon(new ImageIcon(image)); 
_imageLabel.repaint(); 
} 

public static void waitNS(long ns) 
{ 
try { Thread.sleep(ns); } // Pause ns 
    catch (Exception ignore) { ; } 
} 

public static int packRgb(int r,int g,int b) 
{ 
return (r*256+g)*256+b; 
} 

static JLabel _imageLabel; 
public static void main(String[] args) throws Exception 
{ 
// create an 300x300 RGB image 
BufferedImage image=new BufferedImage(300,300,BufferedImage.TYPE_INT_RGB); 

// fill the image with green color 
fillImage(image,0,255,0);   

JLabel imageLabel=new JLabel(); 
_imageLabel = imageLabel; // make it global 
imageLabel.setIcon(new ImageIcon(image)); 
imageLabel.setText("Filling the box with yellow color ..."); 

javax.swing.JFrame window=new javax.swing.JFrame(); 
window.setTitle("Cube Experiment"); 
window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

window.add(imageLabel); 

window.pack(); 
window.setVisible(true); 

java.awt.Graphics2D gr=(java.awt.Graphics2D) image.getGraphics(); 

int x1 = 50; int y1 = 150; 
int x2 = 150; int y2 = 150; 
int x3 = 150; int y3 = 250; 
int x4 = 50; int y4 = 250; 

gr.setColor(new java.awt.Color(0,0,0)); // blue 
gr.setStroke(new java.awt.BasicStroke(2)); // set pen width to 2 pixels 

gr.drawLine(50, 150, 150, 150); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(150, 150, 150, 250); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(150, 250, 50, 250); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(50, 250, 50, 150); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(0, 300, 100, 300); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(0, 300, 50, 250); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(100, 300, 150, 250); 
repaintImage(image); 
waitNS(500); 


gr.drawLine(100, 300, 100, 200); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(0, 285, 0, 200); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(0, 200, 100, 200); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(0, 200, 50, 150); 
repaintImage(image); 
waitNS(500); 

gr.drawLine(100, 200, 150, 150); 
repaintImage(image); 
waitNS(500); 

// fill the square with yellow color 
int yellow = packRgb(255,255,0); 
int black = packRgb(0,0,0); 
//floodFill(image,(x1+x2)/2, (y1+y4)/2, yellow);//flood fill at center 

imageLabel.setIcon(new ImageIcon(image)); 
imageLabel.setText("Completed !"); 

} 
} 

回答

2



有两个问题在这里:在ArrayIndexOutOfBoundsException异常和不幸的巧合。

您的泛洪方法包括一个循环,它可以从前一个测试点的每个方向生成点,但不会说何时停止。其结果是可以在300x300区域外生成一个点,当调用image.getRGB(int,int)时抛出一个异常。
在对元素进行循环操作时,记住数组的限制通常是个好主意。例如:

if(x-1>0) examList.add(new Point(x-1,y)); // check west neighbour 
if(x+1<300) examList.add(new Point(x+1,y)); // check east neighbour 
if(y-1>0) examList.add(new Point(x,y-1)); // check north neighbour 
if(y+1<300) examList.add(new Point(x,y+1)); // check south neighbour 

或者更少的正是:

if (p.x>0 && p.y>0 && p.x<300 && p.y<300 && image.getRGB(p.x,p.y)==initialColor) 

另外,点开始的洪水从发生到趴在立方体的结构线之一,所以线条都充满代替空间。选择起点时要小心。

floodFill(image, 60, 160, java.awt.Color.yellow.hashCode()); 

应该工作。

希望这会有所帮助。

+0

谢谢你的帮助。现在我得到了一切工作。 – user1729967