类声明:

#pragma once
#ifndef __NROOKS_HEADER__
#define __NROOKS_HEADER__

#include "sampler.h"

class NRooks :public Sampler {
public:
	NRooks();
	~NRooks();
	NRooks(const integer samps);
	NRooks(const integer samps, const integer sets);
	NRooks(const NRooks& nr);
	NRooks& operator=(const NRooks& nr);
	virtual Sampler* clone() const;
	virtual void generate_samples();
private:
	void shuffled_x_coordinates();
	void shuffled_y_coordinates();
};
#endif

类实现:

#include "pch.h"
#include "nrooks.h"

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

NRooks::~NRooks() {}

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

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

NRooks::NRooks(const NRooks& nr) : Sampler(nr) {
	generate_samples();
}

NRooks& NRooks::operator=(const NRooks& nr) {
	if (this == &nr)
		return *this;
	Sampler::operator=(nr);
	return *this;
}

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

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

void NRooks::shuffled_x_coordinates() {
	for (integer i = 0; i < nsets; i++)
		for (integer j = 0; j < nsamples - 1; j++) {
			integer k = random_integer() % nsamples + i * nsamples;
			std::swap(samples[i * nsamples + j + 1].x, samples[k].x);
		}
}

void NRooks::shuffled_y_coordinates() {
	for (integer i = 0; i < nsets; i++)
		for (integer j = 0; j < nsamples - 1; j++) {
			integer k = random_integer() % nsamples + i * nsamples;
			std::swap(samples[i * nsamples + j + 1].y, samples[k].y);
		}
}

  

测试结果图:

posted on 2020-03-31 08:47  dalgleish  阅读(232)  评论(0编辑  收藏  举报