C# 实现Bezier曲线(vs2008)
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)的更多相关文章
- Bezier曲线的原理 及 二次Bezier曲线的实现
原文地址:http://blog.csdn.net/jimi36/article/details/7792103 Bezier曲线的原理 Bezier曲线是应用于二维图形的曲线.曲线由顶点和控制点组成 ...
- [摘抄] Bezier曲线、B样条和NURBS
Bezier曲线.B样条和NURBS,NURBS是Non-Uniform Rational B-Splines的缩写,都是根据控制点来生成曲线的,那么他们有什么区别了?简单来说,就是: Bezier曲 ...
- 连续bezier曲线的实现
需求场景 一系列的坐标点,划出一条平滑的曲线 3次Bezier曲线 基本上大部分绘图工具都实现了3次Bezier曲线,4个点确定一条3次Bezier曲线.以html5中的canvas为例 let ct ...
- 7.5.5编程实例-Bezier曲线曲面绘制
(a)Bezier曲线 (b) Bezier曲面 1. 绘制Bezier曲线 #include <GL/glut.h> GLfloat ct ...
- 实验6 Bezier曲线生成
1.实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法. 2.实验内容: (1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier ...
- 简单而粗暴的方法画任意阶数Bezier曲线
简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...
- python bezier 曲线
1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...
- iOS Bezier曲线
https://www.jianshu.com/p/2316f0d9db65 1. Bezier曲线 相关软件:PaintCode:可以直接画图,软件根据图像生产Bezier曲线 相关概念:UIBez ...
- Bezier曲线的实现——de Casteljau算法
这学期同时上了计算机图形学和计算方法两门课,学到这部分的时候突然觉得de Casteljau递推算法特别像牛顿插值,尤其递推计算步骤很像牛顿差商表. 一开始用伯恩斯坦多项式计算Bezier曲线的时候, ...
随机推荐
- Sqlserver 系统视图简单说明
1. 查看系统视图的sql语句 select * from sys.system_views 2. 查看所有的 dynamic management 视图的sql select * from sys. ...
- 通过反射来读取XML格式的ControlTemplate
在之前的一个WPF项目中,由于设置控件模板在前台xaml中读取失败,由此想到了通过反射的形式来读取该模板,首先将该模板写入一个xml文件中,然后再读取该xml文件,在这里首先介绍一下:资源和嵌入式资源 ...
- spring学习总结(一)_Ioc基础(下)
本篇文章继续上篇文章讲解Ioc基础,这篇文章主要介绍零配置实现ioc,现在相信大家项目中也基本都是没有了xml配置文件.废话不多说.一起学习 代码示例 BookDao.java package com ...
- HTMl Dom操作
訪問: getElementById():帶回指定id的所有元素 getElementByTagName():帶回指定標籤名的所有的元素 getElementByClassName():帶回指定類型名 ...
- c++ 为自定义类添加stl遍历器风格的遍历方式
为仿照stl的遍历风格,实现对自定义类型的遍历. 1. 需要遍历的基础结构: struct ConnectionPtr { int id_; int port_; string addr_; //st ...
- 通俗理解TCP/IP协议三次握手四次分手流程
转自:https://blog.csdn.net/special23/article/details/54137298 三次握手流程 客户端发个请求“开门呐,我要进来”给服务器 服务器发个“进来吧,我 ...
- MT【73】求函数表达式
评:由关系式求表达式最经典的莫过于已知$f(x+y)=f(x)f(y)$利用柯西法求得 $f(x)=[f(1)]^x$
- MT【9】绝对值二次函数
解答: 评:容易用绝对值不等式证明当$x\in[1,5]$时$|x^2+px+q|\ge2$
- 获取外网出口ip
curl ifconfig.me 或 curl cip.cc
- 自学Zabbix9.4 zabbix low-level discover底层发现(zabbix批量部署必备)
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.4 zabbix low-level discover底层发现(zabbix批 ...