Sampler类定义
此是所有采样的基类,这样定义的好处是,我们可以分别测试每一个采样算法。
类定义:
#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类定义的更多相关文章
- ViewPlane类定义
这个类主要是记录了所有跟视图窗口有关的数据,用于显示. 类声明: #pragma once #ifndef __VIEWPLANE_HEADER__ #define __VIEWPLANE_HEADE ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 几种常用的JS类定义方法
几种常用的JS类定义方法 // 方法1 对象直接量var obj1 = { v1 : "", get_v1 : function() { return ...
- Js 类定义的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...
- YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)
2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec 内存限制: 128 MB 提交: 183 解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...
- Objective-c 类接口 (@interface) (类定义)
在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...
- 只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案
ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服 ...
随机推荐
- 记 iTextSharp 剪裁 PDF 指定区域的方法
原文 引用 itextsharp 5.5.13.2 itextsharp.xtra 5.5.13.2 方法 /// <summary> /// 截取pdf文件,例如把A4截出指定的A6区域 ...
- HTML区块
1.HTML 可以通过 <div> 和 <span>将元素组合起来. 2.HTML <div> 元素 HTML <div> 元素是块级元素,它可用于组合 ...
- 【Unity Shader学习笔记】Unity基础纹理-渐变纹理
纹理可以用来存储任何表面属性. 可以通过使用渐变纹理来实现插画风格的渲染效果. 这项技术是由Valve公司提出的.Valve使用它来渲染游戏中具有插画风格的角色. 我们使用半兰伯特模型计算漫反射. 因 ...
- springSecurity + jwt + redis 前后端分离用户认证和授权
记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...
- 浏览器上写代码,4核8G微软服务器免费用,Codespaces真香
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 一图胜千言 先上图,下面是欣宸在自己的iPad Pro ...
- CF 1015F
题意:[CF 1015F](https://codeforces.com/contest/1015/problem/F) 给你一个模式串A(一个不一定合法的括号序列),让你构造长度为2*n的合法括号序 ...
- 背包,子集和以及 (max, +) 卷积在特殊情形下的求法
背包,子集和以及 (max, +) 卷积在特殊情形下的求法 子集和 1:总重量不太大 有 \(n\) 个物品,每个物品重量为 \(w_i\),且 \(\sum\limits_{i} w_i=C\).你 ...
- 两个月吃透阿里P9推荐260页SpringBoot2企业应用实战pdf入职定P6+
前言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...
- MySQLDocker 主从复制搭建
MySQLDocker 主从复制搭建 MySQLDocker 的搭建 docker search mysql docker pull mysql/mysql-server:8.0.26 docker ...
- Java - 六原则一法则
Java - 六原则一法则 单一职责原则:一个类只做它该做的事情.(单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚.低耦合",所谓的高 ...