MultiJittered采样类定义和测试
多重抖动在书上说的是水平和竖直方面随机交换。
类声明:
#pragma once
#ifndef __MULTIJITTERED_HEADER__
#define __MULTIJITTERED_HEADER__ #include "sampler.h" class MultiJittered :public Sampler {
public:
MultiJittered();
~MultiJittered();
MultiJittered(const integer samps);
MultiJittered(const integer samps, const integer sets);
MultiJittered(const MultiJittered& mji);
MultiJittered& operator=(const MultiJittered& mji);
virtual Sampler* clone() const;
virtual void generate_samples();
private:
void shuffled_x_coordinates(integer n);//水平抖动
void shuffled_y_coordinates(integer n);//竖直抖动
ldouble subcell_width;
};
#endif
类实现:
#include "pch.h"
#include "multijittered.h" MultiJittered::MultiJittered() :Sampler() {
generate_samples();
} MultiJittered::~MultiJittered() {} MultiJittered::MultiJittered(const integer samps) :Sampler(samps) {
generate_samples();
} MultiJittered::MultiJittered(const integer samps, const integer sets) : Sampler(samps, sets) {
generate_samples();
} MultiJittered::MultiJittered(const MultiJittered& mji):Sampler(mji) {
generate_samples();
} MultiJittered& MultiJittered::operator=(const MultiJittered& mji) {
if (this == &mji)
return *this;
Sampler::operator=(mji);
return *this;
} Sampler* MultiJittered::clone() const {
return new MultiJittered(*this);
} void MultiJittered::generate_samples() {
integer n = (integer)std::sqrt((ldouble)nsamples);
subcell_width = 1.0 / nsamples;
for (integer i = 0; i < nsamples * nsets; i++)
samples.push_back(Point3());
for (integer p = 0; p < nsets; p++)
for (integer i = 0; i < n; i++)
for (integer j = 0; j < n; j++) {
samples[i * n + j + p * nsamples].x = (i * n + j) * subcell_width + random_ldouble(0, subcell_width);
samples[i * n + j + p * nsamples].y = (j * n + i) * subcell_width + random_ldouble(0, subcell_width);
}
shuffled_x_coordinates(n);
shuffled_y_coordinates(n);
} void MultiJittered::shuffled_x_coordinates(integer n) {
for (integer p = 0; p < nsets; p++) {
for (integer i = 0; i < n; i++)
for (integer j = 0; j < n; j++) {
integer k = random_integer(j, n - 1);
std::swap(samples[i * n + j + p * nsamples].x, samples[i * n + k + p * nsamples].x);
}
}
} void MultiJittered::shuffled_y_coordinates(integer n) {
for (integer p = 0; p < nsets; p++) {
for (integer i = 0; i < n; i++)
for (integer j = 0; j < n; j++) {
integer k = random_integer(j, n - 1);
std::swap(samples[j * n + i + p * nsamples].y, samples[k * n + i + p * nsamples].y);
}
}
}
测试结果图:

MultiJittered采样类定义和测试的更多相关文章
- Regular采样类定义和测试
这个算法是均匀采样算法,继承于Sampler类. 类声明: #pragma once #ifndef __REGULAR_HEADER__ #define __REGULAR_HEADER__ #in ...
- Jittered采样类定义和测试
抖动采样算法测试,小图形看不出什么明显区别,还是上代码和测试图吧. 类声明: #pragma once #ifndef __JITTERED_HEADER__ #define __JITTERED_H ...
- PureRandom采样类定义和测试
此是随机采样算法,效果感觉一般般. 类声明: #pragma once #ifndef __PURERANDOM_HEADER__ #define __PURERANDOM_HEADER__ #inc ...
- Hammersley采样类定义和测试
原理参照书籍 类声明: #pragma once #ifndef __HAMMERSLEY_HEADER__ #define __HAMMERSLEY_HEADER__ #include " ...
- NRooks采样类定义和测试
类声明: #pragma once #ifndef __NROOKS_HEADER__ #define __NROOKS_HEADER__ #include "sampler.h" ...
- Sampler类定义
此是所有采样的基类,这样定义的好处是,我们可以分别测试每一个采样算法. 类定义: #pragma once #ifndef __SAMPLER_HEADER__ #define __SAMPLER_H ...
- 开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据
12.4 基于Java类定义Bean配置元数据 12.4.1 概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java ...
- python类定义
在我的收藏中有一篇特别详细的类讲解 此处部分内容引自:http://blog.sina.com.cn/s/blog_59b6af690101bfem.html class myclass: 'this ...
- 20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义
20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然 ...
随机推荐
- 一条更新SQL的内部执行及日志模块
一条更新SQL的内部执行 学习MySQL实战45讲,非常推荐学 还是老图: 上文复习 在执行查询语句的时候,会执行连接器(总要连上才能搞事情),然后去查询缓存(MySQL8+删除了),有数据返回,没数 ...
- 深入解读SQL的聚集函数
摘要:本文从基本聚集操作入手,介绍常用的SQL语法,以及一些扩展的聚集功能,同时会讲到在GaussDB(DWS)里聚集相关的一些优化思路. 本文分享自华为云社区<GaussDB(DWS) SQL ...
- 从零搭建Pytorch模型教程(四)编写训练过程--参数解析
前言 训练过程主要是指编写train.py文件,其中包括参数的解析.训练日志的配置.设置随机数种子.classdataset的初始化.网络的初始化.学习率的设置.损失函数的设置.优化方式的设置. ...
- C++编码规范(本人自定义)
C++编码规范 1.变量名用camelCase命名法(即lowerCamelCase,小驼峰拼写法)命名. 即小写字母开头,如果变量名是复合词,第二个单词的首字母大写. 举例: int digitsC ...
- Go微服务框架go-kratos实战03:使用 gorm 实现增删改查操作
一.简介 在上一篇文章 go-kratos实战02 中,详细介绍了用 kratos 编写项目代码的步骤.这篇就在上篇基础上,再结合 Go 数据库操作库 gorm 一步一步来实现一个简单的增删改查操作. ...
- 155_模型_Power BI & Power Pivot 进销存之安全库存
155_模型_Power BI & Power Pivot 进销存之安全库存 一.背景 谈进销存的概念时,我们也需要提及另外一个概念:安全库存. 库存周转在理想的状态下是做到零库存,但是在内部 ...
- GDOI 2021 普及组溺水记
Day 1 T1 一看样例:答案不就是 \(\dfrac{\max_{i=1}^n a_i +1}{2}\) 吗? 于是自信打上,拍都不拍.然后就,,对了? 插曲:自己出了一个极端数据,发现 scan ...
- c++ 树状数组
关于树状数组 树状数组,即 Binary Indexed Tree ,主要用于维护查询前缀和 属于 log 型数据结构 和线段树比较 都是 log 级别 树状数组常数.耗费的空间.代码量都比线段树小 ...
- midway的使用教程
一.写在前面 先说下本文的背景,这是一道笔者遇到的Node后端面试题,遂记录下,通过本文的阅读,你将对楼下知识点有所了解: midway项目的创建与使用 typescript在Node项目中的应用 如 ...
- 开发工具-PowerShell下载地址
更新日志 2022年6月10日 初始化链接. https://github.com/PowerShell/PowerShell/releases/