2003-1-6
【程序编程相关:SCCS Chapter 6】新的一年开始了,在这里我祝所有阅读过looking开发日记的程序员朋友们新年快乐.工作愉快. 【推荐阅读:sccs Command】
【扩展信息:SCCS Chapter 5】 最近东北的天气异常寒冷,不过,我很喜欢这种天气.每当我工作了一个通宵,清晨,我都会来到阳台,呼吸着冰冷的空气,在耀眼的阳光照耀下,周围一片萧杀,那真是一种别样的感觉.在我的程序人生里,很多重要的项目都是在这样的季节完成的,因此,我喜欢这样的季节. 在上一篇looking日记中我提到了t-junctions,在这里我解释一下为什么会出现这种现象.t-junctions的存在是由于浮点运算的误差所导致的.如下面的图片所示,当polygon abcd被分割为abc与bdc两个三角性后,三角形bdc又被分割为bde与edc两个三角形.这时候原始polygon被分割为三角形1.2.3.在理想状况下,点e应该与点b.c共线.但,实际情况却不是这样,点e会出现在三角形abc或bdc的内.当点e出现在bdc内时,就会出现一个空白,三角形bec.这时候就出现了t-junctions.为了研究t-junctions的出现几率,我在ljet中发展了一个审计系统.该审计系统在ljet的release版中不会存在,它由#if #endif之类的编译宏扩起来,毕竟它要花费大量的cpu.最终他会把审计结果输出生成一个html文件,供调试.研究之用.t-junctions的出现几率有多大?非常大.当多边形切割次数达到一定的数量级(1000次以上)时,就会稳定的有1/4的切割出现t-junctions.它令我对浮点运算的误差有了深刻的认识.当一个plane切割一个线段时,切割点处于什么位置?可能即不在平面上也不在线段上.因此,在最终运行时,我们看到的平面只是一个逼近的平面.因此,只要出现polygon切割就会出现t-junctions,想要避免t-junctions是徒劳的.但是t-junctions所导致的斑点是我们所不能接受的,因此要对其进行修补.在图例中t-junctions fix的办法就是把三角形abc修补成polygon abec.当然这也是一种理想状态,因为要判断一个点是否在两点之间(e是否在b.c之间)也要进行浮点运算,因此这种判断是不精准的.点e很有可能在b.c之外.如果出现这种情况,t-junctions fix后的polygon将不再是convex polygon.用过opengl或d3d的程序员都知道,convex polygon是3d render的基础.幸运的是,在最终渲染的时候使用的是triangle,可以有很多方法把concave polygon转化成多个triangle.当我从opengl向d3d过渡的时候,对于d3d render的基本单位是triangle非常不理解,但从浮点精度考虑,在最终render的时候,使用triangle确实是非常好的想法,因为无论如何triangle的3个顶点必然共面.另外,对于3d graphic card来说,它的输入数据可以非常整齐(9个浮点数),非常利于优化.我想,opengl最终还是要把polygon转化成多个triangle的. ... 下一页