我正在尝试使图像中像素的位置(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
then构造的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);
}
}