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输入数据,然 ...
随机推荐
- 693. Binary Number with Alternating Bits - LeetCode
Question 693. Binary Number with Alternating Bits Solution 思路:输入一个整数,它的二进制01交替出现,遍历其二进制字符串,下一个与上一个不等 ...
- unity---判断物体碰撞的对象
脚本效果 trrn对象为地面,排除这个选项
- Vue路由实现之通过URL中的hash(#号)来实现不同页面之间的切换(图表展示、案例分析、附源码详解)
前言 本篇随笔主要写了Vue框架中路由的基本概念.路由对象属性.vue-router插件的基本使用效果展示.案例分析.原理图解.附源码地址获取. 作为自己对Vue路由进行页面跳转效果知识的总结与笔记. ...
- 高危!Fastjson反序列化远程代码执行漏洞风险通告,请尽快升级
据国家网络与信息安全信息通报中心监测发现,开源Java开发组件Fastjson存在反序列化远程代码执行漏洞.攻击者可利用上述漏洞实施任意文件写入.服务端请求伪造等攻击行为,造成服务器权限被窃取.敏感信 ...
- vue3常见问题及解决方案(四)父组件切换行,然后子组件切换tab,子组件内的数据不刷新
问题描述 父组件切换行,然后子组件切换tab,子组件内的数据不刷新. 例如父组件为订单,子组件为订单相关商品和相关客户,商品和客户使用tab选项卡组织. 当tab显示商品页时,切换订单,商品页内容跟着 ...
- pandas:数据迭代、函数应用
1.数据迭代 1.1 迭代行 (1)df.iterrows() for index, row in df[0:5].iterrows(): #需要两个变量承接数据 print(row) print(& ...
- 大数据分析VMWare虚拟机centos系统下配置网络参数
最近搞大数据方面的数据,通过网上视频学习和自己实践,有些不成文的实践就零碎的记录在此吧. 系统也可安装CentOS DVD版. 1.先进入配置文件,并查看基本情况,如下: 2.用vi编辑器打开物理网卡 ...
- 第1章 C++绪论
写于2022年5月13日: 开通博客用于学习记录分享及交流. C++复习笔记内容参考教材[双语版C++程序设计(第2版)][(爱尔兰)Paul Kelly(P. 凯利),苏小红]. 本书的网站:htt ...
- 1.1 操作系统的第一个功能——虚拟化硬件资源 -《zobolの操作系统学习札记》
1.1 操作系统的第一个功能--虚拟化硬件资源 目录 1.1 操作系统的第一个功能--虚拟化硬件资源 问1:操作系统一般处于计算机系统的哪一个位置? 问2:管理硬件资源为什么要单独交给操作系统? 问3 ...
- 我给航母做3D还原:这三处细节,太震撼了…
前两天,我国第三艘航母正式下水,受到国际舆论高度关注.国产福建舰火出了圈,"航母"从军事专业领域,也火到了普通人的视野中. 图源网络 人们一边感叹我国实力强劲,一边对"航 ...