/*========================================================================= Program: Visualization Toolkit Module: vtkBoxMuellerRandomSequence.cxx Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "vtkBoxMuellerRandomSequence.h" #include "vtkMath.h" #include "vtkMinimalStandardRandomSequence.h" #include "vtkObjectFactory.h" #include vtkStandardNewMacro(vtkBoxMuellerRandomSequence); //------------------------------------------------------------------------------ vtkBoxMuellerRandomSequence::vtkBoxMuellerRandomSequence() { this->UniformSequence = vtkMinimalStandardRandomSequence::New(); this->Value = 0; } //------------------------------------------------------------------------------ vtkBoxMuellerRandomSequence::~vtkBoxMuellerRandomSequence() { this->UniformSequence->Delete(); } //------------------------------------------------------------------------------ double vtkBoxMuellerRandomSequence::GetValue() { return this->Value; } //------------------------------------------------------------------------------ void vtkBoxMuellerRandomSequence::Next() { this->UniformSequence->Next(); double x = this->UniformSequence->GetValue(); // Make sure x is in (0,1] while (x == 0.0) { this->UniformSequence->Next(); x = this->UniformSequence->GetValue(); } this->UniformSequence->Next(); double y = this->UniformSequence->GetValue(); // Make sure y is in (0,1] while (y == 0.0) { this->UniformSequence->Next(); y = this->UniformSequence->GetValue(); } this->Value = sqrt(-2.0 * log(x)) * cos(2.0 * vtkMath::Pi() * y); } //------------------------------------------------------------------------------ vtkRandomSequence* vtkBoxMuellerRandomSequence::GetUniformSequence() { assert("post: result_exists" && this->UniformSequence != nullptr); return this->UniformSequence; } //------------------------------------------------------------------------------ // Description: // Set the uniformly distributed sequence of random numbers. // Default is a . void vtkBoxMuellerRandomSequence::SetUniformSequence(vtkRandomSequence* uniformSequence) { assert("pre: uniformSequence_exists" && uniformSequence != nullptr); if (this->UniformSequence != uniformSequence) { this->UniformSequence->Delete(); this->UniformSequence = uniformSequence; this->UniformSequence->Register(this); } assert("post: assigned" && uniformSequence == this->GetUniformSequence()); } //------------------------------------------------------------------------------ void vtkBoxMuellerRandomSequence::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); }