[图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)
http://blog.csdn.net/mahabharata_/article/details/71856907
大二的时候,曾受老师所托,用C++而不是OpenGL去写B样条曲线的教学程序。时隔一年,发现源码找不见了,所以重新写了一遍,也完善了部分功能,顺便发一篇博客分享一下。
这里给出的资源有:两个打包程序、最新版本的源代码。
下载链接:(使用时请注明出处哦~~ )
1. (新版本)源代码:http://download.csdn.net/detail/mahabharata_/9841652
2. (新版本)演示程序:http://download.csdn.net/detail/mahabharata_/9841677
3. (旧版本)演示程序:http://download.csdn.net/detail/mahabharata_/9814823
程序的截图如下:
说明: 两个版本都是使用纯Qt实现的,没有使用OpenGL所以非常方便阅读。如需要使用win32、MFC等框架编写,也只需在此基础上做简单的修改。
功能:
1. 鼠标左键可以添加新控制点,也可以选中并拖动已有的控制点。
2. 支持1次、2次、3次的B-Spline曲线(即2阶、3阶、4阶)
3. 可以选择是否显示曲线上关键结点的位置和标号,以及控制点的标号。
4. Backspace删除末端控制点,C键清屏。
B样条曲线的相关知识:
定义:给定n+1个控制点{P0、P1、......、Pn},每个控制点都有对应的一个基函数Ni,p(u),其中u为自变量,i为第i个结点,p为曲线的次数(次数=阶数-1),则可以用下式来定义B样条曲线:
(定义域: p≤ u ≤ n+1,事实上定义域的上限取多少无所谓)
根据定义,可以发现B样条曲线上的每一个点其实是:所有控制点的一个加权平均。这里的“权”由基函数Ni,p(u)确定。随着u从下限p逐渐增长,控制点对应的基函数的取值也会随之变化,从而产生曲线上新的点。
关于基函数Ni,p(u),可以由Cox-de Boor公式得出。这里给出三个简单的基函数的示例:
(1)当曲线次数p=1时,基函数Ni,1(u)为:
(2)当曲线次数p=2时,基函数Ni,2(u)为:
(3)当曲线次数p=3时,基函数Ni,3(u)为:
[图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)的更多相关文章
- 【原】 Spark中Task的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Stage的提交 http://www.cnblogs.com/yourarebest/p/5356769.html Spark中 ...
- 【原】Spark中Stage的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Job如何划分为Stage http://www.cnblogs.com/yourarebest/p/5342424.html 1 ...
- 【原】Spark中Job的提交源码解读
版权声明:本文为原创文章,未经允许不得转载. Spark程序程序job的运行是通过actions算子触发的,每一个action算子其实是一个runJob方法的运行,详见文章 SparkContex源码 ...
- 点单登录原理和java实现简单的单点登录
引用自:http://blog.csdn.net/zuoluoboy/article/details/12851725 摘要: 单点登录(SSO)的技术被越来越广泛地应用到各个领域的软件系统当中.本文 ...
- iOS开发UI篇—程序启动原理和UIApplication
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- iOS开发UI篇—程序启动原理和UIApplication1
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- 程序启动原理和UIApplication
iOS开发UI篇—程序启动原理和UIApplication 一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就 ...
- Jquery+ajax+json+servlet原理和Demo
Jquery+ajax+json+servlet原理和Demo 大致过程: 用户时间点击,触发js,设置$.ajax,开始请求.服务器响应,获取ajax传递的值,然后处理.以JSON格式返回给ajax ...
- Mybatis插件原理和PageHelper结合实战分页插件(七)
今天和大家分享下mybatis的一个分页插件PageHelper,在讲解PageHelper之前我们需要先了解下mybatis的插件原理.PageHelper 的官方网站:https://github ...
随机推荐
- javascript 之 数组
定义:var colors=new Array(); var colors=new Array(3); var colors=new Array('red'); var colors=['red',' ...
- bzoj1452 [JSOI2009]Count ——二维树状数组
中文题面,给你一个矩阵,每一个格子有数字,有两种操作. 1. 把i行j列的值更改 2. 询问两个角坐标分别为(x1,y1) (x2,y2)的矩形内有几个值为z的点. 这一题的特点就是给出的z的数据范围 ...
- Oracle配置SQL空间操作要点说明
前面配置PL/SQL直接通过SQL查询SDE空间数据库,网上已有诸多示例, 常见问题如下: ORA-06520: PL/SQL: 加载外部库时出错ORA-06522: Unable to load D ...
- jenkin服务关闭和重启
1.关闭Jenkins http://localhost:8080/exit 2.重启Jenkies http://localhost:8080/restart 3.重新加载配置信息 http://l ...
- Django 应用程序 + 模型 + 基本数据访问
如果你只是建造一个简单的web站点,那么可能你只需要一个app就可以了.如果是复杂的象 电子商务之类的Web站点,你可能需要把这些功能划分成不同的app,以便以后重用. 确实,你还可以不用创建app, ...
- docker 中安装 rabbitMQ
安装rabbitMQ的命令 docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=admin -e RAB ...
- Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)
一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e. substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...
- iptables命令使用详解
iptables的主要功能是实现对网络数据包进出设备及转发的控制.当数据包需要进入设备.从设备中流出或者经该设备转发.路由时,都可以使用iptables进行控制. 环境 操作系统:CentOS7.3 ...
- ECharts前端图形展示
这次负责慢查询预警,前后端都是自己处理,这次遇到了前端作图的需求,做一个记录以便后续使用: 使用的作图方式是ECharts,相应的example官方有相应的文档和使用方法,比较简单,一下只贴链接: h ...
- Petrozavodsk Winter Camp, Day 8, 2014, Second Trip
给你一棵树,每次询问一个(a,b),问有多少有路径与a-b没有交集 找lca #include <bits/stdc++.h> using namespace std; #define r ...