此是随机采样算法,效果感觉一般般。

类声明:

  1. #pragma once
  2. #ifndef __PURERANDOM_HEADER__
  3. #define __PURERANDOM_HEADER__
  4.  
  5. #include "sampler.h"
  6.  
  7. class PureRandom :public Sampler {
  8. public:
  9. PureRandom();
  10. ~PureRandom();
  11. PureRandom(const integer samps);
  12. PureRandom(const integer samps, const integer sets);
  13. PureRandom(const PureRandom& pr);
  14. PureRandom& operator=(const PureRandom& pr);
  15. virtual Sampler* clone() const;
  16. virtual void generate_samples();
  17. };
  18. #endif  

类实现:

  1. #include "pch.h"
  2. #include "purerandom.h"
  3.  
  4. PureRandom::PureRandom() :Sampler() {
  5. generate_samples();
  6. }
  7.  
  8. PureRandom::~PureRandom() {}
  9.  
  10. PureRandom::PureRandom(const integer samps) :Sampler(samps) {
  11. generate_samples();
  12. }
  13.  
  14. PureRandom::PureRandom(const integer samps, const integer sets) : Sampler(samps, sets) {
  15. generate_samples();
  16. }
  17.  
  18. PureRandom::PureRandom(const PureRandom& pr) : Sampler(pr) {
  19. generate_samples();
  20. }
  21.  
  22. PureRandom& PureRandom::operator=(const PureRandom& pr) {
  23. if (this == &pr)
  24. return *this;
  25. Sampler::operator=(pr);
  26. return *this;
  27. }
  28.  
  29. Sampler* PureRandom::clone() const {
  30. return new PureRandom(*this);
  31. }
  32.  
  33. void PureRandom::generate_samples() {
  34. for (integer i=0;i<nsets;i++)
  35. for (integer j = 0; j < nsamples; j++) {
  36. Point2 sp(random_ldouble(), random_ldouble());
  37. samples.push_back(sp);
  38. }
  39. }

 

World类需要修改build函数,之前修改的仍然有效,不再重复

  1. void World::build() {
  2. vp.set_hres(200);
  3. vp.set_vres(100);
  4. vp.set_sampler(new PureRandom());//这里使用PureRandom采样,之后都在这行代码修改,从而测试各种采样算法。
  5. tracer_ptr = new MultiSphere(this);
  6. Geometrics* obj = new Sphere(0, 0.5);
  7. obj->set_color(RGBColor(1, 0, 0));
  8. add_object(obj);
  9. obj = new Sphere(Point3(0, -100.5, 0), 100);
  10. obj->set_color(RGBColor(0, 0, 1));
  11. add_object(obj);
  12. }  

测试结果和图片:

PureRandom采样类定义和测试的更多相关文章

  1. Regular采样类定义和测试

    这个算法是均匀采样算法,继承于Sampler类. 类声明: #pragma once #ifndef __REGULAR_HEADER__ #define __REGULAR_HEADER__ #in ...

  2. Jittered采样类定义和测试

    抖动采样算法测试,小图形看不出什么明显区别,还是上代码和测试图吧. 类声明: #pragma once #ifndef __JITTERED_HEADER__ #define __JITTERED_H ...

  3. Hammersley采样类定义和测试

    原理参照书籍 类声明: #pragma once #ifndef __HAMMERSLEY_HEADER__ #define __HAMMERSLEY_HEADER__ #include " ...

  4. NRooks采样类定义和测试

    类声明: #pragma once #ifndef __NROOKS_HEADER__ #define __NROOKS_HEADER__ #include "sampler.h" ...

  5. MultiJittered采样类定义和测试

    多重抖动在书上说的是水平和竖直方面随机交换. 类声明: #pragma once #ifndef __MULTIJITTERED_HEADER__ #define __MULTIJITTERED_HE ...

  6. Sampler类定义

    此是所有采样的基类,这样定义的好处是,我们可以分别测试每一个采样算法. 类定义: #pragma once #ifndef __SAMPLER_HEADER__ #define __SAMPLER_H ...

  7. 开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据

    12.4  基于Java类定义Bean配置元数据 12.4.1  概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java ...

  8. python类定义

    在我的收藏中有一篇特别详细的类讲解 此处部分内容引自:http://blog.sina.com.cn/s/blog_59b6af690101bfem.html class myclass: 'this ...

  9. 20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义

    20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然 ...

随机推荐

  1. 基于Proxmox平台搭建3D云教室

    背景 本文介绍了在 Proxmox VE 虚拟化平台上使用NVIDIA A16 GPU,开启vGPU特性,利用DoraCloud 搭建3D云教室的方案. Proxmox virtualization ...

  2. 《Effective C++》阅读总结(三):资源管理

    C++中的资源管理非常重要,在将资源加载到内存后,便可以使用资源了,当我们不再需要资源时,我们要保证其正确的释放,才能将其占用的内存空间归还给操作系统,不正确的释放很容易造成内存泄漏.本章以资源管理类 ...

  3. 《C Primer Plus》第六版笔记--1~3章

    目录 第一章 初识C语言 1 使用C语言的7个步骤 1.1 定义程序目标 1.2 设计程序(功能实现) 1.3 编写代码 1.4 编译 1.5 运行程序 1.6 测试和调试程序 1.7 维护和修改代码 ...

  4. Redis - 读写模式 - 缓存一致性

    Cache Aside Pattern(旁路缓存模式) 读:从cache中读取数据,若读取到则直接返回:cache中不存在则去database中读取,然后更新到cache. 写:先更新database ...

  5. JAVA - 线程同步和线程调度的相关方法

    JAVA - 线程同步和线程调度的相关方法 wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁:wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等 ...

  6. java中的final与可变类型、不可变类型的关系

    如果你对final和不可变类型的概念与区别有疑问的话,可以打开这篇文章.希望我的解答可以帮到您! 1.不可变类型: 什么是可变类型,什么是不可变类型呢? 首先我们看一下下面的这行代码: String ...

  7. torch.nn.MSELoss()函数解读

    转载自:https://www.cnblogs.com/tingtin/p/13902325.html

  8. 高通sensor理解

    .1.高通为什么引入adsp? 2.adsp sensor 是如何工作起来的? 3.adsp 和ap 是如何通信的? 4.adsp 架构组成 解答: 1.高通在msm8960之前sensor 是挂在p ...

  9. Java集合框架(一)-ArrayList

    大佬理解->Java集合之ArrayList 1.ArrayList的特点 存放的元素有序 元素不唯一(可以重复) 随机访问快 插入删除元素慢 非线程安全 2.底层实现 底层初始化,使用一个Ob ...

  10. 2.C++标准库函数:getline函数 定界流输入截取函数 -windows编程

    引言:今天工作遇到了一个需要按行读取txt文件数据的需求,查询了一下getline()函数,发现这竟然是一个C++的标准库函数,而且设计的很好,特地做一下记录.getline本质是一个定界流输入截取函 ...