继续初步学习细分曲线曲面阶段,先是细分曲线,首先接触的是Chaikin细分,其计算规则非常简单,就是一个割角过程,其最终收敛到2次B样条曲线

索性我做了点为了以后工作方便的事情。改写了一下之前的2次B样条曲线

#include<GL/GLUT.H>
#include <windows.h>
#include <math.h>
#include <gl/GL.h>        GLfloat ctrlPoints[4][2] =
{{ -0.8f, 0.1f }, { -0.4f, 0.6f }, { 0.2f, 0.8f }, { 0.7f, 0.2f }
};void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glPointSize(3);glColor3f(1.0, 0.0, 0.0);for (int i = 0; i < 4; i++){glBegin(GL_POINTS);glVertex2fv(&ctrlPoints[i][0]);glEnd();}glColor3f(0.0, 0.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i < 4; i++){glVertex2fv(&ctrlPoints[i][0]);}glEnd();GLfloat ps1[11][2];GLfloat ps2[11][2];GLint i = 0;for (double t = 0.0; t <= 1.0; t += 0.1){double a1 = pow((1 - t), 2) / 2;double a2 = (1 + 2 * t - 2 * t*t) / 2;double a3 = t*t / 2;ps1[i][0] = a1*ctrlPoints[0][0] + a2*ctrlPoints[1][0] + a3*ctrlPoints[2][0];ps1[i][1] = a1*ctrlPoints[0][1] + a2*ctrlPoints[1][1] + a3*ctrlPoints[2][1];ps2[i][0] = a1*ctrlPoints[1][0] + a2*ctrlPoints[2][0] + a3*ctrlPoints[3][0];ps2[i][1] = a1*ctrlPoints[1][1] + a2*ctrlPoints[2][1] + a3*ctrlPoints[3][1];i = i + 1;}glColor3f(1.0, 1.0, 0.0);glBegin(GL_LINE_STRIP);for (int i = 0; i < 11; i++){glVertex2fv(ps1[i]);}glEnd();glBegin(GL_LINE_STRIP);for (int i = 0; i < 11; i++){glVertex2fv(ps2[i]);}glEnd();glFlush();
}int main(int argc, char *argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;
}

然后是现在的Chaikin细分

<pre name="code" class="cpp">#include<GL/GLUT.H>
#include <windows.h>
#include <math.h>
#include <gl/GL.h>
#define N 4GLfloat ctrlPoints[4][2] =
{{ -0.8f, 0.1f }, { -0.4f, 0.6f }, { 0.2f, 0.8f }, { 0.7f, 0.2f }
};void myDisplay(void) {glClear(GL_COLOR_BUFFER_BIT);glPointSize(3);glColor3f(1.0, 0.0, 0.0);for (int i = 0; i < 4; i++) {glBegin(GL_POINTS);glVertex2fv(&ctrlPoints[i][0]);glEnd();}glColor3f(0.0, 0.0, 1.0);glBegin(GL_LINE_STRIP);for (int i = 0; i < 4; i++) {glVertex2fv(&ctrlPoints[i][0]);}glEnd();int n1 = N;//表示之前的顶点数int n = 2 * (N - 2) + 2;//表示细分一次的顶点数GLfloat ps2[4][30][2];for (int i = 0; i < 4; i++){ps2[0][i][0] = ctrlPoints[i][0];ps2[0][i][1] = ctrlPoints[i][1];}for (int i = 0; i < 3; i++){ ps2[i + 1][0][0] = ps2[i][0][0];ps2[i + 1][0][1] = ps2[i][0][1];ps2[i+1][n - 1][0] = ps2[i][n1 - 1][0];ps2[i+1][n - 1][1] = ps2[i][n1 - 1][1];//计算中间的点for (int j = n1 - 2; j > 0; j--){ps2[i+1][2 * j - 1][0] = 3 * ps2[i][j][0] / 4 + ps2[i][j - 1][0] / 4;ps2[i+1][2 * j - 1][1] = 3 * ps2[i][j][1] / 4 + ps2[i][j - 1][1] / 4;ps2[i+1][2 * j][0] = 3 * ps2[i][j][0] / 4 + ps2[i][j + 1][0] / 4;ps2[i+1][2 * j][1] = 3 * ps2[i][j][1] / 4 + ps2[i][j + 1][1] / 4;}if (i==0)glColor3f(1.0, 0.0, 1.0);else{if (i==1){glColor3f(0.75, 0.8, 0.3);}else glColor3f(0.5, 0.8, 0.8);}glBegin(GL_LINE_STRIP);for (int w = 0; w < n; w++){glVertex2fv(ps2[i+1][w]);}glEnd();n1 = n;n = 2 * (n - 2) + 2;}glFlush();
}int main(int argc, char *argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;
}

效果如下

附上和上次2次B样条的对比

Chaikin细分和2次B样条
Chaikin细分 2次B样条

我这里专门没画出来第一个点和最后一个点,为的就是看得出来和2次B样条的对比,经过对比发现还是一样的,之后进入曲面细分部分

Chaikin细分曲线相关推荐

  1. DOO-SABIN 细分正方体(1)利用邻接矩阵表示

    做好了CHAIKIN细分曲线之后,我着手做DOO-SABIN细分曲面,这是细分曲面中最简单的例子,本来以为很容易就能实现,后来发现自己真的是弱的可以,另外补充一下,充分意识到数据结构的用处,比如利用点 ...

  2. DOO-SABIN 细分曲面(编辑中)

    之前实现了简单的细分曲线,即Chaikin细分算法,现在准备实现DooSabine细分曲面 我这里借助http://www.idav.ucdavis.edu/education/CAGDNotes/C ...

  3. B-样条曲线——动机 Motivation

    B-样条曲线--动机 Motivation 上一页 回目录 下一页 定义 考虑设计一个花瓶的剖面图.下图左边是11次(degree)的贝塞尔曲线:但是它很难弯曲瓶颈到线段 P4P5.当然,我们可以在这 ...

  4. 前端动画之贝塞尔曲线推导及应用

    hello,大家好,今天豆皮范儿给大家带来了贝塞尔曲线推导和应用,优美的贝塞尔曲线想起了大学时候老师在给我们讲如何实现,如何推导,如何实现和应用.本来也来详细介绍一下,纯纯的干货- 作者:lff 生活 ...

  5. 有关基于细分曲面造型系统的探讨

    细分方法是二十世纪七十年代逐渐发展起来的一种造型技术,因其思想简洁而受人们青睐.细分是一种很好的多分辨率表示形式,最早用于光滑曲线,后来引入到计算机图形学领域.细分从曲线扩展到曲面,人们提出很多种细分 ...

  6. 7.物体的几何表示——细分曲面

    ♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥ ...

  7. Games102 学习笔记

    Games 102 P2 数据拟合 拟合数据的好坏 分段线性插值函数 y = f 1 ( x ) y=f_1(x) y=f1​(x),数据误差为0,只有 C 0 C_0 C0​连续. 光滑插值函数 y ...

  8. 动效引擎_汇众教育 | 高级引擎视效包装设计

    伴随着5G和人工智能时代的到来,影视.动漫.游戏产业飞速发展.与此同时,虚幻引擎4 ( Unreal Engine 4,简称UE4)作为一套面向任何使用实时技术工作用户的完整开发工具,将为那些具备虚幻 ...

  9. java geom_java.awt.geom 类 Area - Java 中文参考手册

    java.lang.Object java.awt.geom.Area 所有已实现的接口:Shape, Cloneable public class Areaextends Objectimpleme ...

最新文章

  1. pythonrequest爬取小说,pythonrequest爬取小说_python爬取斗破苍穹小说
  2. Oracle Rman 命令详解(List report backup configure)
  3. 系列(六)—Linux命令
  4. Java 打包 FatJar 方法小结
  5. GRPC: 如何实现分布式日志跟踪?
  6. 计算机板报设计简单,计算机板报制作
  7. 程序员面试金典——5.3最接近的数
  8. 【重磅预告】揭秘阿里双11技术进步历程!
  9. 超强大几十款功能组合而成的一款工具箱微信小程序源码下载支持N个流量主
  10. 第1关:身份证归属地查询
  11. 火狐浏览器设置cookie失败_如何启用火狐浏览器的Cookie功能 这些经验不可多得...
  12. git 记住账号密码、忽略部分文件、合并分支、将远程分支拉取到本地
  13. 暑假2019培训:Day3Day4提高组测试赛
  14. 第四次工业革命与龙的故事
  15. IDEA 启动项目报错 Shorten the command line via JAR manifest or via a classpath file and rerun
  16. java 6u45 no sni 2_sjscxz.taobao.com
  17. 数学-快速心算:快速心算
  18. 生于七八十年代,我们的童年是这样的
  19. 网络io和磁盘io_在磁盘IO上,第1部分:IO的风味
  20. LDO系列--PSRR

热门文章

  1. Large-Scale Volumetric Scene Reconstruction using LiDAR
  2. python-今日头条图片的爬取(搜索标题为汽车)
  3. 在学校玩计算机被发现的检讨书,高中生玩手机被发现检讨书
  4. 【语音分析】短时自相关基音周期检测+LPC预测增益计算【含Matlab源码 1517期】
  5. 【Linux】 RAID磁盘阵列
  6. 华为5G折叠手机采用京东方OLED面板,凸显后者的技术突破
  7. Capstone 音视频转换HDMI转VGA方案|typec转HDMI拓展坞方案|CS5265 CS5266 CS5267 CS5268 CS5269 CS5210 CS5213 CS5216
  8. ctr镜像导入报错ctr: content digest sha256:xxxxxx not found
  9. 第七届计算机信息素养大赛,第七届全国大学生计算机应用能力与信息素养大赛技术规范.PDF...
  10. (二)从零开始学人工智能—数学基础:线性代数