此是所有采样的基类,这样定义的好处是,我们可以分别测试每一个采样算法。

类定义:

#pragma once
#ifndef __SAMPLER_HEADER__
#define __SAMPLER_HEADER__ #include "../utilities/geometry.h" class Sampler {
public:
Sampler();
virtual ~Sampler();
Sampler(const integer samps);
Sampler(const integer samps, const integer sets);
Sampler(const Sampler& s);
virtual Sampler* clone() const = 0;
virtual void generate_samples() = 0;//这个设置为纯虚函数,书中没有这样做,我们这样做是方便之后动态调整采样数量
virtual Point3 sample_unit_square();
void setup_shuffled_indices();
void set_num_sets(const integer sets);
integer get_num_sets() const;
void set_num_samples(const integer samps);
integer get_num_samples() const;
void clear();
Sampler& operator=(const Sampler& s);
protected:
integer nsamples;
integer nsets;
std::vector<Point3> samples;//这里采用Point3,兼容所有的采样算法
std::vector<integer> shuffled_indices;
integer count;
integer jump;
};
#endif

  

类实现:

#include "pch.h"
#include "sampler.h" Sampler::Sampler() :nsamples(16), nsets(36), count(0), jump(0) {
setup_shuffled_indices();
} Sampler::~Sampler() {} Sampler::Sampler(const integer samps) : nsamples(samps), nsets(36), count(0), jump(0) {
setup_shuffled_indices();
} Sampler::Sampler(const integer samps, const integer sets)
: nsamples(samps), nsets(sets), count(0), jump(0) {
setup_shuffled_indices();
} Sampler::Sampler(const Sampler& s)
: nsamples(s.nsamples), nsets(s.nsets), count(s.count), jump(s.jump),
samples(s.samples), shuffled_indices(s.shuffled_indices) {} Point3 Sampler::sample_unit_square() {
if (count % nsamples == 0)
jump = (random_integer() % nsets) * nsamples;
return (samples[jump + shuffled_indices[jump + count++ % nsamples]]);
} void Sampler::setup_shuffled_indices() {
shuffled_indices.reserve(nsamples * nsets);
std::vector<integer> indices;
for (integer i = 0; i < nsamples; i++)
indices.push_back(i);
for (integer i = 0; i < nsets; i++) {
random_shuffle(indices.begin(), indices.end());
shuffled_indices.insert(shuffled_indices.end(), indices.begin(), indices.end());
}
} void Sampler::set_num_sets(const integer sets) {
nsets = sets;
} integer Sampler::get_num_sets() const {
return nsets;
} void Sampler::set_num_samples(const integer samps) {
nsamples = samps;
} integer Sampler::get_num_samples() const {
return nsamples;
} void Sampler::clear() {
shuffled_indices.resize(0);
samples.resize(0);
count = jump = 0;
} Sampler& Sampler::operator=(const Sampler& s) {
if (this == &s)
return *this;
nsamples = s.nsamples;
nsets = s.nsets;
count = s.count;
jump = s.jump;
samples = s.samples;
shuffled_indices = s.shuffled_indices;
return *this;
}

  

  

Sampler类定义的更多相关文章

  1. ViewPlane类定义

    这个类主要是记录了所有跟视图窗口有关的数据,用于显示. 类声明: #pragma once #ifndef __VIEWPLANE_HEADER__ #define __VIEWPLANE_HEADE ...

  2. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  3. 几种常用的JS类定义方法

    几种常用的JS类定义方法   // 方法1 对象直接量var obj1 = {    v1 : "",    get_v1 : function() {        return ...

  4. Js 类定义的几种方式

    提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...

  5. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  6. C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

    原文  http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++  C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...

  7. YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)

    2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec  内存限制: 128 MB 提交: 183  解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...

  8. Objective-c 类接口 (@interface) (类定义)

    在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...

  9. 只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案

    ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服 ...

随机推荐

  1. DevOps之敏捷开发

    初步了解一下敏捷开发及其流程 1 为什么要敏捷开发? 敏捷开发描述了一套软件开发的价值和原则,在这些开发中,需求和解决方案皆通过自组织跨功能团队达成. 1.1 背景与动机 当需求的不明确性和工程实现的 ...

  2. k8s docker 中部署think php 并搭建php websocket

    不得不说php 对云原生有点不够友好,之前用java .net打包docker镜像 一下就ok了,php倒腾了好久才算部署成功. 场景:使用阿里云ack(k8s) 部署采用thinkPHP框架的php ...

  3. 第06组 Beta冲刺 (1/6)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.曾丽莉 4.黄少丹 5. 董翔云 6.杜筱 7.鲍凌函 8.詹鑫冰 9.曹兰英 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  4. 20212115 实验二 《python程序设计》实验报告

    实验二 计算器设计 #20212115 2021-2022-2 <python程序设计> 实验报告二 课程: 课程:<Python程序设计>班级: 2121姓名: 朱时鸿学号: ...

  5. Java变量, 常量和作用域

    目录 变量 作用域 局部变量 实例变量 类变量 常量 命名规范 视频课程 变量 变量就是可以变化的量 Java是一种强类型的语言, 每个变量都必须声明其类型 Java变量是程序中最基本的存储单元, 其 ...

  6. sklearn练习1 回归

    from sklearn.svm import SVR from sklearn.pipeline import make_pipeline from sklearn.preprocessing im ...

  7. C#和Java,究竟选哪个方向?我只说事实,你自己分析……

    好久没到园子里面逛了,回来看了看,.NET有点式微呀?Java/Spring/Linux--比以前多了很多,为什么?博客园可是.NET的大本营了呀! 好吧,我承认,飞哥也动摇了,去年在ASP.NET的 ...

  8. redis入门,linux安装

    1.下载 https://redis.io/download 2.上传到linux服务器tools文件夹下 3.解压到安装目录 tar -zxf /app/redis/redis-5.0.4.tar. ...

  9. 第二章、DHCP原理与配置

    目录 一.了解DHCP服务 1DHCP概述: 2DHCP好处 3DHCP的分配方式 二.DHCP工作过程 DHCP租约过程 三.使用 DHCP动态配置主机地址 1DHCP服务优点 2可分配的地址信息主 ...

  10. 基于web3D展示技术的煤矿巷道3D可视化系统

    地下开采离不开巷道工程.煤矿的生产.运输.排水.通风等各个环节都少不了巷道的支持.在煤矿智能化建设被提上日程的今天,巷道工程的智能化.可视化建设也成了行业趋势.尤其是复杂的井下作业环境,人员信息安全问 ...