这个算法是均匀采样算法,继承于Sampler类。

类声明:

#pragma once
#ifndef __REGULAR_HEADER__
#define __REGULAR_HEADER__ #include "sampler.h" class Regular :public Sampler {
public:
Regular();
~Regular();
Regular(const integer samps);
Regular(const integer samps, const integer sets);
Regular(const Regular& reg);
Regular& operator=(const Regular& reg);
virtual Sampler* clone() const;
virtual void generate_samples();
};
#endif  

类实现:

#include "pch.h"
#include "regular.h" Regular::Regular() :Sampler() {
generate_samples();
} Regular::~Regular() {} Regular::Regular(const integer samps) : Sampler(samps) {
generate_samples();
} Regular::Regular(const integer samps, const integer sets) : Sampler(samps, sets) {
generate_samples();
} Regular::Regular(const Regular& reg) : Sampler(reg) {
generate_samples();
} Regular& Regular::operator=(const Regular& reg) {
if (this == &reg)
return *this;
Sampler::operator=(reg);
return *this;
} Sampler* Regular::clone() const {
return new Regular(*this);
} void Regular::generate_samples() {
integer n = (integer)std::sqrt((ldouble)nsamples);
for (integer p = 0; p < nsets; p++) {
for (integer i=0;i<n;i++)
for (integer j = 0; j < n; j++) {
Point2 sp((j + 0.5) / n, (i + 0.5) / n); //均匀采样
samples.push_back(sp);
}
}
}

测试采样算法:

添加Sampler类和采样数到ViewPlane类中,增加函数(若无特殊声明,不再重复修改的部分)

void set_samples(const integer n);

void set_sampler(Sampler* const sp);

ViewPlane类具体声明如下:

#pragma once
#ifndef __VIEWPLANE_HEADER__
#define __VIEWPLANE_HEADER__ #include "../../Types.h" class Sampler; class ViewPlane {
public:
ViewPlane();
ViewPlane(const ViewPlane& vp);
void set_hres(const integer hr);
void set_vres(const integer vr);
void set_pixelsize(const ldouble ps);
void set_gamma(const ldouble ga);
void set_samples(const integer n);//新增
void set_sampler(Sampler* const sp);//新增
integer hres;
integer vres;
integer nsamples;//新增
ldouble s;
ldouble g;
Sampler* sampler;//新增
}; #endif 

需要修改的类成员:

#include "pch.h"
#include "viewplane.h"
#include "../samplers/jittered.h" ViewPlane::ViewPlane() :hres(200), vres(100), s(0.02), g(1), nsamples(16), sampler(nullptr) {} ViewPlane::ViewPlane(const ViewPlane& vp)
: hres(vp.hres), vres(vp.vres), s(vp.s), g(vp.g), nsamples(vp.nsamples), sampler(vp.sampler) {} ... void ViewPlane::set_samples(const integer n) {//和书上不同,剔除特殊性,增加兼容性
nsamples = n;
sampler->clear();
sampler->set_num_samples(nsamples);
sampler->setup_shuffled_indices();
sampler->generate_samples();
} void ViewPlane::set_sampler(Sampler* const sp) {
if (sampler != nullptr) {
delete sampler;
sampler = nullptr;
}
nsamples = sp->get_num_samples();
sampler = sp;
}

  

World类只修改build和render部分:

void World::build() {
vp.set_hres(200);
vp.set_vres(100);
vp.set_sampler(new Regular());//所有采样修改都在这里测试
tracer_ptr = new MultiSphere(this);
Geometrics* obj = new Sphere(0, 0.5);
obj->set_color(RGBColor(1, 0, 0));
add_object(obj);
obj = new Sphere(Point3(0, -100.5, 0), 100);
obj->set_color(RGBColor(0, 0, 1));
add_object(obj);
}

render部分若无特殊声明,之后不再重复修改部分。

void World::render() {
Ray ray;
ldouble x, y;
open_window(vp.hres, vp.vres);
Point3 sp;
ray.o = Point3(0, 0, 1);
for (integer r = vp.vres - 1; r >= 0; r--)//render from left-corner to right-corner
for (integer c = 0; c < vp.hres; c++) {
RGBColor color;
for (integer p = 0; p < vp.nsamples; p++) {//增加样本
sp = vp.sampler->sample_unit_square();
x = vp.s * (c - 0.5 * vp.hres + sp.x);
y = vp.s * (r - 0.5 * vp.vres + sp.y);
ray.d = Point3(x, y, -1);
color += tracer_ptr->trace_ray(ray);
}
color /= vp.nsamples;
display_pixel(r, c, color);
}
}

  

修改完后,运行程序,测试效果如下(放大后,发现边角圆润了不少,接下来我们测试别的采样算法):

Regular采样类定义和测试的更多相关文章

  1. Jittered采样类定义和测试

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

  2. PureRandom采样类定义和测试

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

  3. Hammersley采样类定义和测试

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

  4. NRooks采样类定义和测试

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

  5. MultiJittered采样类定义和测试

    多重抖动在书上说的是水平和竖直方面随机交换. 类声明: #pragma once #ifndef __MULTIJITTERED_HEADER__ #define __MULTIJITTERED_HE ...

  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. awk内建函数

    内建函数 length() 获得字符串长度 cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 25 ...

  2. SSH管理多密钥

    生成密钥对 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 默认情况下在~/.ssh目录下生成id_rsa和id_r ...

  3. Angular核心概念

    一.集成开发环境@angular/cli IE8之后才有debugger工具 2009,nodejs发布,前端Big Bang 1.1 基于NodeJS的工具链 打包工具 grunt 对js代码做合并 ...

  4. Centos7 安装 MPICH

    查看官网版本 https://www.mpich.org/downloads/ 最新的stable release是mpich 4.0.2,复制下载链接. 安装依赖 mpich需要系列依赖,如果不确定 ...

  5. 对 Python 中 GIL 的一点理解

    GIL(Global Interpreter Lock),全局解释器锁,是 CPython 为了避免在多线程环境下造成 Python 解释器内部数据的不一致而引入的一把锁,让 Python 中的多个线 ...

  6. MOS管实现的STC自动下载电路

    目录 MOSFET, MOS管基础和电路 MOS管实现的STC自动下载电路 三极管配合 PMOS 管控制电路开关 STC MCU在烧录时, 需要断电重置后才能进入烧录状态, 通常是用手按开关比较繁琐. ...

  7. 解锁!玩转 HelloGitHub 的新姿势

    本文不会涉及太多技术细节和源码,请放心食用 大家好,我是 HelloGitHub 的老荀,好久不见啊! 我在完成 HelloZooKeeper 系列之后,就很少"露面了".但是我对 ...

  8. 『忘了再学』Shell基础 — 26、cut列提取命令

    目录 1.cut命令说明 2.cut命令练习 (1)cut命令基本用法 (2)cut命令选取多列 (3)按字符来进行提取 (4)按指定分隔符进行截取数据 3.cut命令分隔符说明 1.cut命令说明 ...

  9. Java系列之运算符

    运算符 算术运算符:+ (加).-(减) .*(乘)./(除).%(模).++(自增) . --(自减) 赋值运算符:= 关系运算符:>.<.>= <= == != insta ...

  10. Hash表、 继承

    Hash表 我们来了解什么是Hash表?? 要想知道什么是哈希表,那得先了解哈希函数 二叉平衡树 红黑树 B B+树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较.那么,有没 ...