/// <summary> /// Инициализируем контролл отрисовки примитивов /// </summary> private void initRazor() { //Инициализируем razor = new RazorPainterWFCtl(); //Проставляем заполнение razor.Dock = DockStyle.Fill; //Добавляем его на наш основной контролл this.Controls.Add(razor); }
public void magic(ref RazorPainterWFCtl image, int count = 1) { unsafe { int width = image.Width; int height = image.Height; BitmapData bitmapData = image.RazorBMP.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, image.RazorBMP.PixelFormat); int bytesPerPixel = System.Drawing.Bitmap.GetPixelFormatSize(image.RazorBMP.PixelFormat) / 8; int heightInPixels = bitmapData.Height; int widthInBytes = bitmapData.Width * bytesPerPixel; byte *PtrFirstPixel = (byte *)bitmapData.Scan0; for (int magicCount = 0; magicCount < count; magicCount++) { #region обработка Parallel.For(0, ants.Length / 100 + 1, (int outerI) => { for (int currI = outerI * 100; currI < (outerI + 1) * 100 && currI < ants.Length; currI++) { byte *currentLine = PtrFirstPixel + (ants[currI].y * bitmapData.Stride); int x = ants[currI].x * bytesPerPixel; color min = color.blue; color max = color.blue; for (int i = 1; i < 3; i++) { if (currentLine[x + (int)min] > currentLine[x + i]) { min = (color)i; } if (currentLine[x + (int)max] < currentLine[x + i]) { max = (color)i; } } if (max == ants[currI].color) { byte swap = currentLine[x + (int)max]; currentLine[x + (int)max] = currentLine[x + (int)min]; currentLine[x + (int)min] = swap; switch (ants[currI].direction) { case direction.up: ants[currI].direction = direction.left; ants[currI].x--; break; case direction.right: ants[currI].direction = direction.up; ants[currI].y--; break; case direction.down: ants[currI].direction = direction.right; ants[currI].x++; break; case direction.left: ants[currI].direction = direction.down; ants[currI].y++; break; } } else { byte swap = currentLine[x + (int)ants[currI].color]; currentLine[x + (int)ants[currI].color] = currentLine[x + (int)max]; currentLine[x + (int)max] = swap; switch (ants[currI].direction) { case direction.up: ants[currI].direction = direction.right; ants[currI].x++; break; case direction.right: ants[currI].direction = direction.down; ants[currI].y++; break; case direction.down: ants[currI].direction = direction.left; ants[currI].x--; break; case direction.left: ants[currI].direction = direction.up; ants[currI].y--; break; } } if (ants[currI].x < 0) { ants[currI].x = width - 1; } if (ants[currI].x >= width) { ants[currI].x = 0; } if (ants[currI].y < 0) { ants[currI].y = height - 1; } if (ants[currI].y >= height) { ants[currI].y = 0; } } }); #endregion обработка } image.RazorBMP.UnlockBits(bitmapData); } }