Градиентные круги для генератора карт
Поэтому я делаю генератор карт, который создает случайные острова. Он использует Perlin Noise в основе генератора, а затем метод, использующий круги с градиентами для создания островков.
Метод окружностей создает количество окружностей в центре карты с градиентом от цвета, начинающегося с 64 до 0. Проблема заключается в том, что этот метод создает ненатруальный взгляд на части карты с круглыми краями. Когда для пикселя генерируется шум перлина, он получает этот пиксель на карте градиента и затем умножает его на синее значение.
Таким образом, если шум перлина дает единицу на пикселе 1, 5, а значение синего цвета на карте градиента равно 54, оно выведет значение шума 54. Если шум перлина на пикселе 130, 560 равен 0,5, а значение цвета градиента равно 64 тогда значение шума 32.
Вот что я получаю:
В коде есть два ключевых момента, бит perlin:
noise = NoiseGenerator.Noise(x, y);
double gradColour = getGradColour(x, y).B;
double addedNoise = noise * gradColour;
double gradNoise = addedNoise;// - gradColour;
А затем генератор карт градиента:
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)));
}
Мне просто интересно, если кто-нибудь еще знает какие-либо другие методы в C #, которые могли бы создать остров, используя шум Perlin? Любой совет будет принята с благодарностью.