【问题标题】:How to make and draw a Perlin Noise on a JPanel [closed]如何在 JPanel 上制作和绘制 Perlin Noise [关闭]
【发布时间】:2016-09-29 21:14:52
【问题描述】:

我想制作一个在 Java 中为 JPanel 带来噪音的应用程序。我想出了一个非常随机的噪声,但我想画一个 Perlin 或 Simplex Noise。
这是代码:

import java.awt.*;
import java.util.*;
import javax.swing.*;

public class Paint extends JPanel {

private static boolean running = false;
private static Paint paint = new Paint();
private static Random random = new Random();

public static void main(String args[]) {
    running = true;
    JFrame f = new JFrame();
    f.setSize(800, 800);
    f.setResizable(running);
    f.setUndecorated(running);
    f.setLocationRelativeTo(null);
    f.add(paint);
    f.setVisible(running);

    while(running) {
        paint.repaint();
    }
}

public void paint(Graphics g) {
    noise(g);
}

private void noise(Graphics g) {
    for(int i = 0; i < 800; i=i+10) {
        for(int j = 0; j < 800; j=j+10) {
            g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
            g.fillRect(j, i, 10, 10);
        }
    }
    running = false;
}

}

那么我如何将 Perlin Noise 算法植入此代码,而不必安装外部库。
编辑:我并不懒惰,或者什么。我阅读了所有可能的噪声生成方式,我只是不完全了解如何将噪声方法迁移到类中。

【问题讨论】:

  • 1) 查找/编写代码 2) 执行代码 3) 调试代码。我们只帮助#3。另外两个完全是你的责任。这不是代码编写服务。
  • 将 Stefan Gustavsson 的单纯形噪声实现作为一个单独的类包含到您的项目中,并使用它。
  • 您没有指定 Perlin 噪声前提条件(例如权重),也没有展示您的尝试并告诉我们您的尝试遇到了什么问题。这表明您可能来得太早了。
  • 不要覆盖paint()。你应该改写paintComponent(),它的第一个可执行语句应该是super.paintComponent(g);
  • 另外,while (true) 方法不应该用在 Swing 应用程序中,尤其是你写的那个,因为你会占用你的 CPU,使你的计算机有点迟钝。如果您想重复事件,请使用 Swing Timer。

标签: java swing awt


【解决方案1】:

你很幸运,我最近就是这样做的,这是我的代码:

BufferedImage tex;
float[] interpol;
int size;
float[] noise;
float[] workSet;
float r1,g1,b1,r2,g2,b2;
int octaves=4;
int octaveOffset=2;
public void init(int size)
{
    this.size=size;
    tex=new BufferedImage(size,size,BufferedImage.TYPE_INT_ARGB);
    interpol=new float[size];
    workSet=new float[size*size];
    noise=new float[size*size];
    float smult=(float) (Math.PI/size);
    for(int i=0;i<size;i++)
    {
        interpol[i]=(1+(float) Math.cos(i*smult))/2;
    }
    r1=255;
    g1=255;
    b1=255;
    r2=0;
    g2=0;
    b2=0;
}

public void generate()
{
    Random r=new Random();
    int[] pix=((DataBufferInt)(tex.getRaster().getDataBuffer())).getData();
    int totalSize=size*size;
    for(int i=0;i<totalSize;i++)
    {
        noise[i]=0.5f;
    }
    float[] randoms=new float[(size+1)*(size+1)];
    int scale=size>>octaveOffset;
    float max=0.50f;
    for(int oct=0;oct<octaves;oct++)
    {
        int randsPerLine=size/scale+1;
        int rands=randsPerLine*randsPerLine;
        for(int i=0;i<rands;i++)
        {
            randoms[i]=max*(r.nextFloat()-0.5f);
        }
        for(int i=0;i<totalSize;i++)
        {
            int y=(i/size)/scale;
            int suby=(i/size)%scale;
            int x=(i%size)/scale;
            int subx=(i%size)%scale;
            float intp=interpol[subx*(size/scale)];
            float colorA=randoms[y*randsPerLine+x]*intp+(1-intp)*randoms[y*randsPerLine+x+1];
            float colorB=randoms[(1+y)*randsPerLine+x]*intp+(1-intp)*randoms[(1+y)*randsPerLine+x+1];
            intp=interpol[suby*(size/scale)];
            workSet[i]=colorA*intp+(1-intp)*colorB;
        }

        for(int i=0;i<totalSize;i++)
        {
            noise[i]+=workSet[i];
        }
        max/=2;
        scale/=2;
    }
    for(int i=0;i<totalSize;i++)
    {
        int red=(int) (r1*noise[i]+r2*(1-noise[i]));
        int g=(int) (g1*noise[i]+g2*(1-noise[i]));
        int b=(int) (b1*noise[i]+b2*(1-noise[i]));
        pix[i]=(255<<24)+(red<<16)+(g<<8)+b;
    }
}

要绘制它,请使用g.drawImage(tex,[your coordinates],null)。 我的代码生成了一个正方形图像size x size,其中两种颜色(当前为黑色和白色)之间存在噪声混合,这可以通过修改r1, g1, b1, r2, g2, b2 来更改。使用octaves 和octaveOffset 值来使噪音满足您的需求。 我只测试了这段代码,size 是 2 的幂,在与你的代码合并时,我发现它只有在 main() 的开头被调用时才有效。

【讨论】:

  • 谢谢!这太棒了!
  • 然后请按接受回答按钮,这有助于我和其他人看到该主题已关闭(同时也为您提供声望分)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多