这一章节的内容和“问题四十二”有点类似,或者说有点重复。
“问题四十二”的链接:http://blog.csdn.net/libing_zeng/article/details/54563752
但是,“问题四十二”中只能画圆环的片段,类似于如下图形:
我们现在要画的部分圆环图形类似于:
这种“部分圆环”,加上坐标轴,大概是这个样子:
为了画这种部分圆环,我们引入四个参数:phi1、phi2、theta1、theta2
phi1、phi2用来将圆环“切断”(和“问题四十二”是一样的);
theta1、theta2是用来将圆环“切开”。
理论分析
将圆环“切断”
具体做法:
1,将撞击点p投影到xoz平面,投影点为p';
2,op'和+x轴的夹角即为phi;
3,判断phi是否在[phi1,phi2]区间内。
将圆环“切开”
具体做法:
C++代码实现
核心代码截图如下:
测试图形
大半径2,小半径0.5,phi1=0度,phi2=270度,theta1=90度,theta2=360度
大半径2,小半径0.5,phi1=0度,phi2=360度,theta1=270度,theta2=360度
将如上图形中的法向量取反(对应的就是concave版本的圆环了)
其他说明
完整代码:(下载链接在下方评论中)
Referrance:
[1]. Kevin Suffern, Ray Tracing from theGround Up, A K Peters Ltd, 2007.