摘要: 1、随机采样 在基本光线追踪算法中,只追踪有限数目的光线。这是一个采样过程(sampling process)。 采样有很多种方法: a、均匀采样 举例:根据给定的区间绘制数学函数。 将区间划分为许多小的宽度一致的小区间,在小区间的中点处计算函数的值,最终将这些点平滑连接出来。 在小区间数目很少的情况下,均匀采样可能会得到错误的结果。 b、随机采样 使用随机间隔宽度代替统一间隔... 阅读全文
posted @ 2012-05-28 09:26 Cavia 阅读(1466) 评论(0) 推荐(0) 编辑
摘要: 该伪代码总结了光线追踪算法。 Function Raytrace(Scene World){ for(each pixel of the image) { Calculate the ray corresponding to the pixel (projection); Pixel color=trace(ray,0); ... 阅读全文
posted @ 2012-05-27 23:13 Cavia 阅读(2024) 评论(0) 推荐(0) 编辑
摘要: 问题:1、性能算法的递归性质和大数目的追踪光线,渲染过程可能持续数小时。80-90%的渲染时间花费在计算光线和物体交点上。2、走样3、尖锐的阴影基本的光线追踪算法只能得到尖锐的阴影(因为模拟的是点光源)。4、局部光照和着色算法只追踪少数目的光线,只有四种类型的光线被考虑在内,物体之间的漫反射光没有被考虑在内,即算法并不包括全局光照。解决方案:1、性能a、使用更多或者更好的硬件b、大规模并行计算每一个光线都相互独立。将图像分割,分配在多核上或者分布式网络上;或者分配在多个线程上。c、限制交点检测的数目使用包围盒的层次关系。快速判断光线是否和一组物体相交。物体被分组在封闭的包围盒中。利用空间细分技 阅读全文
posted @ 2012-05-27 16:50 Cavia 阅读(5276) 评论(0) 推荐(0) 编辑
摘要: 1、主光线(Primary rays)从camera发出的光线。2、阴影光线(Shadow/Light rays)从交点发出的光线,指向光源。如果这条光线在指向光源之前不相交于任何物体,则这个光源对该交点有贡献值;否则,该交点位于该光源的阴影处。3、反射光线(Reflection rays)如果物体表面具有反射性质,则部分光将会被反射出去,继续在场景中前进。根据Snell定律,一条新的光线将会从交点发出。4、折射光线(Refracted rays)当物体表面具有折射性质并且部分透明,部分光线将会进入物体继续传播。根据Snell定律,一条新的光线将会从交点发出进入物体。 阅读全文
posted @ 2012-05-27 15:40 Cavia 阅读(2978) 评论(0) 推荐(0) 编辑
摘要: 实际上叫反向光线追踪(backward raytracing),因为计算是从camera开始发射光线,而不是从光源发射光线。反向光线追踪步骤:1、camera的胶片被分成离散的网格(即像素点),我们的目标是确定每一个像素点的颜色值。2、对于每一个像素,从camera位置追踪一条光线,指向该像素点3、对于这束光线,判断其是否和场景中的物体相交。如果相交,则转到步骤4;否则,将背景色填充到当前像素中去,回到步骤2,继续处理下一个像素。4、如果光线和物体相交,计算物体表面交点的颜色值。该点的颜色值即为该像素的颜色值。a、首先检查每个光源在该交点的贡献值。追踪一条新光线去光源,用来确定交点是被全部照亮 阅读全文
posted @ 2012-05-27 15:16 Cavia 阅读(18188) 评论(0) 推荐(1) 编辑
摘要: View Code 1 /* 2 题目:求1+2+…+n, 3 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 4 */ 5 6 7 class Calculation 8 { 9 public:10 Calculation()11 {12 ++n;13 sum+=n;14 }15 static void Reset()16 {17 n=0;18 sum=0;19 }20 static int GetS... 阅读全文
posted @ 2012-05-16 15:37 Cavia 阅读(365) 评论(0) 推荐(0) 编辑
摘要: View Code 1 #include <iostream> 2 using namespace std; 3 4 const int SIZE=10; 5 6 int getFrequency(int index,int* bottom) 7 { 8 int count=0; 9 for(int i=0;i<SIZE;++i)10 {11 if(bottom[i]==index)12 count++;13 }14 return count;15 }16 17 void Calc(const int* Up... 阅读全文
posted @ 2012-05-15 16:19 Cavia 阅读(267) 评论(0) 推荐(0) 编辑
摘要: View Code 1 //计算达到相同字符串的操作个数 2 int SimuDegree(char* a,char* b) 3 { 4 int lenA=strlen(a); 5 int lenB=strlen(b); 6 if(lenA==0 || lenB==0) 7 return abs(lenA-lenB); 8 if((*a)==(*b)) 9 return SimuDegree(a+1,b+1);10 else11 {12 13 return min(min(Simu... 阅读全文
posted @ 2012-05-07 15:40 Cavia 阅读(257) 评论(1) 推荐(0) 编辑
摘要: 一、排序1、应用a、一些程序需要有序的输出,二分查找之类的程序需要一个有序的输入。b、收集相同项:使用排序来收集序列中相同的项,后缀数组收集相同的单词。2、算法a、插入排序:O(n^2)的最坏时间,如果给一个大致有序的数组进行排序,则只需要O(n)时间,是稳定的。b、快速排序:最优时间O(nlogn),最坏情况O(n^2)时间O(n)空间c、堆排序:任何情况都是O(nlogn)时间d、其他:归并排序,选择排序,希尔排序e、基数排序f、位图排序:序列中的整数在一个范围内,没有重复的数,没有额外的数据。二、查找1、算法a、线性查找b、二分查找:有序数组c、哈希d、二叉查找树e、关键字索引:bins 阅读全文
posted @ 2012-05-05 13:03 Cavia 阅读(405) 评论(0) 推荐(0) 编辑
摘要: 首先是letter-level的马尔科夫链然后是word-level的马尔科夫链word-level 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 //输入的字符串 6 char inputchars[4300000]; 7 #define MAXWORDS 80000 8 //字符串中没一个单词 9 char *word[MAXWORDS]; 10 //单词个数 11 int nword=0; 12 //k-order 13 int k=2; 14 15 //has 阅读全文
posted @ 2012-05-05 10:20 Cavia 阅读(584) 评论(0) 推荐(0) 编辑