zoukankan      html  css  js  c++  java
  • C# 实现Bezier曲线(vs2008)

      1 using System;
      2 
      3 using System.Collections.Generic;
      4 
      5 using System.ComponentModel;
      6 
      7 using System.Data;
      8 
      9 using System.Drawing;
     10 
     11 using System.Linq;
     12 
     13 using System.Text;
     14 
     15 using System.Windows.Forms;
     16 
     17  
     18 
     19 namespace doBezier
     20 
     21 {
     22 
     23     public partial class Form1 : Form
     24 
     25     {
     26 
     27         PointF[] p = new PointF[100];   //存储控制点坐标
     28 
     29         int count;                    //记录已输入的控制点个数
     30 
     31         Graphics g;                  //GDI 对象
     32 
     33  
     34 
     35         public Form1()
     36 
     37         {
     38 
     39             InitializeComponent();
     40 
     41             g = CreateGraphics();
     42 
     43             count = 0;
     44 
     45         }
     46 
     47  
     48 
     49         private void Form1_Load(object sender, EventArgs e)
     50 
     51         {
     52 
     53  
     54 
     55         }
     56 
     57  
     58 
     59         private void Form1_MouseClick(object sender, MouseEventArgs e)
     60 
     61         {
     62 
     63             if (e.Button == MouseButtons.Left)
     64 
     65             {
     66 
     67                 if (count == 0)      //如果输入的是第一个点,先清空窗口
     68 
     69                     g.Clear(BackColor);
     70 
     71  
     72 
     73                 g.FillRectangle(Brushes.Red, e.X - 2, e.Y - 2, 4, 4);  //输出一个标记
     74 
     75                 p[count] = new PointF(e.X, e.Y);                 //存储
     76 
     77                 count ;                                    //记录输入控制点个数
     78 
     79                 return;
     80 
     81             }
     82 
     83             else
     84 
     85             {
     86 
     87                 PointF q1 = new PointF();
     88 
     89                 PointF q2 = new PointF();
     90 
     91                 double u;
     92 
     93  
     94 
     95                 for (int i = 0; i <= 100; i )//生成100个点并连成折线
     96 
     97                 {
     98 
     99                     u = (double)i / 100.0;
    100 
    101                     if (i == 0)
    102 
    103                     {
    104 
    105                         q1 = deCasteljau(u);
    106 
    107                     }
    108 
    109                     else
    110 
    111                     {
    112 
    113                         q2 = deCasteljau(u);
    114 
    115                         g.DrawLine(Pens.Black, q1, q2);
    116 
    117                         q1.X = q2.X;
    118 
    119                         q1.Y = q2.Y;
    120 
    121                     }
    122 
    123                 }
    124 
    125                 count = 0;
    126 
    127                 return;
    128 
    129             }
    130 
    131         }
    132 
    133  
    134 
    135         PointF deCasteljau(double u)   //曲线参数为u,函数返回一个二维点 
    136 
    137         {
    138 
    139             int i, k;
    140 
    141             //以下将控制点数组p[],复制到数组q[]
    142 
    143             PointF[] q = new PointF[100];
    144 
    145             for (i = 0; i < count; i )
    146 
    147             {
    148 
    149                 q[i].X = p[i].X;
    150 
    151                 q[i].Y = p[i].Y;
    152 
    153             }
    154 
    155             //以下用de Casteljau割角算法计算bezier曲线上参数点u对应的x,y,
    156 
    157             //计算完成后,结果存储在q[0]
    158 
    159             for (k = 1; k < count; k )
    160 
    161                 for (i = 0; i < count - k; i )
    162 
    163                 {
    164 
    165                     q[i].X = (float)(1.0 - u) * q[i].X   (float)u * q[i   1].X;
    166 
    167                     q[i].Y = (float)(1.0 - u) * q[i].Y   (float)u * q[i   1].Y;
    168 
    169                 }
    170 
    171             return new PointF(q[0].X, q[0].Y);
    172 
    173         }
    174 
    175  
    176 
    177         private void Form1_Paint(object sender, PaintEventArgs e)
    178 
    179         {
    180 
    181  
    182 
    183         }
    184 
    185     }
    186 
    187 }
    作者:Standby一生热爱名山大川、草原沙漠,还有妹子
    出处:http://www.cnblogs.com/standby/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    tcpip协议
    Linux特殊文件使用原理
    shell之常用内置变量
    SSM框架CRUD小案例
    个人博客开发笔记
    蓝天筹项目开发记录
    二叉平衡树AVL的插入与删除(java实现)
    二叉搜索树(java实现)
    树的基本操作
    SQL连接
  • 原文地址:https://www.cnblogs.com/standby/p/4150148.html
Copyright © 2011-2022 走看看