如何将像素位置i,j映射到颜色?

时间:2013-07-30 02:08:53

标签: java swing colors graphics2d

我试图使它成为图像中像素的位置(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,0然后0,G,0然后0,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);
}

}

enter image description here

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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;
                }
            }
        }
    }
}