【Code Art / C#】随机贝塞尔曲线效果测试
来源:互联网 发布:mac brave 编辑:程序博客网 时间:2024/05/16 02:44
贝塞尔曲线是通过几个控制点来绘制曲线的一种方法。通过若干个贝塞尔曲线随机组合,然后随机移动每个控制点,会实现怎样的效果呢?
用这样简单粗暴的思路,写了以下绘制代码。
然后将画完的一帧做模糊处理,不擦除画布继续画一帧,然后用Timer循环绘制,便实现了如图所示的效果。
以下为随机绘制一帧的代码,如需要动画效果和如图所示的效果请参照以上思路自行实现。
using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System.Runtime.InteropServices;using sf = RandBezier.SystemFramework;namespace RandBezier{ /// <summary> /// 贝塞尔节点结构 /// </summary> public class RandPoint { public RandPoint() { this.X = sf.Rand.Next(0, sf.Win_Width); this.Y = sf.Rand.Next(0, sf.Win_Height); this.dx = sf.Rand.Next(-100, 100) * 1f / 100; this.dy = sf.Rand.Next(-100, 100) * 1f / 100; this.offset_dx = sf.Rand.Next(-100, 100) * 1f / 1000; this.offset_dy = sf.Rand.Next(-100, 100) * 1f / 1000; } public float X { get; set; } public float Y { get; set; } public float dx = 0f; public float dy = 0f; private float offset_dx = 0f; private float offset_dy = 0f; private int count = 0; /// <summary> /// 移动处理 /// </summary> public void Do() { this.X += this.dx; if (this.X < 0 || this.X > sf.Win_Width) { this.dx = -this.dx; this.offset_dx = -this.offset_dx; } this.Y += this.dy; if (this.Y < 0 || this.Y > sf.Win_Height) { this.dy = -this.dy; this.offset_dy = -this.offset_dy; } this.dx += this.offset_dx; if (Math.Abs(this.dx) > 10) { this.offset_dx = -this.offset_dx; } this.dy += this.offset_dy; if (Math.Abs(this.dy) > 10) { this.offset_dy = -this.offset_dy; } if (this.count > 150) { this.count = 0; this.offset_dx = sf.Rand.Next(-100, 100) * 1f / 1000; this.offset_dy = sf.Rand.Next(-100, 100) * 1f / 1000; } this.count++; } } /// <summary> /// 颜色结构 /// </summary> public class RandColor { private int min = 180; private int max = 255; public RandColor() { this.R = sf.Rand.Next(min, max); this.G = sf.Rand.Next(min, max); this.B = sf.Rand.Next(min, max); this.offset_r = sf.Rand.Next(-5, 5); this.offset_g = sf.Rand.Next(-5, 5); this.offset_b = sf.Rand.Next(-5, 5); } public int R { get; set; } public int G { get; set; } public int B { get; set; } private int offset_r = 0; private int offset_g = 0; private int offset_b = 0; private int count = 0; public void Do() { this.R += this.offset_r; if (this.R < min) { this.R = min; this.offset_r = -this.offset_r; } if (this.R > max) { this.R = max; this.offset_r = -this.offset_r; } this.G += this.offset_g; if (this.G < min) { this.G = min; this.offset_g = -this.offset_g; } if (this.G > max) { this.G = max; this.offset_g = -this.offset_g; } this.B += this.offset_b; if (this.B < min) { this.B = min; this.offset_b = -this.offset_b; } if (this.B > max) { this.B = max; this.offset_b = -this.offset_b; } if (this.count > 100) { this.count = 0; this.offset_r = sf.Rand.Next(-5, 5); this.offset_g = sf.Rand.Next(-5, 5); this.offset_b = sf.Rand.Next(-5, 5); } this.count++; } public Color GetColor() { return Color.FromArgb(this.R, this.G, this.B); } } /// <summary> /// 贝塞尔绘制器 /// </summary> public class BezierDraw { private int Width = 800; private int Height = 600; private Graphics graphics = null; private Bitmap bmp_temp = null; private Bitmap bmp_back = null; private List<RandPoint> pointList; private List<PointF> pointDrawList; private RandColor randColor; /// <summary> /// 构造函数 /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="g"></param> public BezierDraw(int width,int height,Graphics g) { this.Width = width; this.Height = height; this.graphics = g; this.bmp_temp = new Bitmap(width, height); this.bmp_back = new Bitmap(width, height); this.pointList = new List<RandPoint>(); this.randColor = new RandColor(); this.pointDrawList = new List<PointF>(); for (int i = 0; i < 100; i++) { pointList.Add(new RandPoint()); } } /// <summary> /// 处理 /// </summary> public void Do() { if (randColor != null) { randColor.Do(); } if (pointDrawList != null && pointList != null) { pointDrawList.Clear(); foreach (RandPoint p in pointList) { p.Do(); pointDrawList.Add(new PointF(p.X,p.Y)); } } } private int count = 0; /// <summary> /// 画出 /// </summary> public void Draw() { if (graphics != null && bmp_temp != null && randColor != null) { // 背景图 Graphics gb = Graphics.FromImage(bmp_back); gb.FillRectangle(new SolidBrush(Color.Black), 0, 0, Width, Height); // 渐变 if (count > 25) { bmp_temp = BitmapCtrlOpacity(bmp_temp, 0.89f); count = 0; } else { bmp_temp = BitmapCtrlOpacity(bmp_temp, 0.95f); } count++; bmp_temp = BimapZoom(bmp_temp); // bmp_temp = GaussianBlur(bmp_temp); // bmp_temp = BitmapOpacity(bmp_temp, 0.95f); Graphics g = Graphics.FromImage(bmp_temp); g.SmoothingMode = SmoothingMode.AntiAlias; // 画曲线 Pen pen = new Pen(randColor.GetColor()); pen.Width = 1.5f; g.DrawBeziers(pen, pointDrawList.ToArray()); // 画到背景上 gb.DrawImage(bmp_temp, 0, 0); // 画到设备上 graphics.DrawImage(bmp_back, 0, 0); } } public static Bitmap BimapZoom(Bitmap srcBitmap) { Bitmap bmp = new Bitmap(srcBitmap.Width, srcBitmap.Height); Bitmap bmp_temp = new Bitmap((int)(srcBitmap.Width / 2.5), (int)(srcBitmap.Height / 2.5)); Graphics g = Graphics.FromImage(bmp_temp); g.SmoothingMode = SmoothingMode.HighSpeed; g.DrawImage(srcBitmap, 0, 0, bmp_temp.Width, bmp_temp.Height); g = Graphics.FromImage(bmp); g.SmoothingMode = SmoothingMode.HighSpeed; g.DrawImage(bmp_temp, 0, 0, srcBitmap.Width, srcBitmap.Height); return bmp; } /// <summary> /// 设置图像透明度 /// </summary> /// <param name="srcImage">源图像</param> /// <param name="opacity">透明度</param> /// <returns>返回图像</returns> public static Bitmap BitmapCtrlOpacity(Bitmap srcImage, float opacity) { float[][] nArray ={ new float[] {1, 0, 0, 0, 0}, new float[] {0, 1, 0, 0, 0}, new float[] {0, 0, 1, 0, 0}, new float[] {0, 0, 0, opacity, 0}, new float[] {0, 0, 0, 0, 1} }; ColorMatrix matrix = new ColorMatrix(nArray); ImageAttributes attributes = new ImageAttributes(); attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); Bitmap resultImage = new Bitmap(srcImage.Width, srcImage.Height); Graphics g = Graphics.FromImage(resultImage); g.SmoothingMode = SmoothingMode.HighSpeed; g.DrawImage(srcImage, new Rectangle(0, 0, srcImage.Width, srcImage.Height), 0, 0, srcImage.Width, srcImage.Height, GraphicsUnit.Pixel, attributes); //DrawImage(srcImage, ref resultImage, new Rectangle(0, 0, srcImage.Width, srcImage.Height), new Point(0, 0)); g.Dispose(); return resultImage; } }}
0 0
- 【Code Art / C#】随机贝塞尔曲线效果测试
- 【Code Art / C#】圆形组合图像效果生成
- react-native-art画二次贝塞尔曲线实现
- 【Code Art / C#】文字转换成字符画
- 贝塞尔曲线与翻页效果
- Art of code comment
- 花样贝塞尔曲线(C#)
- 一个查看贝塞尔曲线效果的网站
- iOS 贝塞尔曲线实现圆角效果
- 贝塞尔曲线之购物车动画效果
- 贝塞尔曲线实现球形一变二动画效果
- 贝塞尔曲线之购物车动画效果
- Android贝塞尔曲线实现Loading效果
- android贝塞尔曲线之波浪效果
- 运用贝塞尔曲线描绘android翻页效果
- PathMeasure + 贝塞尔曲线实现过山车效果
- 贝塞尔曲线的艺术---弹性效果实现
- 能量球效果(贝塞尔曲线)
- 行人检测资源汇总
- Qt之无边框窗口创建
- Android Studio下JNI开发
- 解决 Make sure the Cursor is initialized correctly before accessing data from it
- find the mincost route
- 【Code Art / C#】随机贝塞尔曲线效果测试
- 139. Word Break | Java最短代码实现
- CentOs 6.6配置 Apache服务器 Mysql5.5 PHP5.5 以及Tomcat8.0 JDK的方法
- [扫描线 树链剖分 树状数组] BZOJ2758 [SCOI2012]Blinker的噩梦
- 为 Notepad++ 安装 NppFTP 插件,查看修改虚拟机上的文本文件
- HTML入门语法(1)
- 2015春季练习——一道水题的思考
- java.lang.IndexOutOfBoundsException 错误解决
- 【慕课笔记】1-1 初次邂逅XML