Círculos de gradiente para o gerador de mapas
Então, eu estou criando um gerador de mapas que cria ilhas aleatórias. Ele usa o Perlin Noise no coração do gerador e, em seguida, um método usando círculos com gradientes para formar as ilhas.
O método circle cria vários círculos no centro do mapa com um gradiente de uma cor que começa de 64 a 0. O problema é que esse método está criando uma aparência não natural de partes do mapa com arestas circulares. Quando o ruído perlin é gerado para um pixel, ele recebe o pixel no mapa de gradiente e, em seguida, o mutifica pelo valor em azul.
Portanto, se o ruído perlin der um no pixel 1, 5 e o valor azul no mapa de gradiente for 54, ele emitirá um valor de ruído 54. Se o ruído perlin no pixel 130, 560 for 0,5 e o valor da cor gradiente for 64 então o valor do ruído de 32.
Aqui está o que estou recebendo:
Existem dois pontos principais no código, o bit perlin:
noise = NoiseGenerator.Noise(x, y);
double gradColour = getGradColour(x, y).B;
double addedNoise = noise * gradColour;
double gradNoise = addedNoise;// - gradColour;
E então o gerador de mapa de gradiente:
public static void DrawGrad(float X, float Y, float R, Color C1, Color C2)
{
Graphics g = Graphics.FromImage(imgGrad);
GraphicsPath path = new GraphicsPath();
path.AddEllipse(X, Y, R, R);
PathGradientBrush pathGrBrush = new PathGradientBrush(path);
pathGrBrush.CenterColor = C1;
Color[] colours = { C2 };
pathGrBrush.SurroundColors = colours;
g.FillEllipse(pathGrBrush, X, Y, R, R);
//g.FillEllipse(Brushes.Red, X, Y, R, R);
g.Flush();
}
int amount = rnd.Next(25, 30);
for (int i = 0; i < amount / 4; i++)
{
float X = rnd.Next(-800, 1748);
float Y = rnd.Next(-800, 1748);
float R = rnd.Next(1000, 1200);
DrawGrad(X, Y, R, Color.FromArgb(255, 0, 0, rnd.Next(15, 20)), Color.FromArgb(0, 0, 0, 0));
}
for (int i = 0; i < amount; i++)
{
double positionDiv = 1.98;
double X1 = rnd.Next(0, 450) / positionDiv;
double Y1 = rnd.Next(0, 450) / positionDiv;
double R1 = rnd.Next(300, 650) / 4;
float R = (float)R1;
float X = (float)X1;
float Y = (float)Y1;
while (X + R > 1004)
{
X = 924 - R;
}
while (Y + R > 1004)
{
Y = 924 - R;
}
if(X < 30)
{
X = 30;
}
if(Y < 30)
{
Y = 30;
}
DrawGrad(X, Y, R, Color.FromArgb(255, 0, 0, rnd.Next(40, 64)), Color.FromArgb(0, 0, 0, rnd.Next(13, 17)));
}
Eu só estava me perguntando se alguém conhece algum outro método em c # que poderia criar uma ilha usando ruído perlin? Qualquer conselho seria muito apreciado.