Java 使用柏林噪波绘制高度图
我试图使一个程序将输出一个PNG文件的高度地图。我想知道是否有人能帮我把图像变成黑白,使图像的颜色变化更自然 我正在尝试让程序制作一个PNG文件,比如Java 使用柏林噪波绘制高度图,java,image,awt,perlin-noise,Java,Image,Awt,Perlin Noise,我试图使一个程序将输出一个PNG文件的高度地图。我想知道是否有人能帮我把图像变成黑白,使图像的颜色变化更自然 我正在尝试让程序制作一个PNG文件,比如 导入java.awt.image.buffereImage; 导入java.awt.image.DataBufferInt; 导入java.io.File; 导入java.io.IOException; 导入javax.imageio.imageio; 公共类HeightmapGen{ 专用最终静态整数宽度=900; 专用最终静态内部高度=60
导入java.awt.image.buffereImage;
导入java.awt.image.DataBufferInt;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
公共类HeightmapGen{
专用最终静态整数宽度=900;
专用最终静态内部高度=600;
专用最终静态浮点DX=.09f;
公共静态void main(字符串[]args){
缓冲图像img;
img=新的BuffereImage(宽度、高度、BuffereImage.TYPE\u INT\u RGB);
int[]像素=((DataBufferInt)img.getRaster().getDataBuffer()).getData();
对于(int i=0;i<(宽度*高度);i++)
{
像素[i]=(int)perlin.PerlinNoise(i*DX,i*DX);
System.out.println(像素[i]);
}
试一试{
write(img,“png”,新文件(“test.png”);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
这是噪音课
public class perlin {
private static float frequency ;
private static float amplitude ;
private static double persistence = .5;
private static double Number_Of_Octaves =8;
static float seed = 2000;
public static void setFrequency(float x)
{
frequency = x;
}
public static void setAmplitude(float x)
{
amplitude = x;
}
public static void setPersistence(double x)
{
persistence = x;
}
public static void setOctaves(double x)
{
Number_Of_Octaves = x;
}
private static float Noise(int f, int g)
{
int n;
n = f + g * 57;
n = (n<<13) ^ n;
n = (n * (n * n * 15731 + 789221) + 1376312589);
return (float) ( 1.0 - ( n & 0x7fffffff) / 1073741824.0);
}
private static float SmoothNoise1(int x, int y)
{
float corners, sides, center;
corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16;
sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8;
center = Noise(x, y) / 4;
return corners + sides + center;
}
private static float Interpolate(float a, float b, float x)
{
float ft, f;
ft = x * 3.1415927f;
f = (float) ((1 - Math.cos(ft)) * .5);
return (a*(1-f) + b*f);
}
static public float InterpolatedNoise_1(float x, float y)
{
int X = (int)x;
float fractional_X = x - X;
int Y = (int)y;
float fractional_Y = y - Y;
float v1, v2, v3, v4, i1, i2;
v1 = SmoothNoise1(X, Y);
v2 = SmoothNoise1(X + 1, Y);
v3 = SmoothNoise1(X, Y + 1);
v4 = SmoothNoise1(X + 1, Y + 1);
i1 = Interpolate(v1 , v2 , fractional_X);
i2 = Interpolate(v3 , v4 , fractional_X);
return Interpolate(i1 , i2 , fractional_Y);
}
static public float PerlinNoise(float x, float y)
{
float total;
double p, n;
total = 0;
p = persistence;
n = Number_Of_Octaves - 1;
for(double i =0; i <= n ; i++)
{
frequency = (float) Math.pow(2, i);
amplitude = (float) Math.pow(p, i);
total = total + InterpolatedNoise_1(x * frequency, y * frequency) * amplitude;
}
return seed * total;
}
}
公共类柏林{
专用静态浮频;
私有静态浮动幅度;
私有静态双持久性=.5;
八度音阶的专用静态双倍音阶=8;
静态浮动种子=2000;
公共静态无效设置频率(浮点x)
{
频率=x;
}
公共静态无效设置振幅(浮动x)
{
振幅=x;
}
公共静态void setPersistence(双x)
{
持久性=x;
}
公共静态八度音阶(双x)
{
_八度音阶的数量=x;
}
专用静态浮动噪声(int f,int g)
{
int n;
n=f+g*57;
n=(n1.重命名公共类Frame{(Frame是awt.Frame的Java保留字),2.请说明您的目标1)不需要在标题中添加主标记。2)源代码中只有一行空白就足够了。{
之后或之前的空行
通常也是多余的。3)对代码块使用一致的逻辑缩进。代码缩进的目的是帮助人们理解程序流程。4)为了更快地获得更好的帮助,请发布一个.BTW-//TODO自动生成的方法存根
,您应该在添加代码后删除这些注释。
public class perlin {
private static float frequency ;
private static float amplitude ;
private static double persistence = .5;
private static double Number_Of_Octaves =8;
static float seed = 2000;
public static void setFrequency(float x)
{
frequency = x;
}
public static void setAmplitude(float x)
{
amplitude = x;
}
public static void setPersistence(double x)
{
persistence = x;
}
public static void setOctaves(double x)
{
Number_Of_Octaves = x;
}
private static float Noise(int f, int g)
{
int n;
n = f + g * 57;
n = (n<<13) ^ n;
n = (n * (n * n * 15731 + 789221) + 1376312589);
return (float) ( 1.0 - ( n & 0x7fffffff) / 1073741824.0);
}
private static float SmoothNoise1(int x, int y)
{
float corners, sides, center;
corners = ( Noise(x-1, y-1)+Noise(x+1, y-1)+Noise(x-1, y+1)+Noise(x+1, y+1) ) / 16;
sides = ( Noise(x-1, y) +Noise(x+1, y) +Noise(x, y-1) +Noise(x, y+1) ) / 8;
center = Noise(x, y) / 4;
return corners + sides + center;
}
private static float Interpolate(float a, float b, float x)
{
float ft, f;
ft = x * 3.1415927f;
f = (float) ((1 - Math.cos(ft)) * .5);
return (a*(1-f) + b*f);
}
static public float InterpolatedNoise_1(float x, float y)
{
int X = (int)x;
float fractional_X = x - X;
int Y = (int)y;
float fractional_Y = y - Y;
float v1, v2, v3, v4, i1, i2;
v1 = SmoothNoise1(X, Y);
v2 = SmoothNoise1(X + 1, Y);
v3 = SmoothNoise1(X, Y + 1);
v4 = SmoothNoise1(X + 1, Y + 1);
i1 = Interpolate(v1 , v2 , fractional_X);
i2 = Interpolate(v3 , v4 , fractional_X);
return Interpolate(i1 , i2 , fractional_Y);
}
static public float PerlinNoise(float x, float y)
{
float total;
double p, n;
total = 0;
p = persistence;
n = Number_Of_Octaves - 1;
for(double i =0; i <= n ; i++)
{
frequency = (float) Math.pow(2, i);
amplitude = (float) Math.pow(p, i);
total = total + InterpolatedNoise_1(x * frequency, y * frequency) * amplitude;
}
return seed * total;
}
}