2016-09-29 9 views
-4

Я хочу сделать приложение, которое создает шум для JPanel в Java. Я придумал действительно случайный шум, но я бы хотел нарисовать Perlin или Simplex Noise.
Вот код:Как сделать и нарисовать шум Perlin на JPanel

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; 
} 

} 

Так как я бы имплантировать алгоритм шума Перлина к этому коду, не имея при этом установить внешние библиотеки.
EDIT: Я не ленив, или что-то в этом роде. Я прочитал свой путь через все возможные поколения шума, я просто не совсем понимаю, как иммигрировать методы шума в класс.

+1

1) найти/написать код 2) выполнить код 3) код отладки. Мы только помогаем с №3. Остальные двое - полностью ВАША ответственность. Это не служба написания кода. –

+0

Включите реализацию симплексного шума Stefan Gustavsson как отдельный класс в свой проект и используйте его. –

+1

Вы не указали свои предварительные условия шума Perlin, такие как вес, и не показали свою попытку и рассказали нам, какие у вас проблемы с вашей попыткой. Это говорит о том, что вы можете быть здесь слишком рано. –

ответ

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 и при слиянии с кодом я узнал, что он работает только в том случае, если paint.init(1024) и paint.generate() называются в начале main().

+0

Спасибо! Отлично! –

+0

Затем нажмите кнопку принятия ответа, это помогает мне, а остальные видят, что эта тема закрыта (и она также дает вам очки репутации). – HL65536

 Смежные вопросы

  • Нет связанных вопросов^_^