单面噪声调整仅在一个方向上工作

时间:2015-05-19 01:41:47

标签: java perlin-noise simplex-noise

我使用单面噪音制作高度图。我遇到了调整它的问题,以形成一个岛屿的轻微倾向。我正在努力在实际渲染生物群系和其他功能之前使值正确。我遇到的问题是,我的代码应该能够创建这种在中间形成岛屿的倾向,但这似乎只能向一个方向发展。

如果有特殊原因?我的课程处理地形的平滑在x和y方向上做同样的事情,但只有一个有效。

public class MapGenerator{

public double[][] toRender;

int maxHeight = 300;

public MapGenerator() {

    int xResolution = 200;
    int yResolution = 200;

    double[][] result = new double[xResolution][yResolution];

    for (int x = 0; x < xResolution; x++){
        for (int y = 0; y < yResolution; y++){
            result[x][y] = transformPoint(x, y, xResolution, yResolution, SimplexNoise.noise(x, y));
        }
    }

    toRender = result;

}

private double transformPoint(int x, int y, int xSize, int ySize, double point){
    System.out.println();
    System.out.println(point);

    point += 20 * Math.sin(x * Math.PI / xSize);

    point += 20 * Math.sin(y * Math.PI / ySize);

    System.out.println(point);

    return point;
}

}

白噪声的图像:

With X and Y:

With only X (Y commented out):

[只有Y(X注释掉):](与X和Y类似,因为声誉而无法发布链接。)

[没有X和Y:](仅与X相似,因为声誉而无法发布链接。)

1 个答案:

答案 0 :(得分:1)

我不是100%你错误的地方。它可能在你的噪音程序中。为了调试这个,我删除了对noise的调用并替换了0.5的常量值。然后我让剩下的工作了,所以我在图像的中心看到了一个白色的光环。然后我添加了noise回拨。 (注意我在这里使用我自己的SimplexNoise。)

所以问题出在你的界限(Math.min( 1.0, point ))或你的图形显示(你没有展示)或你的SimplexNoise(你也没有展示)中。

import SimpleUtils.noise.SimplexNoise;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 *
 * @author Brenden Towey
 */
public class MapGenerator
{

   public static void main( String[] args )
   {
      SwingUtilities.invokeLater( new Runnable()
      {
         public void run()
         {
            JFrame frame = new JFrame();

            frame.add( new JLabel( new ImageIcon( new MapGenerator().toImage() )));

            frame.pack();
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
         }
      } );

   }
   public double[][] toRender;

   int maxHeight = 300;
   int xResolution = 200;
   int yResolution = 200;

   public MapGenerator()
   {
      double[][] result = new double[ xResolution ][ yResolution ];
      SimplexNoise noise = new SimplexNoise();
      for( int x = 0; x < xResolution; x++ )
         for( int y = 0; y < yResolution; y++ )
            result[x][y] = transformPoint( x, y, noise.noise(x, y) );

      toRender = result;

   }

   private double transformPoint( int x, int y, double point )
   {
      point += 2 * Math.sin( x * Math.PI / xResolution )/2.0;
      point += 2 * Math.sin( y * Math.PI / yResolution )/2.0;
      return Math.min( 1.0, point);
   }

   public Image toImage()
   {
      BufferedImage image = new BufferedImage( xResolution,
              yResolution, BufferedImage.TYPE_INT_RGB );
      for( int x = 0; x < xResolution; x++ )
         for( int y = 0; y < yResolution; y++ )
            image.setRGB( x, y, greyScale( toRender[x][y] ) );
      return image;
   }

   private int greyScale( double toRender )
   {
      int scale = (int) ( 255 * toRender );
      return scale + (scale << 8) + (scale << 16);
   }
}

My output from this code