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

类声明:

#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. SpringBoot从Eclipse添加的Tomcat容器中启动

    SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ...

  2. C# 蓄水池抽样

    蓄水池采样算法解决的是在给定但长度未知的大数据集中,随机等概率抽取一个数据.如果知道数据的长度,可以用随机数rand()%n得到一个确切的随机位置,或者分块取值来构造随机,那么该位置的对象就是所求的对 ...

  3. 参与 2022 第二季度 Flutter 开发者调查

    2022 Google I/O 大会正式落下帷幕,Flutter 作为 14 个开发者产品和平台中的一款,吸引了来自全球的很多开发者们的关注.随着全国很多地方已经进入夏季,Flutter 今年第二季度 ...

  4. 【原创】渗透神器CoblatStrike实践(1)

    渗透神器CoblatStrike实践(1) 前言 正常的渗透测试: ​ 寻找漏洞,利用漏洞,拿到一定的权限 后渗透(CS为代表的): ​ 提升权限,内网渗透,权限维持 工具地址(非官方取到后门多,建议 ...

  5. 技术分享 | Appium环境安装与架构介绍

    原文链接 Appium架构 Appium 设计哲学 不需要为了自动化而重新编译或修改被测应用 不应该让移动端自动化测试限定在某种语言或者某个具体的框架 不要为了移动端的自动化测试而重新造轮子 移动端自 ...

  6. Centos使用crontab自动定时备份mysql的脚本

    在我们网站上线之后免不了需要备份数据库,为什么要备份呢?我给大家列出了3个理由. 1.防止数据丢失 2.防止数据改错了,可以用来恢复 3.方便给客户数据 以 上几点告诉我们要经常备份,当然我今天给大家 ...

  7. Vscode个性化设置:让一个小萌妹陪你敲代码

    前言 大家平时都用什么代码编辑器啊!我个人比较喜欢用vscode,因为有以下几点: 开源,免费: 自定义配置 集成git 智能提示强大 支持各种文件格式(html/jade/css/less/sass ...

  8. 关于Vue的几个实用知识点(持续更新中……)

    前言 排名不分先后,按自己习惯来的. 一.provide.inject 高级组件 总述: provide在父组件中定义,inject 在子孙组件中定义. provide:选项应该是一个对象或返回一个对 ...

  9. Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持

    大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

  10. 从零打造一个Web地图引擎

    说到地图,大家一定很熟悉,平时应该都使用过百度地图.高德地图.腾讯地图等,如果涉及到地图相关的开发需求,也有很多选择,比如前面的几个地图都会提供一套js API,此外也有一些开源地图框架可以使用,比如 ...