此是随机采样算法,效果感觉一般般。

类声明:

#pragma once
#ifndef __PURERANDOM_HEADER__
#define __PURERANDOM_HEADER__

#include "sampler.h"

class PureRandom :public Sampler {
public:
	PureRandom();
	~PureRandom();
	PureRandom(const integer samps);
	PureRandom(const integer samps, const integer sets);
	PureRandom(const PureRandom& pr);
	PureRandom& operator=(const PureRandom& pr);
	virtual Sampler* clone() const;
	virtual void generate_samples();
};
#endif  

类实现:

#include "pch.h"
#include "purerandom.h"

PureRandom::PureRandom() :Sampler() {
	generate_samples();
}

PureRandom::~PureRandom() {}

PureRandom::PureRandom(const integer samps) :Sampler(samps) {
	generate_samples();
}

PureRandom::PureRandom(const integer samps, const integer sets) : Sampler(samps, sets) {
	generate_samples();
}

PureRandom::PureRandom(const PureRandom& pr) : Sampler(pr) {
	generate_samples();
}

PureRandom& PureRandom::operator=(const PureRandom& pr) {
	if (this == &pr)
		return *this;
	Sampler::operator=(pr);
	return *this;
}

Sampler* PureRandom::clone() const {
	return new PureRandom(*this);
}

void PureRandom::generate_samples() {
	for (integer i=0;i<nsets;i++)
		for (integer j = 0; j < nsamples; j++) {
			Point2 sp(random_ldouble(), random_ldouble());
			samples.push_back(sp);
		}
}

 

World类需要修改build函数,之前修改的仍然有效,不再重复

void World::build() {
	vp.set_hres(200);
	vp.set_vres(100);
	vp.set_sampler(new PureRandom());//这里使用PureRandom采样,之后都在这行代码修改,从而测试各种采样算法。
	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);
}  

测试结果和图片:

posted on 2020-03-31 05:45  dalgleish  阅读(177)  评论(0编辑  收藏  举报