首页 > 其他 > 详细

Hammersley采样类定义和测试

时间:2020-03-31 12:37:50      阅读:76      评论:0      收藏:0      [点我收藏+]

原理参照书籍

类声明:

#pragma once
#ifndef __HAMMERSLEY_HEADER__
#define __HAMMERSLEY_HEADER__

#include "sampler.h"

class Hammersley :public Sampler {
public:
	Hammersley();
	~Hammersley();
	Hammersley(const integer samps);
	Hammersley(const integer samps, const integer sets);
	Hammersley(const Hammersley& ham);
	Hammersley& operator=(const Hammersley& ham);
	virtual Sampler* clone() const;
	virtual void generate_samples();
private:
	ldouble phi(integer j);
};

#endif

类实现:

#include "pch.h"
#include "hammersley.h"

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

Hammersley::~Hammersley() {}

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

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

Hammersley::Hammersley(const Hammersley& ham) : Sampler(ham) {
	generate_samples();
}

Hammersley& Hammersley::operator=(const Hammersley& ham) {
	if (this == &ham)
		return *this;
	Sampler::operator=(ham);
	return *this;
}

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

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

ldouble Hammersley::phi(integer j) {
	ldouble x = 0.0, f = 0.5;
	while (j) {
		x += f * (ldouble)(j % 2);
		j /= 2;
		f *= 0.5;
	}
	return x;
}

  

测试效果图:

技术分享图片

Hammersley采样类定义和测试

原文:https://www.cnblogs.com/dalgleish/p/12603095.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!