花样贝塞尔曲线(C#)

border="0" name="sina_roll" marginwidth="0" marginheight="0" src="http://news.sina.com.cn/o/allnews/input/index.html" frameborder="No" width="100%" scrolling="no" height="15">

                  花样贝塞尔曲线(C#)

                                                        作者 jlgzw

贝塞尔是一名法国工程师。他发明的贝塞尔曲线可以说是一种奇妙的曲线,用它可以创造出很美的图像。一条贝塞尔曲线由4个点唯一定义,包括“起点”,“终点”和“控制点”。其中“控制点”的位置决定着曲线的形状。
 下面是我模仿 Windows自带的屏幕保护“贝塞尔曲线”写的一个小程序。它也可以设置贝塞尔曲线的个数和环数,只需修改iCount和iNumber这两个变量。
//----------------------------------------------
// RandomBezier.cs @2007 by jl gzw
//----------------------------------------------
using System;
using System.Drawing;
using System.Windows.Forms;
class RandomBezier: Form
{
    //变量iCount表示贝塞尔曲线的个数
    const int iCount = 2;
    //变量iNumber表示环的个数
    const int iNumber = 3;    
     private Point[] ptArr = new Point[4 * iCount - (iCount - 1)];
     public static void Main()
     {
          Application.Run(new RandomBezier());
     }
     public RandomBezier()
     {
          Text = "花样贝塞尔曲线";
          this.BackColor = Color.Black;
         
          Timer timer    = new Timer();
          timer.Interval = 100;
          timer.Tick    += new EventHandler(TimerOnTick);
          timer.Start();
     }
     void TimerOnTick(object obj, EventArgs ea)
     { 
          Random rand = new Random();
          Graphics grfx = CreateGraphics();
          //擦除旧的贝塞尔曲线。
          for (int j = 0; j < iNumber; j++)
          {
              for (int i = 0; i < 4 * iCount - (iCount - 1); i++)
              {
                  ptArr[i].X += 5;
                  ptArr[i].Y += 5;
              }
              grfx.DrawBeziers(new Pen(Color.Black, 1), ptArr);
          }
          Point ptBeg = new Point(0,0);
          //获得新贝塞尔曲线的坐标。
          for(int i = 0; i < 4 * iCount - (iCount - 1); i++)
          {
              ptArr[i] = new Point(rand.Next(Math.Min(ClientSize.Width, ClientSize.Height)),
                  rand.Next(Math.Min(ClientSize.Width, ClientSize.Height)));
            
             ptBeg = ptArr[0];
          }
          ptArr[4 * iCount - (iCount - 1) - 1] = ptBeg;
    
          Color color = Color.FromArgb(rand.Next(256),rand.Next(256), rand.Next(256));
          //画新的贝塞尔曲线。外层循环控制环的个数。
          for (int j = 0; j < iNumber; j++)
          {
              grfx.DrawBeziers(new Pen(color, 1), ptArr);
              for (int i = 0; i < 4 * iCount - (iCount - 1); i++)
              {
                  ptArr[i].X -= 5;
                  ptArr[i].Y -= 5;
              }             
          }
          grfx.Dispose();
     }
}
以下是一个简单的三阶贝塞尔曲线C# 代码示例: ```csharp using System; using System.Drawing; using System.Windows.Forms; public class BezierCurveForm : Form { private Point[] controlPoints; public BezierCurveForm() { controlPoints = new Point[4]; controlPoints[0] = new Point(50, 100); controlPoints[1] = new Point(150, 50); controlPoints[2] = new Point(250, 150); controlPoints[3] = new Point(350, 100); this.ClientSize = new Size(400, 200); this.Paint += new PaintEventHandler(BezierCurveForm_Paint); } private void BezierCurveForm_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; Pen pen = new Pen(Color.Black, 2); // 绘制控制点 for (int i = 0; i < controlPoints.Length; i++) { g.FillEllipse(Brushes.Red, controlPoints[i].X - 3, controlPoints[i].Y - 3, 6, 6); } // 绘制贝塞尔曲线 for (double t = 0; t <= 1; t += 0.01) { Point p = CalculateBezierPoint(t, controlPoints); g.FillEllipse(Brushes.Blue, p.X - 1, p.Y - 1, 2, 2); } // 绘制控制线 g.DrawLine(pen, controlPoints[0], controlPoints[1]); g.DrawLine(pen, controlPoints[1], controlPoints[2]); g.DrawLine(pen, controlPoints[2], controlPoints[3]); } private Point CalculateBezierPoint(double t, Point[] controlPoints) { double u = 1 - t; double tt = t * t; double uu = u * u; double uuu = uu * u; double ttt = tt * t; double x = uuu * controlPoints[0].X; // (1-t)^3 * P0 x += 3 * uu * t * controlPoints[1].X; // 3 * (1-t)^2 * t * P1 x += 3 * u * tt * controlPoints[2].X; // 3 * (1-t) * t^2 * P2 x += ttt * controlPoints[3].X; // t^3 * P3 double y = uuu * controlPoints[0].Y; // (1-t)^3 * P0 y += 3 * uu * t * controlPoints[1].Y; // 3 * (1-t)^2 * t * P1 y += 3 * u * tt * controlPoints[2].Y; // 3 * (1-t) * t^2 * P2 y += ttt * controlPoints[3].Y; // t^3 * P3 return new Point((int)Math.Round(x), (int)Math.Round(y)); } public static void Main() { Application.Run(new BezierCurveForm()); } } ``` 这段代码创建了一个简单的窗体应用程序,绘制了一个三阶贝塞尔曲线,并显示了控制点和控制线。你可以根据需要修改控制点的坐标,以获得不同形状的贝塞尔曲线。运行程序后,你会看到绘制的贝塞尔曲线在窗体中显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值