/* GDI+ example in C# */ using System; using System.WinForms; using System.Drawing; using System.Drawing.Imaging; using System.Threading; class Plasma : Form { byte[,] table = new byte[2,256]; int[] palette; int factor1 = -2; int factor2 = -1; int factor3 = 1; int factor4 = -2; int a = 0; int b = 0; int aa = 0; int bb = 0; Plasma(String title, int w, int h) { Text = title; Width = w; Height = h; palette = createPalette(); Show(); } int[] createPalette() { int[] palette = new int[256]; int red = 500; int green = 320; int blue = 372; for (int i = 0; i < 256; i++) { table[0,i] = (byte) (Math.Sin( Math.PI*2*i/255 )*127 + 128); table[1,i] = (byte) (Math.Cos( Math.PI*2*i/255 )*127 + 128); table[1,i] = (byte) (Math.Sin( Math.PI*2*table[1,i]/255 )*127 + 128); byte r = (byte) (Math.Cos( Math.PI*2*i/red)*127 + 128); byte g = (byte) (Math.Cos( Math.PI*2*i/green)*127 + 128); byte b = (byte) (Math.Cos( Math.PI*2*i/blue)*127 + 128); palette[i] = r << 16 | g << 8 | b; } return palette; } unsafe void updateFrame(BitmapData bmpd) { a += factor1; b += factor2; for (int y = 0; y < bmpd.Height; y++) { aa = table[0, (y + a) & 0xFF]; bb = table[1, b & 0xFF]; int *pixels = (int *)(bmpd.Scan0 + (y*bmpd.Stride)); for (int x = 0; x < bmpd.Width; x++) { int c = table[0, (x+aa) & 0xFF] + table[1, (y+bb) & 0xFF]; *pixels++ = palette[(c >> 1)]; aa += factor3; bb += factor4; } } } void drawFrame(Bitmap bmp) { Graphics g = CreateGraphics(); g.DrawImageUnscaled(bmp, 0, 0); g.Dispose(); } void run() { Bitmap bmp = new Bitmap(Width, Height, PixelFormat.Format32bppRGB); Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); while(true) { BitmapData bmpd = bmp.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppRGB); updateFrame(bmpd); bmp.UnlockBits(bmpd); drawFrame(bmp); } } public static void Main() { Plasma pl = new Plasma("GDI+ example in C#", 320, 200); Thread plt = new Thread(new ThreadStart(pl.run)); plt.Start(); Application.Run(pl); plt.Abort(); } }