Regular采样类定义和测试
这个算法是均匀采样算法,继承于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 == ®)
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采样类定义和测试的更多相关文章
- 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" ...
- MultiJittered采样类定义和测试
多重抖动在书上说的是水平和竖直方面随机交换. 类声明: #pragma once #ifndef __MULTIJITTERED_HEADER__ #define __MULTIJITTERED_HE ...
- 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输入数据,然 ...
随机推荐
- autoit 脚本开发踩坑点
原文 1. 获取不到点击 <input type='file'/> 后弹出的window 根本原因是 _IEAction 阻塞,见第4点 解决办法: ;bad code $oIE = _I ...
- python之装饰器补充与递归函数与二分查找
目录 多层装饰器 有参装饰器 递归函数 基本演示 斐波那契数列 总结 小拓展 算法之二分法 简介 举例 总结 多层装饰器 我们已经知道了语法糖的作用是将装饰对象自动装饰到装饰器中,一个语法糖的应用我们 ...
- 《Unix 网络编程》05:TCP C/S 程序示例
TCP客户/服务器程序示例 系列文章导航:<Unix 网络编程>笔记 目标 ECHO-Application 结构如下: graph LR; A[标准输入/输出] --fgets--> ...
- JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常
项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2, ...
- SpringCloudAlibaba分布式流量控制组件Sentinel实战与源码分析(上)
概述 定义 Sentinel官网地址 https://sentinelguard.io/zh-cn/index.html 最新版本v1.8.4 Sentinel官网文档地址 https://senti ...
- 【clickhouse专栏】基础数据类型说明
本文是clickhouse专栏第五篇,更多内容请关注本号历史文章! 一.数据类型表 clickhouse内置了很多的column数据类型,可以通过查询system.data_type_families ...
- 慢到不能忍?别忍了,Ubuntu 21.10 APT 源修改为华为云镜像源
更新记录 2022年4月15日:本文迁移自Panda666原博客,原发布时间:2021年3月29日. 2022年4月15日:将源改为华为云,华为云更方便.Ubuntu从20.04更新到21.10. 切 ...
- Quartus II 13.0 sp1的官方下载页面
今天为了下个ModelSim跑到网上去找下载资源,清一色的百度网盘,下载速度60k/s,简直有病,于是跑到Intel官网上把连接挖出来了,供各位直接下载 实测使用IDM多线程下载速度可以轻松上到数MB ...
- Python调用腾讯云API,实现人脸年龄变化
网上看到了一个教程,调用腾讯云的人脸识别api和修改年龄api来实现模拟人物不同年龄的面貌 但是大多数教程的代码都是想同的,估计是抄袭哪个人的关键是执行不了 刚好周杰伦马上要发新专辑了,小改一下,拿杰 ...
- VisionPro · C# · 加载与保存视觉工具包
当项目程序被启动或更换程序产品型号时,我们需要提前加载对应的VisionPro的程序VPP文件,以提高程序调用效率. 加载代码: 1 using System; 2 using System.Wind ...