多重抖动在书上说的是水平和竖直方面随机交换。

类声明:

#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采样类定义和测试的更多相关文章

  1. Regular采样类定义和测试

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

  2. Jittered采样类定义和测试

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

  3. PureRandom采样类定义和测试

    此是随机采样算法,效果感觉一般般. 类声明: #pragma once #ifndef __PURERANDOM_HEADER__ #define __PURERANDOM_HEADER__ #inc ...

  4. Hammersley采样类定义和测试

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

  5. NRooks采样类定义和测试

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

  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. linux篇-tomcat:Cannot find /usr/local/tomcat1/bin/setclasspath.sh

    首先看下报错代码: Cannot find /usr/local/tomcat1/bin/setclasspath.sh This file is needed to run this program ...

  2. 用树莓派USB摄像头做个监控

    [前言] 看着阴暗的角落里吃灰噎到嗓子眼的树莓派,一起陪伴的时光历历在目,往事逐渐涌上心头,每每触及此处,内心总会升腾起阵阵怜悯之情... 我这有两个设备,一个是积灰已久的树莓派,另一个是积灰已久的U ...

  3. 功耗优化之Sensor功耗分析

    功耗优化之Sensor功耗分析 一.Sensor功耗问题分类 二.Sensor功耗问题分析方法 SSC子系统引起系统无法进入AOSD问题分析: SSC子系统频繁唤醒AP问题分析方法 SSC子系统的GP ...

  4. Python报错 ImportError: DLL load failed while importing win32api: %1 不是有效的 Win32 应用程序 的解决方法

    今天在用jupyter notebook 的时候发生了kernel error,点开之后提示了以下报错信息 Traceback (most recent call last): File " ...

  5. bintree

    Python实现二叉树的建立与遍历 创建(二叉)树节点类 class Node: def __init__(self,data,l=None,r=None): self.val = data self ...

  6. 从零开始构建并编写神经网络---Keras【学习笔记】[1/2]

    Keras简介:   Keras是由纯python编写的基于theano/tensorflow的深度学习框架.   Keras是一个高层神经网络API,支持快速实验,能够把你的idea迅速转换为结果, ...

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

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

  8. 判断语句、if嵌套

    判断语句 上一篇我们使用了一下if语句当然我们不止这些 我们上一个只是判断出如果满足条件会执行,那么我们想一想如果不能满足该会怎么样! 当然 还有一种语句叫做if else 他的语法格式是: if ( ...

  9. 使用 Dapr JS SDK 让 Nest.js 集成 Dapr

    Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架. Dapr 中文手册:ht ...

  10. Spring IOC 为什么能降低耦合

    有同学在学习 Spring 框架中可能会问这样的问题,为什么通过依赖注入就可以降低代码间的耦合呢?我通过 new 生产对象不也可以吗,不就是一行代码的不同,一个是 @Resource 注入,一个是 n ...