This is a simple method that traverses each row in the image and puts a black pixel at every point that is a Prime number.
private Bitmap CreateNormalPrimeArt(HashSet<int> primes, int width, int height)
{
Bitmap bmp = new Bitmap(width, height);
using (Graphics gfx = Graphics.FromImage(bmp))
{
using (Brush brush = new SolidBrush(Color.FromArgb(25, 25, 76)))
{
gfx.FillRectangle(brush, new Rectangle(0, 0, width, height));
}
}
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (primes.Contains((y * height) + x))
bmp.SetPixel(x, y, Color.White);
}
}
using (Graphics gfx = Graphics.FromImage(bmp))
{
using (Brush brush = new SolidBrush(Color.White))
{
gfx.DrawString("Prime Rows", new System.Drawing.Font("Calibri", 10), brush, new PointF(20, height - 20));
}
}
return bmp;
}
The second is based on the Ulam Spiral.
private Bitmap CreateUlamSpiralPrimeArt(HashSet<int> primes, int width, int height)
{
if (width != height)
{
if (width > height)
width = height;
else
height = width;
}
if (width % 2 == 0)
{
width--;
height--;
}
int index = 1;
int sideLength = 2;
int thisSide = 2;
int turns = 0;
Bitmap bmp = new Bitmap(width, height);
using (Graphics gfx = Graphics.FromImage(bmp))
{
using (Brush brush = new SolidBrush(Color.FromArgb(25, 25, 76)))
{
gfx.FillRectangle(brush, new Rectangle(0, 0, width, height));
}
}
// set p to center
Point p = new Point(width / 2, height / 2);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (p.Y <= 5 || p.Y >= height - 5 || p.X <= 5 || p.X >= width - 5)
break;
if (primes.Contains(index))
bmp.SetPixel(p.X, p.Y, Color.White);
index++;
thisSide--;
int dir = turns % 4;
if (thisSide == 0)
{
thisSide = sideLength;
turns++;
if (dir == 1 || dir == 3)
sideLength += 1;
}
if (dir == 0)
{
p.X = p.X + 1;
}
else if (dir == 1)
{
p.Y = p.Y - 1;
}
else if (dir == 2)
{
p.X = p.X - 1;
}
else if (dir == 3)
{
p.Y = p.Y + 1;
}
}
}
using (Graphics gfx = Graphics.FromImage(bmp))
{
using (Brush brush = new SolidBrush(Color.White))
{
gfx.DrawString("Ulam Spiral", new System.Drawing.Font("Calibri", 10), brush, new PointF(20, height - 20));
}
}
return bmp;
}
Third method creates nice spirals based on the Prime distribution. Enjoy.
private Bitmap CreateDSCPrimeArt(HashSet<int> primes, int width, int height)
{
int index = 1;
Bitmap bmp = new Bitmap(width, height);
using (Graphics gfx = Graphics.FromImage(bmp))
{
using (Brush brush = new SolidBrush(Color.FromArgb(25, 25, 76)))
{
gfx.FillRectangle(brush, new Rectangle(0, 0, width, height));
}
}
// set p to center
int max = primes.Max();
Point p = new Point(width / 2, height / 2);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (primes.Contains(index))
{
// calculate location of the next pixel from the center of the image
// distance to the center of the image is based on the square root of the prime
PointF pixel = new Point() { X = p.X, Y = p.Y };
pixel.X += (float)(Math.Sin(index) * Math.Sqrt(index));
pixel.Y += (float)(Math.Cos(index) * Math.Sqrt(index));
if (!(pixel.Y <= 5 || pixel.Y >= height - 5 || pixel.X <= 5 || pixel.X >= width - 5))
{
bmp.SetPixel((int)pixel.X, (int)pixel.Y, Color.White);
}
}
index++;
if (index > max)
break;
}
}
using (Graphics gfx = Graphics.FromImage(bmp))
{
using (Brush brush = new SolidBrush(Color.White))
{
gfx.DrawString("Prime Spiral", new System.Drawing.Font("Calibri", 10), brush, new PointF(20, height - 20));
}
}
return bmp;
}
Update 2017-01-30
Fixed broken pictures, changed code to a cleaner format without line numbering.




No comments:
Post a Comment