我使用单面噪音制作高度图。我遇到了调整它的问题,以形成一个岛屿的轻微倾向。我正在努力在实际渲染生物群系和其他功能之前使值正确。我遇到的问题是,我的代码应该能够创建这种在中间形成岛屿的倾向,但这似乎只能向一个方向发展。
如果有特殊原因?我的课程处理地形的平滑在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 only X (Y commented out):
[只有Y(X注释掉):](与X和Y类似,因为声誉而无法发布链接。)
[没有X和Y:](仅与X相似,因为声誉而无法发布链接。)
答案 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);
}
}