使用方法:鼠标左键点击画点,右键按住移动点

#include <GL/glut.h>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include<math.h>
#include<algorithm>
using namespace std;
bool mouseRightIsDown = false;
const int MAX = 100000;struct Point{int x, y;
};
vector<Point> v;void Reshape(int w, int h)      //两个参数:窗口被移动后大小
{glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, w, h, 0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();
}double powwer(double t, int a, int b, int c, int d)
{return a*t*t*t + b*t*t + c*t + d;
}
void  Draw(Point a,Point b,Point c,Point d){//B样条曲线double mult[4];int num = 555;double t;glColor3f(0, 0, 1);glBegin(GL_LINE_STRIP);for (int i = 1; i <= num; i++){t = (double)i / num;mult[0] = powwer(t, -1, 3, -3, 1);mult[1] = powwer(t, 3, -6, 0, 4);mult[2] = powwer(t, -3, 3, 3, 1);mult[3] = powwer(t, 1, 0, 0, 0);double x = 0, y = 0;x = mult[0] * a.x + mult[1] * b.x + mult[2] * c.x + mult[3] * d.x;y = mult[0] * a.y + mult[1] * b.y + mult[2] * c.y + mult[3] * d.y;x /= 6;y /= 6;glVertex2d(x, y);}glEnd();
}
int nearDistance(int x, int y){int flag = -1;int precision = 233;double min = MAX;for (int i = 0; i < v.size(); i++){double dis = (v[i].x - x)*(v[i].x - x) + (v[i].y - y)*(v[i].y - y);if (dis<precision){if (flag = -1){min = dis;flag = i;}if (dis < min){min=dis;flag = i;}}}return flag;
}
void myDisplay(){//画点glClearColor(1.0, 1.0, 1.0, 1.0);glClear(GL_COLOR_BUFFER_BIT);glPointSize(3);glLineWidth(3);glBegin(GL_POINTS);glColor3f(0.0, 0.0, 0.0);for (int i = 0; i<v.size(); i++)glVertex2f(v[i].x, v[i].y);glEnd();//连线glColor3d(0, 0, 0);glBegin(GL_LINE_STRIP);for (int i = 0; i < v.size(); i++)glVertex2d(v[i].x, v[i].y);glEnd();if (v.size()>=4){for (int i = 0; i < v.size() - 3;i++)Draw(v[i],v[i+1],v[i+2],v[i+3]);} glFlush();
}void mouse(int button, int state, int x, int y)
{//左键画点,右键移动if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){Point z;z.x = x;z.y = y;v.push_back(z);glutPostRedisplay();}if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)mouseRightIsDown = true;if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP)mouseRightIsDown = false;
}void motion(int x,int y)
{if (mouseRightIsDown){int flag = nearDistance(x,y);if (flag == -1)return;v[flag].x = x;v[flag].y = y;glutPostRedisplay();}
}
int main(int argc, char *argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(640, 480);glutCreateWindow("Hello World!");printf("\n\n\t\t鼠标左键点击画点,右键按住移动点\n");glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMouseFunc(mouse);glutMotionFunc(motion);glutMainLoop();return 0;
}

OpenG - 三次B样条曲线相关推荐

  1. 非均匀三次B样条曲线插值实现及MATLAB代码

    这篇博客跟我上一篇博客<均匀三次B样条曲线插值实现及MATLAB代码>的内容有点像,只是在基函数的计算上不同,造成均匀/非均匀的区别. 参考资料: [1](这个PPT讲得很通俗,但对于多插 ...

  2. 计算几何03_三次参数样条曲线与Cardinal曲线

    一.三次参数样条曲线 三次样条曲线的唯一缺点就是缺乏几何不变形.即当型值点发生几何变换时不能保证参数递增.因此提出了以弦长为参数的三次参数样条曲线. 1.1 定义 已知n个型值点Pi(xi, yi), ...

  3. 如何绘制三次B样条曲线

    B样条的定义就不赘述了,同学们可以参考大神的博客:http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/,中文翻译也有:http://blog.csdn. ...

  4. b样条和三次样条,二次与三次B样条曲线c 实现

    B样条曲线构建一条平滑曲线,接近而不通过控制点(首尾点除外).如图 B样条曲线从Bezier曲线演变而来,了解B样条曲线首先得了解Bezier曲线.对于平面上的三个点P0,P1,P2,其坐标分别是(x ...

  5. 均匀三次B样条曲线插值实现及MATLAB代码

    参考资料: [1](这个PPT讲得很通俗,但对于多插值点分段曲线的内容漏讲了一个知识点)三次周期B样条曲线的算法 - 百度文库 (baidu.com) [2](这个介绍只有两个插值点的三次B样条曲线, ...

  6. C#,计算几何,计算机图形学,三次B样条曲线插值算法(B-Spline Curve Interpolation)的基本原理及源代码

    1.发文初心 样条曲线插值应用挺多的,其实这方面的代码不少. 不过都有一些缺憾,大家使用起来不便利,因而特意改编一个供初学者使用. 本文的程序改编自... 上面的算法与程序有很大的局限性: (1)仅仅 ...

  7. matlab生成三维三次B样条曲线

    在对无人机进行路径规划的时候,往往需要对规划的路径点进行平滑操作,目前用的比较多的就是B样条曲线,下面的matlab脚本文件是我根据别人写的python程序改编而来的,后文会慢慢说明代码结构. cle ...

  8. 均匀三次b样条曲线_西门子数控曲线加工进给速度优化指令

    刀具切削轨迹的运行速度(进给速度)对加工质量.加工效率和刀具寿命有很大影响.本期就和大家聊聊进给速度控制这一话题. 1. 曲线加工的进给偏差 决定加工进给率大小的基本因素是刀具每齿切削的铁屑厚度h.它 ...

  9. B样条曲线介绍和实现(等值线平滑)

    B样条曲线介绍和实现(等值线平滑) 最近得到个任务是把之前的等值线光滑一下,思考良久决定用B样条去做平滑.虽然之前经常看到这个词条,但一直有正面接触,就趁着这次撸下来,做个总结吧. B样条曲线 B样条 ...

最新文章

  1. [HTTP协议]基础篇-待完结
  2. 深度学习前人精度很高了,该怎么创新?
  3. 用java写了一个汉诺塔
  4. query的list()和iterate()区别 面试题
  5. P1303 A*B Problem(python3实现)
  6. Java分割字符split与StringTokenizer
  7. [转]Centos 安装Sublime text 3
  8. 机器学习基础算法19-决策树实践-决策树回归-决策树用于拟合
  9. 使用linux批量引物设计,使用SSRMMD便捷、迅速与准确地进行:SSR位点检测,多态性SSR筛选,与批量SSR引物设计...
  10. BLUE引擎M2运行几天后就不可以施放合击技能的方法
  11. UmiJs整合Egg
  12. 计算机网络复习题(全套)
  13. 利用python脚本根据DOI号自动查询参考文献信息
  14. HTML网页设计制作 dreamweaver网页源代码 北京故宫旅游景点网站设计
  15. mac下用mysql执行sql文件完整
  16. Java多线程+IO流+网络编程+MySQL+JDBC编程实现多人联机版坦克大战
  17. Rust的错误处理机制
  18. NFS笔记(二)NFS服务器配置实例
  19. 模型损失函数变化曲线图_第3章 第6节 模型融合和提升的算法
  20. CNN卷积神经网络结构遐思

热门文章

  1. 五个好用的PDF软件推荐!
  2. Thinking in BigData(五)大数据之统计学与数据挖掘
  3. java正则表达式简单总结以及个别案例(手机号码,邮箱,座机号码)
  4. 法国大数据分析协作初创企业Dataiku获1400万美元风险投资
  5. 常见的文本特征(句向量)提取方法有哪些?什么是One-Hot、TF-IDF?word2vec如何训练?【Python】
  6. Pomelo PRC
  7. python解base16,base32,base64全家桶
  8. 半导体TEC高低温实验设备-风冷温控平台
  9. linux服务器里边ftp命令,Linux SSH使用FTP命令与另一台服务器的FTP的传输说明
  10. Trunk知识思维导图