0

我正在尝试使图像中像素的位置(int i,int j)确定该像素的颜色。这是针对 java2d 游戏中的爆炸效果我想通过使爆炸的颜色取决于爆炸的位置来变得更加酷。我目前正在做的是创建一种ArrayList颜色,然后i*j用作索引,在 1000x1000 图像上测试它会显示沿对角线的镜像,自然是因为i*j = j*i围绕对角线如下所示。

知道这i=0, j=999是第 1000 个像素,而i=999, j=0第 999001 个像素是如何在f(i,j) != f(j,i)不先将颜色存储在列表中的情况下获得像素到颜色的映射?颜色排序非常重要,也就是说颜色是使用R,0,0then构造的0,G,00,0,B

问题显然不清楚。注意getAllColors,它按顺序创建颜色并将它们添加到列表中,注意g2d.setColor(i*j),它按顺序设置颜色,除了它沿对角线镜像。我想知道是否可以将颜色映射到索引(按顺序)而不将其存储在列表中,同时避免沿对角线镜像。

完整的 MCVE

public class AllColors extends JPanel {

private int width, height;
private double colorIncrement;
private List<Color> colors;

public AllColors(int width, int height) {
    this.width = width;
    this.height = height;
    this.colorIncrement = 1.0 / Math.pow(1.0 * width * height, 1.0 / 3);
    this.colors = new ArrayList<>(width * height);
    getAllColors();
}

@Override
@Transient
public Color getBackground() {
    return Color.black;
}

@Override
@Transient
public Dimension getPreferredSize() {
    return new Dimension(width, height);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            // Notice i*j= j*i around diagonal, the problem
            g2d.setColor(colors.get(i * j));
            g2d.fillRect(i, j, 1, 1);
        }
    }
}

private void getAllColors() {
    for (float R = 0; R < 1.0; R += colorIncrement)
        for (float G = 0; G < 1.0; G += colorIncrement)
            for (float B = 0; B < 1.0; B += colorIncrement)
                colors.add(new Color(R, G, B));
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    AllColors allColors = new AllColors(800, 800);

    frame.getContentPane().add(allColors);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);
}

}

在此处输入图像描述

4

2 回答 2

0

知道这i=0, j=999是第 1000 个像素,而i=999, j=0第 999001 个像素是如何在f(i,j) != f(j,i)不首先将颜色存储在列表中的情况下获得像素到颜色的映射?

pixel = i * 1000 + j + 1;

就将它们存储在列表中而言,这可能是您最好的方法,因为预先计算通常可以使事情变得更快。虽然我可能会做一个二维数组。喜欢:

private void getAllColors() {
    colors = new Color[1000][1000];
    int i = 0; int j = 0;
    loop:
    for (float R = 0; R < 1.0; R += colorIncrement) {
        for (float G = 0; G < 1.0; G += colorIncrement) {
            for (float B = 0; B < 1.0; B += colorIncrement) {
                colors[i++][j] = new Color(R, G, B));
                if (i == 1000) {
                    j++;
                    i = 0;
                    if (j == 1000) break loop;
                }
            }
        }
    }
}
于 2013-07-30T02:41:09.890 回答
0

在 i=j 时进行双循环检查,然后跳过有效负载。

于 2013-07-30T02:29:37.527 回答