public static bool TimeWarp(Bitmap b, Byte factor, bool bSmoothing) { int nWidth = b.Width; int nHeight = b.Height; FloatPoint[,] fp = new FloatPoint[nWidth, nHeight]; Point[,] pt = new Point[nWidth, nHeight]; Point mid = new Point(); mid.X = nWidth / 2; mid.Y = nHeight / 2; double theta, radius; double newX, newY; for (int x = 0; x < nWidth; ++x) { for (int y = 0; y < nHeight; ++y) { int trueX = x - mid.X; int trueY = y - mid.Y; theta = Math.Atan2((trueY), (trueX)); radius = Math.Sqrt(trueX * trueX + trueY * trueY); double newRadius = Math.Sqrt(radius) * factor; newX = mid.X + (newRadius * Math.Cos(theta)); if (newX > 0 && newX < nWidth) { fp[x, y].X = newX; pt[x, y].X = (int)newX; } else { fp[x, y].X = 0.0; pt[x, y].X = 0; } newY = mid.Y + (newRadius * Math.Sin(theta)); if (newY > 0 && newY < nHeight) { fp[x, y].Y = newY; pt[x, y].Y = (int)newY; } else { fp[x, y].Y = 0.0; pt[x, y].Y = 0; } } } if (bSmoothing) { OffsetFilterAbs(b, pt); } else { OffsetFilterAntiAlias(b, fp); } return(true); }
public static bool Water(Bitmap b, short nWave, bool bSmoothing) { int nWidth = b.Width; int nHeight = b.Height; FloatPoint[,] fp = new FloatPoint[nWidth, nHeight]; Point[,] pt = new Point[nWidth, nHeight]; Point mid = new Point(); mid.X = nWidth / 2; mid.Y = nHeight / 2; double newX, newY; double xo, yo; for (int x = 0; x < nWidth; ++x) { for (int y = 0; y < nHeight; ++y) { xo = ((double)nWave * Math.Sin(2.0 * Math.PI * (float)y / 128.0)); yo = ((double)nWave * Math.Cos(2.0 * Math.PI * (float)x / 128.0)); newX = (x + xo); newY = (y + yo); if (newX > 0 && newX < nWidth) { fp[x, y].X = newX; pt[x, y].X = (int)newX; } else { fp[x, y].X = 0.0; pt[x, y].X = 0; } if (newY > 0 && newY < nHeight) { fp[x, y].Y = newY; pt[x, y].Y = (int)newY; } else { fp[x, y].Y = 0.0; pt[x, y].Y = 0; } } } if (bSmoothing) { OffsetFilterAbs(b, pt); } else { OffsetFilterAntiAlias(b, fp); } return(true); }