第七步:用“笛卡尔”方法解一元四次方程

“笛卡尔”方法也就是“待定系数法”

通过“式子八”可以解出s(可能有0到3个实根,这里真的可以随便取一个大于等于0的实根,因为“式子四”是两个式子乘积等于0,而不像“费拉里”方法中参数y的选择);

将s代入“式子七”得到k;

将k代入“式子五”得到m、t;

将k、m、t代入“式子四”得到两个一元二次方程,可以解出实根y;

将y代入“式子二”得到原方程的根x;

对应代码:

bool roots_quartic_equation2(float a, float b, float c, float d, float e, float (&roots)[5]) {//the first element is the number of the real roots, and other elements are the real roots.//Descartes's Method.if (a == 0) {float *roots3;roots3 = roots_cubic_equation(b, c, d, e);for (int i=0; i<int(roots3[0])+1; i++) {roots[i] = roots3[i];}delete [] roots3;}else {float a1 = b/a;float b1 = c/a;float c1 = d/a;float d1 = e/a;float p = (-3*a1*a1)/8 + b1;float q = (a1*a1*a1)/8 - (a1*b1)/2 + c1;float r = (-3*a1*a1*a1*a1)/256 + (a1*a1*b1)/16 - (a1*c1)/4 + d1;float sa = 2*p;float sb = p*p - 4*r;float sc = -q*q;float k, m, t;float *roots_s = roots_cubic_equation(1.0, sa, sb, sc);for (int i=1; i<int(roots_s[0])+1; i++) {if (roots_s[i] >= 0) {//随便选一个大于等于0的实根k = sqrt(roots_s[i]);break;}else {if (i == roots_s[0]) {
/*如果遍历完了,还没有选到大于等于0的实根,说明所有实根都小于0,说明k无解,m、t无解,说明y无解,说明x无解*/roots[0] = 0.0;delete [] roots_s;return true;}}}delete [] roots_s;if (k == 0) {float *roots2;roots2 = roots_quadratic_equation(1, -p, r);if (roots2[0] == 0.0) {roots[0] = 0.0;delete [] roots2;return true;}else {m = roots2[1];t = roots2[2];}delete [] roots2;}else {m = (k*k*k + k*p + q) / (2*k);t = (k*k*k + k*p - q) / (2*k);}float *roots_y1;float *roots_y2;roots_y1 = roots_quadratic_equation(1.0, k, t);roots_y2 = roots_quadratic_equation(1.0, -k, m);if (roots_y1[0] != 0) {for (int i=1; i<roots_y1[0]+1; i++) {roots[i] = roots_y1[i] - a1/4;}}if (roots_y2[0] != 0) {int roots_y1_number = int(roots_y1[0]);for (int j=1; j<roots_y2[0]+1; j++) {roots[roots_y1_number+j] =roots_y2[j] - a1/4;}}roots[0] = roots_y1[0] + roots_y2[0];delete [] roots_y1;delete [] roots_y2;}return true;
}

接下来用新的解一元四次方程的函数验证一下“第五步”中的那个“多余”实根

main()中的代码:

        float roots[5];if (roots_quartic_equation2(159.627808, -909.279724, 2056.90576, -2171.1167, 891.264038, roots)) {for (int i=0; i<(roots[0]+1); i++) {std::cout << "roots[" << i << "]=" << roots[i] << endl;}}

输出结果:

第八步:验证新的解一元四次方程的函数的效果

修改bool tori::hit(const ray& r, float t_min, float t_max,hit_record& rec) const{}

中调用一元四次方程的代码如下:

输出图片如下:

对比“第二步”中的问题图片:

加上绿环,将单个像素点的采样次数设回100后的图片:

对比本章节最开始的问题图片:

哦也~~搞定~~

问题四十:对ray tracing圆环图形进行debug(2)——C++,用“笛卡尔”方法解一元四次方程相关推荐

  1. 问题四十三:对ray tracing圆环图形中的细微问题进行修正

    第一步:将上一章节最后一张图放大,看局部 有两处问题: 其一:蓝色圈内,出现多余的红色像素点 其二:黄色圈内,出现多余的白色像素点(也就是原本应该出现的红色像素点没有出现) 第二步:去掉其它圆环和圆柱 ...

  2. MATLAB应用实战系列(四十五)-matlab任意图形轮廓坐标提取【含源代码】

    细心的伙伴不难发现上图的每个图形外面都画了一圈黑色虚线,不错,这些虚线就是根据图形轮廓提取的图像坐标绘制的. 之前有伙伴在咱们的QQ交流群中询问有关图像轮廓坐标提取的问题,今天就给大家念叨念叨. 今天 ...

  3. 《An Introduction to Ray Tracing》—— 3.3 Ray-Surface Intersections

    总结<An Introduction to Ray Tracing>全文:点这里http://blog.csdn.net/libing_zeng/article/details/72603 ...

  4. 问题六十七:ray tracing学习总结(2016.11.13, 2017.02.05)

    从2016.11.13开始接触ray tracing到今天2017.02.05,差不多80天的时间.截至当前,学习ray tracing的过程,也是我重新找回自己或者说是"find what ...

  5. 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  6. 《红楼梦》后四十回真假辨析——数据挖掘之关联规则挖掘

    前言 很多人都听说过<红楼梦>的后四十回并非曹雪芹所著.本文就是用关联规则挖掘的方法,验证红楼梦后四十回与前八十回之间的用词差异. 基本概念定义 关联:自然界中某种事物发生时,其他事物也会 ...

  7. 问题六十六:怎么用ray tracing画CSG(Constructive Solid Geometry 构造实体几何)图形

    66.1 概述 什么是CSG图形? 若干简单图形通过集合运算后得到的复杂图形,被称为"CSG图形". 其中"简单图形",包括:sphere, box, cyli ...

  8. 问题五十四:怎么用ray tracing画参数方程表示的曲面(2)—— bezier surface

    首先,需要说明的是: 这一章节可以看作"问题五十三"的另一个例子--bicubic bezier surface: 之前已经用"球面"和"牛角面&qu ...

  9. 问题四十八:怎么用ray tracing画superhyperboloid(超级双曲面)

    48.1 数学推导 Superhyperboloid的方程和"问题四十六"中描述的superellipsoid的如下方程非常接近. 到获得迭代格式,超级双曲面和超级椭圆面的推导是相 ...

最新文章

  1. 【DP】[ZJOI2008][HYSBZ/BZOJ1037]生日聚会Party
  2. [转]侯捷对进入IT行业的年轻人的建议
  3. php微信撤回消息,78行Python代码实现现微信撤回消息功能
  4. Windows Server 2008 R2卸载干净ORACLE 11G
  5. 基于HMM的中文分词
  6. Unity基础知识学习笔记二
  7. [react] react非父子组件如何通信?
  8. 解决: cp -rf 命令中参数 -f 失效 ( 依旧要手动确认 )
  9. 这个关系国计民生的“黑盒子” 我们造出来了
  10. matlab数据处理 书,matlab数据处理记录
  11. ORA-00376: file X cannot be read at this time 问题解决
  12. Python基础7(集合与深浅copy)
  13. openssl 加盐_nodejs-md5加盐到解密比对
  14. java 生成高清缩略图_java生成高清缩略图
  15. 屏幕录像软件无法录制电脑视频解决办法
  16. SQL SERVER STATISTICS
  17. 计算机二级请假条,单位员工病假请假条范文模板
  18. IP地址、路由器、数据分片、地址管理、子网掩码、路由选择、公网与私网
  19. 初识CornerNet
  20. ubuntu插件配置

热门文章

  1. shell中if条件字符串、数字比对,` `和[ ]区别
  2. hdu2063+hdu1083(最大匹配数)
  3. ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案
  4. 使用Adobe acrobat压缩pdf大小
  5. Python中如何获得数组或者列表按大小排序后元素的索引列表
  6. python : 使用 __future__ 的作用
  7. Java序列化技术即将被废除!!!
  8. Repeater控件的
  9. C#资源,自定义控件等
  10. 【转】socket提交http表单 [C++]