using System;

 using System.Collections.Generic;

 using System.ComponentModel;

 using System.Data;

 using System.Drawing;

 using System.Linq;

 using System.Text;

 using System.Windows.Forms;

 namespace doBezier

 {

     public partial class Form1 : Form

     {

         PointF[] p = new PointF[];   //存储控制点坐标

         int count;                    //记录已输入的控制点个数

         Graphics g;                  //GDI 对象

         public Form1()

         {

             InitializeComponent();

             g = CreateGraphics();

             count = ;

         }

         private void Form1_Load(object sender, EventArgs e)

         {

         }

         private void Form1_MouseClick(object sender, MouseEventArgs e)

         {

             if (e.Button == MouseButtons.Left)

             {

                 if (count == )      //如果输入的是第一个点,先清空窗口

                     g.Clear(BackColor);

                 g.FillRectangle(Brushes.Red, e.X - , e.Y - , , );  //输出一个标记

                 p[count] = new PointF(e.X, e.Y);                 //存储

                 count ;                                    //记录输入控制点个数

                 return;

             }

             else

             {

                 PointF q1 = new PointF();

                 PointF q2 = new PointF();

                 double u;

                 for (int i = ; i <= ; i )//生成100个点并连成折线

                 {

                     u = (double)i / 100.0;

                     if (i == )

                     {

                         q1 = deCasteljau(u);

                     }

                     else

                     {

                         q2 = deCasteljau(u);

                         g.DrawLine(Pens.Black, q1, q2);

                         q1.X = q2.X;

                         q1.Y = q2.Y;

                     }

                 }

                 count = ;

                 return;

             }

         }

         PointF deCasteljau(double u)   //曲线参数为u,函数返回一个二维点 

         {

             int i, k;

             //以下将控制点数组p[],复制到数组q[]

             PointF[] q = new PointF[];

             for (i = ; i < count; i )

             {

                 q[i].X = p[i].X;

                 q[i].Y = p[i].Y;

             }

             //以下用de Casteljau割角算法计算bezier曲线上参数点u对应的x,y,

             //计算完成后,结果存储在q[0]

             for (k = ; k < count; k )

                 for (i = ; i < count - k; i )

                 {

                     q[i].X = (float)(1.0 - u) * q[i].X   (float)u * q[i   ].X;

                     q[i].Y = (float)(1.0 - u) * q[i].Y   (float)u * q[i   ].Y;

                 }

             return new PointF(q[].X, q[].Y);

         }

         private void Form1_Paint(object sender, PaintEventArgs e)

         {

         }

     }

 }

C# 实现Bezier曲线(vs2008)的更多相关文章

  1. Bezier曲线的原理 及 二次Bezier曲线的实现

    原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...

  2. [摘抄] Bezier曲线、B样条和NURBS

    Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...

  3. 连续bezier曲线的实现

    需求场景 一系列的坐标点,划出一条平滑的曲线 3次Bezier曲线 基本上大部分绘图工具都实现了3次Bezier曲线,4个点确定一条3次Bezier曲线.以html5中的canvas为例 let ct ...

  4. 7.5.5编程实例-Bezier曲线曲面绘制

    (a)Bezier曲线                         (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ct ...

  5. 实验6 Bezier曲线生成

    1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier ...

  6. 简单而粗暴的方法画任意阶数Bezier曲线

    简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...

  7. python bezier 曲线

    1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...

  8. iOS Bezier曲线

    https://www.jianshu.com/p/2316f0d9db65 1. Bezier曲线 相关软件:PaintCode:可以直接画图,软件根据图像生产Bezier曲线 相关概念:UIBez ...

  9. Bezier曲线的实现——de Casteljau算法

    这学期同时上了计算机图形学和计算方法两门课,学到这部分的时候突然觉得de Casteljau递推算法特别像牛顿插值,尤其递推计算步骤很像牛顿差商表. 一开始用伯恩斯坦多项式计算Bezier曲线的时候, ...

随机推荐

  1. 流程控制之if判断,while循环,for循环

    if判断? 什么是if判断? 判断一个条件如果成立则做...不成立则... 为什么要有判断? 让计算机像人一样具备判断的能力 如何用if判断 if 条件1: code1    code2    cod ...

  2. Java微信二次开发(三)

    各种类型消息的封装 第一步:找到com.wtz.message.response包,新建类Image.java package com.wtz.message.response; /** * @aut ...

  3. 14Junit、反射、注解

    14Junit.反射.注解 14.1.1 Junit的概述      一般IDE都内置了junit,若需要自行下载jar包,可以访问官网,官网地址如下:http://www.junit.org 1. ...

  4. BZOJ3175[Tjoi2013]攻击装置——二分图最大独立集

    题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y- ...

  5. 【Linux】MGR部署脚本

    脚本没有完善,现在只有上半部分的基础环境搭建 [准备条件] 1.三个节点的防火墙关闭 2.原有mysql卸载删除 3.文件夹名字: mgr 所有的源码包都放在mgr的文件夹下 4.文件位置: /roo ...

  6. 画删除线的方法,如何找替代方法,Deprecated注释

    用@Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 那么相应的替代方法应 ...

  7. bat 脚本处理windows 文件

    背景:以下脚本使用了导出文件列表.移动文件.复制文件.report 系统信息.分段执行的功能 主要针对在从事于Easeware公司中,对软件Bug中,所需文件的提取. 代码片段说明: cls ver ...

  8. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  9. PKUWC 2019 记

     “连剑都插在了地上,可是我不应该就这么承认失败,想要到达山顶的人,不应该在山脚下就倒下啊” Day -5 (2019.1.15) 学考结束了,文化课暂停一段.早上飞机前往中山纪念中学.纪中好大呀,果 ...

  10. UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 9: illegal multibyte sequence

    最近对爬虫有点着迷, 在用bs4模块时,遇到报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 9: illeg ...