zoukankan      html  css  js  c++  java
  • MultiJittered采样类定义和测试

    多重抖动在书上说的是水平和竖直方面随机交换。

    类声明:

    #pragma once
    #ifndef __MULTIJITTERED_HEADER__
    #define __MULTIJITTERED_HEADER__
    
    #include "sampler.h"
    
    class MultiJittered :public Sampler {
    public:
    	MultiJittered();
    	~MultiJittered();
    	MultiJittered(const integer samps);
    	MultiJittered(const integer samps, const integer sets);
    	MultiJittered(const MultiJittered& mji);
    	MultiJittered& operator=(const MultiJittered& mji);
    	virtual Sampler* clone() const;
    	virtual void generate_samples();
    private:
    	void shuffled_x_coordinates(integer n);//水平抖动
    	void shuffled_y_coordinates(integer n);//竖直抖动
    	ldouble subcell_width;
    };
    #endif

    类实现:

    #include "pch.h"
    #include "multijittered.h"
    
    MultiJittered::MultiJittered() :Sampler() {
    	generate_samples();
    }
    
    MultiJittered::~MultiJittered() {}
    
    MultiJittered::MultiJittered(const integer samps) :Sampler(samps) {
    	generate_samples();
    }
    
    MultiJittered::MultiJittered(const integer samps, const integer sets) : Sampler(samps, sets) {
    	generate_samples();
    }
    
    MultiJittered::MultiJittered(const MultiJittered& mji):Sampler(mji) {
    	generate_samples();
    }
    
    MultiJittered& MultiJittered::operator=(const MultiJittered& mji) {
    	if (this == &mji)
    		return *this;
    	Sampler::operator=(mji);
    	return *this;
    }
    
    Sampler* MultiJittered::clone() const {
    	return new MultiJittered(*this);
    }
    
    void MultiJittered::generate_samples() {
    	integer n = (integer)std::sqrt((ldouble)nsamples);
    	subcell_width = 1.0 / nsamples;
    	for (integer i = 0; i < nsamples * nsets; i++)
    		samples.push_back(Point3());
    	for (integer p = 0; p < nsets; p++)
    		for (integer i = 0; i < n; i++)
    			for (integer j = 0; j < n; j++) {
    				samples[i * n + j + p * nsamples].x = (i * n + j) * subcell_width + random_ldouble(0, subcell_width);
    				samples[i * n + j + p * nsamples].y = (j * n + i) * subcell_width + random_ldouble(0, subcell_width);
    			}
    	shuffled_x_coordinates(n);
    	shuffled_y_coordinates(n);
    }
    
    void MultiJittered::shuffled_x_coordinates(integer n) {
    	for (integer p = 0; p < nsets; p++) {
    		for (integer i = 0; i < n; i++)
    			for (integer j = 0; j < n; j++) {
    				integer k = random_integer(j, n - 1);
    				std::swap(samples[i * n + j + p * nsamples].x, samples[i * n + k + p * nsamples].x);
    			}
    	}
    }
    
    void MultiJittered::shuffled_y_coordinates(integer n) {
    	for (integer p = 0; p < nsets; p++) {
    		for (integer i = 0; i < n; i++)
    			for (integer j = 0; j < n; j++) {
    				integer k = random_integer(j, n - 1);
    				std::swap(samples[j * n + i + p * nsamples].y, samples[k * n + i + p * nsamples].y);
    			}
    	}
    }

    测试结果图:

  • 相关阅读:
    在腾讯云上使用URLOS一键安装Discuz! Q
    共享容器——URLOS最新发布的一项超强功能
    在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!
    Discuz!Q回归,如何一键安装Discuz!Q
    Docker管理面板-URLOS(易用、高效、强大)
    CentOS下Subversion(SVN)的快速安装与配置
    通过URLOS安装Redis缓存为wordpress网站提速
    5分钟快速安装Redmine项目管理软件
    Python3+HTMLTestRunner+SMTP生成测试报告后发送邮件
    Python3+HTMLTestRunner生成html测试报告时报错HTMLTestRunner.py line 687, in generateReport  self.stream.write(output.encode('utf8'))
  • 原文地址:https://www.cnblogs.com/dalgleish/p/12602801.html
Copyright © 2011-2022 走看看