当前位置: 首页 > 知识库问答 >
问题:

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

湛宜春
2023-03-14

我试图让它,使一个像素在图像中的位置(inti,intj)决定该像素的颜色。这是一个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构建的

问题显然不清楚。注意GetAllColor,它按顺序创建颜色并将其添加到列表中,注意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);
}

}

共有2个答案

巢安澜
2023-03-14

知道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;
                }
            }
        }
    }
}
桂智志
2023-03-14

在双回路检查中,当i=j时,跳过有效载荷。

 类似资料:
  • 问题内容: 例如 输入:[‘A’,’Z’,’F’,’D’,…] 输出:[0,25,5,3,…] 在C语言中,我只是从’A’中减去char,但是我似乎无法在Java中做到这一点。 问题答案: 您也可以在Java中使用char进行简单的数学运算: 将输出0。

  • 假设我有一个包含一些对象的数组。 出于好奇,是否可以将流映射到它们在原始数组中的位置?例如,在这种情况下将其映射到1,2,3,4? 我想这样的事情是行不通的。

  • 问题内容: 我在一个开始从事的项目中遇到了这段代码。原始开发人员不再可用,我对此一无所知: 产生值为。这是如何运作的? 什么是运算符? 什么是运算符? 什么是运算符? 什么是运算符? 问题答案: 什么是运算符? 那是两个运算符,一个是赋值运算符,一个是一元加号,它什么都不做。 您是否输入错了并表示compund赋值运算符? 什么是运算符? 还有两个运算符,一个为后递增,一个为加法(根据最大划分规则

  • 主要内容:DocumentRoot,DocumentRoot之外的文件,用户目录,URL重定向,反向代理,重写引擎,文件未找到本文将介绍Apache HTTP Server如何使用请求的URL来确定从中提供文件的文件系统位置。 DocumentRoot 在决定为给定请求提供什么文件时,httpd的默认行为是获取请求的URL-Path(主机名和端口后面的URL部分),并将其添加到配置文件中指定的的末尾。因此,下面的文件和目录构成了可从Web上看到的基本文档树。 例如,如果设置为时,则对的请求会将文

  • 我在这里尝试遵循本指南: https://github . com/Spring-projects/Spring-Boot/wiki/Spring-Boot-Configuration-Binding 但是我正在努力让它工作。 我想从 application.yml 中定义的映射初始化哈希映射。 这是我最后一次尝试yml-map定义: 这是我的java类: 我想将“组合”和注入为键,并将值注入为字

  • 问题内容: 我想将a存储在列中并保持不变。这两个和是“本地”类型的定义。因此, 时区 的概念不应以任何方式干涉。 下面的代码是一个最小示例,该示例在内存数据库中创建带有列的表。Maven工件必须在类路径中。 首先,定义方法和: 请注意,该方法使用单引号引起来的值,因此Java™没有机会创建时区歧义。现在,一次调用几次,每次使用不同的时区设置: 然后打印以下内容: 假设数据库表未更改,如何编写该方法