当前位置: 首页 > news >正文

实验10 Bezier曲线生成-实验提高-控制点生成B样条曲线

本代码根据已知控制点( 10, 5, 0 ),( 5, 10, 0 ),( -5, 15, 0 ),( -10, -5, 0 ),( 4, -4, 0 ),( 10, 5, 0 ), ( 5, 10, 0 ), ( -5, 15, 0 ), ( -10, -5, 0 ),( 10, 5, 0 )来生成三次B样条曲线。

#include<GL/glut.h>#include<stdio.h>#include<stdlib.h>#include<vector>usingnamespacestd;structPoint{floatc[2];float&x=c[0];float&y=c[1];Point(){x=0,y=0;}Point(floatx0,floaty0){x=x0,y=y0;}Point(constPoint&pt){x=pt.x,y=pt.y;}float&operator[](constinti){returnc[i];}};vector<Point>GctrlPt,GbsCurvePt;intGnumSegment=10;voidCalcBSPoints(){intnumCtrPt=GctrlPt.size();floatF0[2],F1[2],F2[2],F3[2];floatt=0;floatdt=1/(float)GnumSegment;//第一段NumSubSegment + 1个点,第二段之后每段为NumSubSegment个点,因为第二段之后的起点为前一段的终点intnumCurvePoint=(GnumSegment+1)+GnumSegment*(numCtrPt-4);GbsCurvePt.resize(numCurvePoint);//第一段起点编号为0,第二段之后的为1,原因见上for(inti=0;i<(numCtrPt-3);i++){for(intj=0;j<2;j++){F0[j]=(GctrlPt[i][j]+4*GctrlPt[1+i][j]+GctrlPt[2+i][j])/6.0f;F1[j]=(-3*GctrlPt[i][j]+3*GctrlPt[2+i][j])/6.0f;F2[j]=(3*GctrlPt[i][j]-6*GctrlPt[1+i][j]+3*GctrlPt[2+i][j])/6.0f;F3[j]=(-GctrlPt[i][j]+3*GctrlPt[1+i][j]-3*GctrlPt[2+i][j]+GctrlPt[3+i][j])/6.0f;}t=(i==0)?0:dt;//第一段起点参数为0,第二段之后的为dt,原因同上for(intj=(i==0)?0:1;j<GnumSegment+1;j++){for(intk=0;k<2;k++){GbsCurvePt[j+GnumSegment*i][k]=F0[k]+F1[k]*t+F2[k]*t*t+F3[k]*t*t*t;}t+=dt;}}}voidControlPoint(constvector<Point>&vpt){glPointSize(3);glBegin(GL_POINTS);for(unsignedinti=0;i<vpt.size();i++){glVertex2f(vpt[i].x,vpt[i].y);}glEnd();}voidPolylineGL(constvector<Point>&vpt){glBegin(GL_LINE_STRIP);for(unsignedinti=0;i<vpt.size();i++){glVertex2f(vpt[i].x,vpt[i].y);}glEnd();}voidmyDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);ControlPoint(GctrlPt);glColor3f(0.0f,1.0f,0.0f);PolylineGL(GctrlPt);if(GctrlPt.size()>=4){glColor3f(1.0f,1.0f,1.0f);CalcBSPoints();PolylineGL(GbsCurvePt);}glFlush();}voidInit(){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);floatpoints[9][3]={{10,5,0},{5,10,0},{-5,15,0},{-10,-5,0},{4,-4,0},{10,5,0},{5,10,0},{-5,15,0},{-10,-5,0}};Point pt;for(inti=0;i<9;i++){Point pt=Point(points[i][0],points[i][1]);GctrlPt.push_back(pt);}}voidmyReshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-30.0,30.0,-30.0*(GLfloat)h/(GLfloat)w,30.0*(GLfloat)h/(GLfloat)w,0.0,100.0);}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(640,480);glutCreateWindow("B-Spline Curve");Init();glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMainLoop();return0;}
http://www.jsqmd.com/news/1242045/

相关文章:

  • 结尾号召写不好,再好的AI文案也白费,深度拆解头部品牌私藏的7类高响应结尾结构
  • Mac开发环境配置全攻略:从基础到专业
  • AI论文写作工具:从选题到终稿的智能解决方案
  • AI Town地图编辑器入门:零基础构建自主AI虚拟世界
  • 分布式数据库Redis的简介、安装与设置使用指令
  • 从AI初稿到出版级干货:编辑总监绝不外传的4轮精修法(含可直接套用的Checklist表格)
  • 【私藏级推荐】:2024年唯一值得个人长期投入的3个轻量化AI模型(附量化教程+Mac/Win/Linux三端兼容配置)
  • 汽车密封件和磁材的AI视觉检测方案——缺陷分类与光学成像的工程原理
  • AI课程越来越多,为什么你还是学不会AI?
  • 政务与医疗大模型合规安全:在监管要求下落地 AI 防护
  • 邢台广宗县黄金回收|正规连锁门店全城上门高价回收(无套路) - 行行星
  • 深度市场分析:生产酒店客房管理门卡公司的发展现状与未来前景
  • 别心疼箱子ISTA3L专门模拟快递粗暴日常
  • 投票工具选型总结:按场景(校园/政务/企业/设计)推荐最佳平台
  • 2026最新江宁区空调/中央空调回收公司综合实力排行参考 - 起跑123
  • 本地无人直播系统对比哪家稳定
  • 从Figma到生成式UI,再到自动交付代码——AI一站式设计工作流全链路拆解(含可复用流程图谱)
  • 【AI搜索方案选型黄金法则】:20年架构师亲授5大核心维度、3类典型场景避坑指南(附2024最新技术雷达图)
  • Spring Security与JWT在前后端分离架构中的实践
  • 从0到月入3万AI副业实录:避开4大伪蓝海陷阱,用SWOT-PESTEL双模型精准卡位(含行业热力图)
  • 深入解析TI C2000 ePWM时间基准:同步机制与无毛刺更新实战
  • Android Studio 模拟器(AVD)安装与排错
  • 《学历之死:美国博士消亡史》核心内容概括
  • 2026 年 GPT-5.6 全面解析:核心区别、使用方法与开发者实践
  • 【Kimi网页阅读效率提升指南】:20年资深工程师亲授5个被99%用户忽略的高阶技巧
  • 2026 三亚实体转型新思路,AI+GEO 数字化适配本地文旅业态
  • Doxyfile模板文件
  • 全网更新!2026深圳芝柏官方维修点新址发布咨询热线同步换新 - 亨得利客户服务中心
  • Canvas粒子系统实现情绪化动画:从烟花易冷看代码艺术创作
  • 十佳/优秀主题投票活动发起指南:手机端快速操作步骤