private void GenPoints(Image <Rgba32> buffer) { var o = PointSize - 1; var random = new Random(Seed); var span = buffer.GetPixelSpan(); for (var i = 0; i < PointCount; i++) { var x = random.Next(0, buffer.Width); var y = random.Next(0, buffer.Height); var dist = random.NextFloat(); for (var oy = y - o; oy <= y + o; oy++) { for (var ox = x - o; ox <= x + o; ox++) { var ix = MathHelper.Mod(ox, buffer.Width); var iy = MathHelper.Mod(oy, buffer.Height); var color = Color.InterpolateBetween(FarColor, CloseColor, dist).ConvertImgSharp(); span[iy * buffer.Width + ix] = color; } } } }
private void GenPointsMasked(Image <Rgba32> buffer) { var o = PointSize - 1; var random = new Random(Seed); var noise = new NoiseGenerator(MaskNoiseType); noise.SetSeed(MaskSeed); noise.SetFrequency(MaskFrequency); noise.SetPersistence(MaskPersistence); noise.SetLacunarity(MaskLacunarity); noise.SetOctaves(MaskOctaves); noise.SetPeriodX(buffer.Width); noise.SetPeriodY(buffer.Height); var threshVal = 1 / (1 - MaskThreshold); var powFactor = 1 / MaskPower; const int maxPointAttemptCount = 9999; var pointAttemptCount = 0; var span = buffer.GetPixelSpan(); for (var i = 0; i < PointCount; i++) { var x = random.Next(0, buffer.Width); var y = random.Next(0, buffer.Height); // Grab noise at this point. var noiseVal = MathF.Min(1, MathF.Max(0, (noise.GetNoiseTiled(x, y) + 1) / 2)); // Threshold noiseVal = MathF.Max(0, noiseVal - MaskThreshold); noiseVal *= threshVal; noiseVal = (float)MathF.Pow(noiseVal, powFactor); var randomThresh = random.NextFloat(); if (randomThresh > noiseVal) { if (++pointAttemptCount <= maxPointAttemptCount) { i--; } continue; } var dist = random.NextFloat(); for (var oy = y - o; oy <= y + o; oy++) { for (var ox = x - o; ox <= x + o; ox++) { var ix = MathHelper.Mod(ox, buffer.Width); var iy = MathHelper.Mod(oy, buffer.Height); var color = Color.InterpolateBetween(FarColor, CloseColor, dist).ConvertImgSharp(); span[iy * buffer.Width + ix] = color; } } } }
public override void Apply(Image <Rgba32> bitmap) { var noise = new NoiseGenerator(NoiseType); noise.SetSeed(Seed); noise.SetFrequency(Frequency); noise.SetPersistence(Persistence); noise.SetLacunarity(Lacunarity); noise.SetOctaves(Octaves); noise.SetPeriodX(bitmap.Width); noise.SetPeriodY(bitmap.Height); var threshVal = 1 / (1 - Threshold); var powFactor = 1 / Power; var span = bitmap.GetPixelSpan(); for (var y = 0; y < bitmap.Height; y++) { for (var x = 0; x < bitmap.Width; x++) { // Do noise calculations. var noiseVal = MathF.Min(1, MathF.Max(0, (noise.GetNoiseTiled(x, y) + 1) / 2)); // Threshold noiseVal = MathF.Max(0, noiseVal - Threshold); noiseVal *= threshVal; noiseVal = (float)MathF.Pow(noiseVal, powFactor); // Get colors based on noise values. var srcColor = Color.InterpolateBetween(OuterColor, InnerColor, noiseVal) .WithAlpha(noiseVal); // Apply blending factors & write back. var i = y * bitmap.Width + x; var dstColor = span[i].ConvertImgSharp(); span[i] = Color.Blend(dstColor, srcColor, DstFactor, SrcFactor).ConvertImgSharp(); } } }