2011-08-10 34 views
2

我有一个输入大脑图像的代码,我想知道如何使用第三个轴,即z轴(远近轴),以便我可以将图像朝上放置(不面向用户),以便图像轮廓可见。如何使用z轴?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.awt.geom.*; 
import java.applet.*; 
import java.net.URL; 

public class Brain extends JComponent { 

    static int x = 200; 
    static int y = 200; 
    static int currentAngle = 0; 
    static double hspeed, vspeed; 
    static int speed = 0; 
    double hangle, vangle; 
    Image brain; 

    Image getImage(String filename) { 
     URL url = getClass().getResource(filename); 
     ImageIcon icon = new ImageIcon(url); 
     return icon.getImage(); 
    } 

    public Brain() { 
     brain = getImage("brainz.png"); 
    } 

    public void CreateBase() { 
     JFrame frame = new JFrame("BRAIN"); 
     frame.setBounds(70, 30, 650, 500); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container c = frame.getContentPane(); 
     c.add(new Brain()); 
     frame.addKeyListener(new adapter()); 
     c.setBackground(Color.BLACK); 
    } 

    public void rotate() { 
     currentAngle += 1; 
     if (currentAngle >= 360) { 
      currentAngle = 0; 
     } 
     repaint(); 
    } 

    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     AffineTransform origXform = g2d.getTransform(); 
     AffineTransform newXform = (AffineTransform) (origXform.clone()); 
     newXform.rotate(Math.toRadians(currentAngle), x, y); 
     g2d.setTransform(newXform); 
     g2d.drawImage(brain, x, y, this); 
     g2d.setTransform(origXform); 
     repaint(); 
    } 

    class adapter extends KeyAdapter { 

     public void keyPressed(KeyEvent e) { 

      switch (e.getKeyCode()) { 
       case KeyEvent.VK_LEFT: 
        currentAngle--; 
        repaint(); 
        break; 
       case KeyEvent.VK_RIGHT: 
        currentAngle++; 
        repaint(); 
        break; 
       case KeyEvent.VK_UP: 
        speed++; 
        hangle = Math.toRadians(currentAngle); 
        vangle = Math.toRadians(currentAngle); 
        hspeed = ((double) speed) * Math.cos(hangle); 
        vspeed = ((double) speed) * Math.sin(vangle); 
        x = x - (int) hspeed; 
        y = y - (int) vspeed; 
        repaint(); 
        break; 
       case KeyEvent.VK_DOWN: 
        speed--; 
        hangle = Math.toRadians(currentAngle); 
        vangle = Math.toRadians(currentAngle); 
        hspeed = ((double) speed) * Math.cos(hangle); 
        vspeed = ((double) speed) * Math.sin(vangle); 
        x = x + (int) hspeed; 
        y = y + (int) vspeed; 
        repaint(); 
        break; 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Brain br = new Brain(); 
     br.CreateBase(); 
     //br.setDoubleBuffered(true); 
    } 
} 

回答

3
+0

感谢您的帮助,通过使用分层窗格,我可以叠加图像一个上另一个顶部,但如果我想看到堆叠起来的100个图像的轮廓,那么该怎么办呢?即这些图像的顶视图.. – Riz

+0

@Riz,也许你应该查看[Java 3D API](http:// www。 oracle.com/technetwork/java/javase/tech/index-jsp-138252.html)? – mre

+0

我已经尝试过使用Java 3D API,但由于硬件限制,无法在我的当前PC上运行它,我尝试使用JOGL,但由于知识较少,我似乎无法在那里使用z轴,我试过从这里的程序http://wiki.tankaar.com/index.php?title=Displaying_an_Image_in_JOGL_%28Part_1%29 – Riz

2

正如@mre表示,3D API做你所需要的。

但要回答更接近您的原始代码,您的向上图像看起来像这样,对吧?

.    ------ 
.   / \ 
.   /  \ 
.  /  \ 
.   ------------ 

那么这是一个梯形,可以使用透视变换来计算。它不属于您使用的AffineTransforms类。矩阵看起来是这样的:

r = [ 1 -x/c ] . r0 
     [ 0  1 ] 

Java高级图像API具有与变换,你需要:javax.media.jai.PerspectiveTransform

http://download.oracle.com/docs/cd/E17802_01/products/products/java-media/jai/forDevelopers/jai-apidocs/javax/media/jai/PerspectiveTransform.html

+0

谢谢,我会尝试在Java 3D中.. :-) – Riz

+0

酷,这个解决方案将工作,如果你可以不使用Java3D –