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输入数据,然 ...
随机推荐
- 152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv
152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv 附件下载地址:https://jiaopengzi.com/2602.html 一.背景 在我们使用 ...
- QTP——功能测试
一.前言(课设目的及内容) QTP是quicktest Professional的简称,是一种自动测试工具.使用QTP的目的是想用它来执行重复的手动测试,主要是用于回归测试和测试同一软件的新版本.因此 ...
- ethtools-网卡适配器管理
查看网卡适配器配置信息,并且我们可以通过它修改网卡适配器的双工模式. 1.安装Ethtools [root@localhost ~]# yum -y install ethtools 2.命令语法 语 ...
- 【进阶】Spring中的注解与反射
[进阶]Spring中的注解与反射 目录 [进阶]Spring中的注解与反射 前言 一.内置(常用)注解 1.1@Overrode 1.2@RequestMapping 1.3@RequestBody ...
- python发QQ邮件
python发qq邮件相对比较简单,网上教程一大把:固定套路,后面封装看自己怎么方便可以怎样进行封装:原版代码如下: """ # -*- coding : utf-8 - ...
- Oracle常见问题解决方法
1.设置数据库用户的密码有效期为 无限制 --查询proile文件名 SELECT username,PROFILE FROM dba_users; --查询文件 的密码保护策略 SELECT * F ...
- 关于VHDL中case语句多执行语句的书写方式(转载stackoverflow.com并做翻译汇总)
很多国内的教材对于case语句的讲解非常单一,比如: 1 [标号:]CASE 多值表达式 IS 2 WHEN 选择值 => 被赋值变量 <=赋值变量: 3 WHEN 选择值 => 被 ...
- C语言学习之我见-strcat()字符拼接函数(有缺陷)
strcat()函数,用于两个字符串的拼接. (1)函数原型: char * strcat(char *Dest,const char * Source); (2)头文件: #include < ...
- dotnet 使用 Crossgen2 对 DLL 进行 ReadyToRun 提升启动性能
我对几个应用进行严格的启动性能评估,对比了在 .NET Framework 和 dotnet 6 下的应用启动性能,非常符合预期的可以看到,在用户的设备上,经过了 NGen 之后的 .NET Fram ...
- SAP 实例 13 Random Grouping with LOOP
REPORT demo_loop_group_by_random. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS: main, class_ ...