Java graphics2D;切换我有的形状对象周围的绘画顺序?

时间:2013-07-30 00:26:04

标签: java colors applet graphics2d cube

我只是在弄乱多边形和东西,并决定尝试制作我自己的可旋转立方体,我决定通过在每个“多边形”上生成6个不同的边,每个“8”顶点有8个顶点。 (只是一个可以倾斜以适应立方体视角的正方形 - 我没有找到任何像LWJGL或其他任何方式的“四边形”方法)我知道这可能不是最好的方法,因为我遇到了问题;油漆订单。我知道有一个“顺序”,当它们沿着代码逐行下去的时候会画出一些东西,但是看看我的代码是否有任何方式你认为我可能能够改变顺序而不能获得这种效果当我渲染我的“立方体”时:

http://i.stack.imgur.com/3MdT2.png

我用不同的颜色为每一面着色,你可以看到它的结果非常糟糕。通常情况下,如果我要渲染一个无法移动的2D立方体,我会制作油漆顺序以便不会发生这种情况,但是因为我想旋转并移动它我会说这样做会毫无意义。

这是我的代码,非常感谢任何帮助,谢谢! (忽略我正在使用applet执行此操作的事实,我只是在测试......)

package advanced;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

public class rotatingCube extends Applet implements Runnable {

private static final long serialVersionUID = -5353063756246119245L;

    int[][] vertex = {
            { 50, 50 }, { 100, 50 }, { 100, 100 }, { 50, 100 }, 
            { 75, 75 }, { 125, 75 }, { 125, 125 }, { 75, 125 }
    };

    int[]   Xpoly1={ vertex[0][0], vertex[1][0], vertex[2][0], vertex[3][0] },
            Ypoly1={ vertex[0][1], vertex[1][1], vertex[2][1], vertex[3][1] },

            Xpoly2={ vertex[4][0], vertex[5][0], vertex[6][0], vertex[7][0] },
            Ypoly2={ vertex[4][1], vertex[5][1], vertex[6][1], vertex[7][1] },

            Xpoly3={ vertex[5][0], vertex[1][0], vertex[2][0], vertex[6][0] },
            Ypoly3={ vertex[5][1], vertex[1][1], vertex[2][1], vertex[6][1] },

            Xpoly4={ vertex[4][0], vertex[0][0], vertex[3][0], vertex[7][0] },
            Ypoly4={ vertex[4][1], vertex[0][1], vertex[3][1], vertex[7][1] },

            Xpoly5={ vertex[3][0], vertex[2][0], vertex[6][0], vertex[7][0] },
            Ypoly5={ vertex[3][1], vertex[2][1], vertex[6][1], vertex[7][1] },

            Xpoly6={ vertex[0][0], vertex[1][0], vertex[5][0], vertex[4][0] },
            Ypoly6={ vertex[0][1], vertex[1][1], vertex[5][1], vertex[4][1] };

public void start() {
    setSize(500, 500);
    new Thread(this).start();
}

public void run() {

}

public void paint(Graphics e) {
    Graphics2D g = (Graphics2D) e;

    g.setColor(Color.RED);
    g.fillPolygon(Xpoly1, Ypoly1, 4);
    g.setColor(Color.GREEN);
    g.fillPolygon(Xpoly2, Ypoly2, 4);
    g.setColor(Color.BLUE);
    g.fillPolygon(Xpoly3, Ypoly3, 4);
    g.setColor(Color.YELLOW);
    g.fillPolygon(Xpoly4, Ypoly4, 4);
    g.setColor(Color.ORANGE);
    g.fillPolygon(Xpoly5, Ypoly5, 4);
    g.setColor(Color.PINK);
    g.fillPolygon(Xpoly6, Ypoly6, 4);
}
}

2 个答案:

答案 0 :(得分:1)

这是用于分析参考的方式:

public void paint(Graphics e) {
    Graphics2D g = (Graphics2D) e;

    // red blue and orange are all hidden behind the other faces so you don't draw them
    // but if you did you just need to draw them first and the order doesn't matter
    // since they don't overlap
    //g.setColor(Color.RED);
    //g.fillPolygon(Xpoly1, Ypoly1, 4);
    //g.setColor(Color.BLUE);
    //g.fillPolygon(Xpoly3, Ypoly3, 4);
    //g.setColor(Color.ORANGE);
    //g.fillPolygon(Xpoly5, Ypoly5, 4);

    // since these three don't overlap you can draw them in any order as well.
    g.setColor(Color.PINK);
    g.fillPolygon(Xpoly6, Ypoly6, 4);
    g.setColor(Color.YELLOW);
    g.fillPolygon(Xpoly4, Ypoly4, 4);
    g.setColor(Color.GREEN);
    g.fillPolygon(Xpoly2, Ypoly2, 4);
}

无论如何,这是你想要发生的事情吗?

你为立方体制作顶点的方式还不足以弄清楚如何做到这一点。 你需要提供3d坐标。

所以喜欢

int[][][] vertex = {
            { 0, 0, 0 }, { 100, 0, 0 }, { 100, 100, 0 }, { 0, 100, 0 }, 
            { 100, 100, 100}, { 0, 100, 100}, { 0, 0, 100}, { 100, 0, 100 }
    };

然后用你知道的数学旋转它。现在,如果您使用等轴测视图,您可以轻松找到将显示哪些面,因为如果您可以识别哪三个面具有相同的角,则可见的三个面将具有最大的z值(朝向您从屏幕向外)可以画它们。

您遇到的一件事是,如果有两个点(意味着它只在一个轴上旋转),两个点将具有最高的z值。那么你只需绘制这两个点共享的面孔。

最后一种情况是,如果4个点共享相同的最大z值,则具有这四个点的面将是唯一需要绘制的面。

编辑:忘了制作数组3维

答案 1 :(得分:1)

在没有提供所有代码的情况下,此类事情的一般算法是

  1. 将每个多边形(最好是三角形,但可以是四边形)表示为某种对象,包括坐标索引和颜色
  2. 将所有多边形存储在数组中
  3. 按照它们的 z-ordering (即与相机平面的距离)按照从前到后的顺序对数组进行排序。通常,您使用每个多边形的质心(在变换的三维坐标中)或仅使用最近的z值顶点的位置。
  4. 编写一个简单的循环,按顺序从数组中绘制每个多边形。
  5. 这被称为“画家的算法”,它对于由近等边三角形构成的实体非常有效。一旦你进入高度锐角的三角形(长尖的三角形),就不可能进行有意义的z次序排序,并且你会得到视觉伪像,因为重叠是错误的。但对于一个立方体,如果用两个45-45-90三角形表示每个四边形,它的效果非常好。