“问题六十:怎么用ray tracing画回旋体(rotational sweeping / revolution)”中的“基本曲线”是由三次b-spline曲线段拼接而成。

在这一章节,我们以其中一段曲线段为例,改变其对应的控制点,看看曲线段形状的改变,同时也看看对应的回旋体图形的改变。

控制点坐标如下图:

“问题六十”中的“基本曲线”的控制点对应如上ABCDEF六个点(其中A点在1位置)。对应输出的回旋体图形如下(再次贴出来):

说明一下:

1,由于我们接下来测试时的lookfrom坐标和“问题六十”中的坐标是有差异的,所以,输出的图形立体呈现是有差异的。

2,接下来,我们图片中的曲线段是从回旋体上切下来的,会得到两条关于y轴对称的曲线段,实际的“基本曲线”中的曲线段对应其中的一条。

我们知道如上回旋体的“基本曲线”是有三段三次b-spline曲线段拼接而成,分别对应的控制点为ABCD、BCDE、CDEF。

我们接下来要测试的是控制点ABCD对应的曲线段。

测试方式:BCD的位置保持不变,A点的位置依次如下改变(12,7,6,2,1,3,5,4,8,9,10,11),然后对比这12中情况的曲线段的变化情况和对应回旋体的变化情况。

//12vec3 ctrl_points[6] = {vec3(-2.0, -3.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//7vec3 ctrl_points[6] = {vec3(-4.0,  0.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//6vec3 ctrl_points[6] = {vec3(-4.0,  2.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//2vec3 ctrl_points[6] = {vec3(-4.0,  5.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//1vec3 ctrl_points[6] = {vec3(-1.0,  5.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//3vec3 ctrl_points[6] = {vec3( 2.0,  5.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//5vec3 ctrl_points[6] = {vec3( 2.0,  7.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//4vec3 ctrl_points[6] = {vec3( 4.0,  5.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//8--discover some problemsvec3 ctrl_points[6] = {vec3( 4.0,  4.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//9vec3 ctrl_points[6] = {vec3( 4.0,  2.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//10vec3 ctrl_points[6] = {vec3( 4.0,  0.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

//11vec3 ctrl_points[6] = {vec3( 3.0, -5.0,  0.0), vec3( 2.0,  4.0,  0.0),vec3( 2.0,  1.0,  0.0), vec3(-0.5,  1.0,  0.0),vec3( 1.5, -3.0,  0.0), vec3( 3.0,  0.0,  0.0)};

接下来,贴一份A在1位置的完整拆解图形:

=++

=++

最后,说一下,“曲线段”是怎么从回旋体中切出来的呢?

只需要对“一元六次方程”的根对应的z坐标的范围加以限制即可。对应修改的代码:

                roots_equation_6th(ss6, 0, 1, tol, roots);for (int j=1; j<(int(roots[0])+1); j++) {yyv = matrix_c_v[0][i]+matrix_c_v[1][i]*roots[j]+matrix_c_v[2][i]*roots[j]*roots[j]+matrix_c_v[3][i]*roots[j]*roots[j]*roots[j];roots_t[num_roots_t+1][0] = (yyv-yy0)/yyd;

rec.t = roots_t[num_roots_t+1][0];
                    rec.p = r.point_at_parameter(rec.t);
                    if (fabs(rec.p.z())<0.5) {

                        roots_t[num_roots_t+1][1] = i;roots_t[num_roots_t+1][2] = roots[j];num_roots_t ++;

}

                }}roots_t[0][0] = float(num_roots_t);

问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例相关推荐

  1. 问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应——以回旋体的“基本曲线”为例(2)

    前续"问题六十一:三次b样条(b-spline)曲线的控制点和曲线形状的对应--以回旋体的"基本曲线"为例" 之前是保持控制点BCDEF不变,只改变A的位置. ...

  2. B样条数据点反求控制点绘制曲线(源码)

    一.软件功能需求 1)所设计的软件应具有图形化用户界面(GUI): 2)用户在软件界面上可用随机数方式或手工方式输入若干曲线或曲面的数据点,例如起点.终点.列表型值点等,对于曲线,还可设置步长参数:对 ...

  3. 问题六十:怎么用ray tracing画回旋体(rotational sweeping / revolution)

    60.1 概述 回旋体,大概是长这个样子: 回旋体是指曲线(称为"基本曲线")围绕y轴转一圈得到的图形. (基本曲线是由多段b-spline曲线段连接而成) 这里先强调一下: 上图 ...

  4. Android开发笔记(六十一)文件下载管理DownloadManager

    下载管理DownloadManager 文件下载其实是网络数据访问的一种特殊形式,使用普通的http请求也能完成,就是实现起来会繁琐一些.因为下载功能比较常用,而且业务功能相对统一,所以从Androi ...

  5. 打怪升级之小白的大数据之旅(六十一)<Hive旅程第二站:Hive安装>

    打怪升级之小白的大数据之旅(六十一) Hive旅程第二站:Hive安装 上次回顾 上一章我们学习了Hive的概念以及框架原理,本章节是对Hive的安装进行分享,因为它有些需要自己配置的点,所以我单独开 ...

  6. 【正点原子Linux连载】第六十一章 Linux I2C驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. [Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

  8. 第六十一章 SQL函数 GREATEST

    文章目录 第六十一章 SQL函数 GREATEST 大纲 参数 描述 返回值数据类型 示例 第六十一章 SQL函数 GREATEST 从一系列表达式中返回最大值的函数. 大纲 GREATEST(exp ...

  9. boost::math模块实现将三次 b 样条插值器用于规则间隔的数据的测试程序

    boost::math模块实现将三次 b 样条插值器用于规则间隔的数据的测试程序 实现功能 C++实现代码 实现功能 boost::math模块实现将三次 b 样条插值器用于规则间隔的数据的测试程序 ...

最新文章

  1. java中字符串的创建_【转载】 Java中String类型的两种创建方式
  2. 训练数据集时为何要先加载预训练模型作为初始化,这样做有何好处?
  3. 镀铬亮条怎么修复_老车修复:翻新小改一辆破烂不堪的经典MINI,完美大变样...
  4. WPF 实现 DataGrid/ListView 分页控件
  5. linux的oracle修改实例名SID
  6. Socket基础知识分享
  7. Go语言中协程的概念和基本使用
  8. 有关无限极分类并排序问题
  9. windows下如何安装ipython_Windows下IPython安装
  10. 叠积木(加权并查集)
  11. 【JAVA自学笔记 DAY01】Java基础入门
  12. 工作之余的抓包乐趣,fiddler抓包、Wireshark抓包
  13. 最新在线客服系统php代码微信软件公众号小程序app二维码聊天网站源码
  14. Python实战笔记-常用知识点
  15. 接口测试面试题汇总(含答案)
  16. 第四章 ContextCapture 19 空三控制点平差
  17. c语言中ch的作用,C语言中IN(ch,OP)是什么意思
  18. CentOS7基础学习笔记
  19. 2020-10-2 大二2020下训练三
  20. 第5节:开发微信小程序之文档详解

热门文章

  1. Android学习之适配器SimpleCursorAdapter
  2. CGAffineTransform 获取 旋转的弧度 和 角度 的方法
  3. 剑指offer——面试题21:包含min函数的栈
  4. 《编程之美》1.3一摞烙饼的排序
  5. AB=C型向量分解思路思考
  6. ffmpeg视频播放、格式转化、缩放等命令
  7. ubuntu16.04装机1:安装NVIDIA显卡驱动(下载.run包方式)
  8. python 使用 plt.savefig() 保存图片去除旁边的空白区域
  9. python基础:os.path的相关操作
  10. Go 系列教程 —— 26. 结构体取代类