zoukankan      html  css  js  c++  java
  • 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 == &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);
    		}
    }
    

      

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

  • 相关阅读:
    SQL执行效率1
    php经典算法(转载)
    linux自用命令
    vim基本命令
    xampp安装
    BUU-rsa
    z3约束器学习笔记
    面试前夕oi挣扎式复习
    bss上的格式化字符串漏洞
    一、汇编
  • 原文地址:https://www.cnblogs.com/dalgleish/p/12602750.html
Copyright © 2011-2022 走看看