diff --git a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.cpp b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.cpp index 5e310f088f..705f262b2b 100644 --- a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.cpp +++ b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.cpp @@ -1,162 +1,162 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkPhotoacousticTissueGenerator.h" #include "mitkPhotoacousticSmartVector.h" #include "mitkPhotoacousticFatTissueGenerator.h" mitk::PhotoacousticVolume::Pointer mitk::PhotoacousticTissueGenerator::GenerateInSilicoData(int xDim, int yDim, int zDim, double spacing, double basicAbsorption, double basicScattering, double basicAnisotropy, double airThickness, double skinAbsorption, double skinScattering, double skinAnisotropy, double skinThickness, double fatAbsorption, double fatScattering, double fatAnisotropy, double fatPercentage, bool randomizePhysicalProperties, double randomPercentage, int minNumberOfVessels, int maxNumberOfVessels, double minBending, double maxBending, double minAbs, double maxAbs, double minRadius, double maxRadius, double mcflag, double launchflag, double boundaryflag, double launchPointX, double launchPointY, double launchPointZ, double focusPointX, double focusPointY, double focusPointZ, double trajectoryVectorX, double trajectoryVectorY, double trajectoryVectorZ, double radius, double waist, double sigma, bool doGauss, int bifurcationFrequency, double vesselScattering, double vesselAnisotropy, bool useRngSeed, long rngSeed, mitk::PhotoacousticVessel::CalculateNewVesselPositionCallback calculateNewVesselPositionCallback) { MITK_DEBUG << "Initializing Empty Volume"; mitk::PhotoacousticVolume::Pointer generatedVolume = mitk::PhotoacousticVolume::New(); generatedVolume->Initialize(xDim, yDim, zDim, spacing, basicAbsorption, basicScattering, basicAnisotropy, mcflag, launchflag, boundaryflag, launchPointX, launchPointY, launchPointZ, focusPointX, focusPointY, focusPointZ, trajectoryVectorX, trajectoryVectorY, trajectoryVectorZ, radius, waist, sigma, doGauss, airThickness, skinThickness, skinAbsorption, skinScattering, skinAnisotropy); std::mt19937 randomNumberGenerator; std::random_device randomDevice; if(useRngSeed) { randomNumberGenerator.seed(rngSeed); } else { if(randomDevice.entropy()>0.1) { randomNumberGenerator.seed(randomDevice()); } else { randomNumberGenerator.seed(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); } } mitk::PhotoacousticFatTissueGenerator::CreateFatGlobules(generatedVolume, fatPercentage, fatAbsorption, fatScattering, fatAnisotropy, &randomNumberGenerator); std::uniform_int_distribution randomNumVesselDistribution(minNumberOfVessels, maxNumberOfVessels); std::uniform_real_distribution randomBendingDistribution(minBending, maxBending); std::uniform_real_distribution randomAbsorptionDistribution(minAbs, maxAbs); std::uniform_real_distribution randomRadiusDistribution(minRadius, maxRadius); std::uniform_real_distribution randomSign(-1, 1); int numberOfBloodVessels = randomNumVesselDistribution(randomNumberGenerator); generatedVolume->AddIntProperty("numberOfVessels", numberOfBloodVessels); generatedVolume->AddIntProperty("bifurcationFrequency", bifurcationFrequency); MITK_DEBUG << "Simulating vessel structures"; for(int vesselNumber = 0; vesselNumber < numberOfBloodVessels; vesselNumber++) { mitk::PhotoacousticSmartVector::Pointer initialPosition = mitk::PhotoacousticSmartVector::New(); mitk::PhotoacousticSmartVector::Pointer initialDirection = mitk::PhotoacousticSmartVector::New(); double initialRadius = randomRadiusDistribution(randomNumberGenerator) / spacing / 10; std::stringstream radiusString; radiusString <<"vessel_"<AddDoubleProperty(radiusString.str(), initialRadius); double absorptionCoefficient = randomAbsorptionDistribution(randomNumberGenerator); std::stringstream absorptionString; absorptionString <<"vessel_"<AddDoubleProperty(absorptionString.str(), absorptionCoefficient); double bendingFactor = randomBendingDistribution(randomNumberGenerator); std::stringstream bendingString; bendingString <<"vessel_"<AddDoubleProperty(bendingString.str(), bendingFactor); bool stickXBorder = randomSign(randomNumberGenerator) < 0; bool stickLeft = randomSign(randomNumberGenerator) < 0; if(stickXBorder) { if(stickLeft) { - initialPosition->Randomize(0, 0, 0, yDim, 3+initialRadius, zDim, &randomNumberGenerator); - initialDirection->Randomize(1, 2, -0.2, 0.2, -0.2, 0.2,&randomNumberGenerator); + initialPosition->Randomize(0, 0, initialRadius, yDim-initialRadius, 3+initialRadius, zDim-initialRadius, &randomNumberGenerator); + initialDirection->Randomize(1, 2, -DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, -DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM,&randomNumberGenerator); } else { - initialPosition->Randomize(xDim, xDim, 0, yDim, 3+initialRadius, zDim, &randomNumberGenerator); - initialDirection->Randomize(-2, -1, -0.2, 0.2, -0.2, 0.2, &randomNumberGenerator); + initialPosition->Randomize(xDim, xDim, initialRadius, yDim - initialRadius, 3+initialRadius, zDim, &randomNumberGenerator); + initialDirection->Randomize(-2, -1, -DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, -DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, &randomNumberGenerator); } } else { if(stickLeft) { - initialPosition->Randomize(0, xDim, 0, 0, 3+initialRadius, zDim, &randomNumberGenerator); - initialDirection->Randomize(-0.2, 0.2, 1, 2, -0.2, 0.2, &randomNumberGenerator); + initialPosition->Randomize(initialRadius, xDim - initialRadius, 0, 0, 3+initialRadius, zDim - initialRadius, &randomNumberGenerator); + initialDirection->Randomize(-DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, 1, 2, -DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, &randomNumberGenerator); } else { - initialPosition->Randomize(0, xDim, yDim, yDim, 3+initialRadius, zDim, &randomNumberGenerator); - initialDirection->Randomize(-0.2, 0.2, -2, -1, -0.2, 0.2, &randomNumberGenerator); + initialPosition->Randomize(initialRadius, xDim - initialRadius, yDim, yDim, 3+initialRadius, zDim - initialRadius, &randomNumberGenerator); + initialDirection->Randomize(-DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, -2, -1, -DIRECTION_VECTOR_WIGGLE_ROOM, DIRECTION_VECTOR_WIGGLE_ROOM, &randomNumberGenerator); } } mitk::PhotoacousticVesselTree::Pointer vesselStructure = mitk::PhotoacousticVesselTree::New(); std::stringstream scatteringString; scatteringString <<"vessel_"<AddDoubleProperty(scatteringString.str(), vesselScattering); std::stringstream anisotropyString; anisotropyString <<"vessel_"<AddDoubleProperty(anisotropyString.str(), vesselAnisotropy); MITK_DEBUG << "Initializing vessel structure"; vesselStructure->Initialize(initialPosition, initialDirection, initialRadius, absorptionCoefficient, vesselScattering, vesselAnisotropy, bifurcationFrequency, &randomNumberGenerator); MITK_DEBUG << "Simulating vessel structure"; while(!vesselStructure->IsFinished()) { vesselStructure->Step(generatedVolume, calculateNewVesselPositionCallback, bendingFactor, &randomNumberGenerator); } } generatedVolume->GaussianBlur3D(); generatedVolume->FinalizeVolume(randomizePhysicalProperties, randomPercentage, useRngSeed, rngSeed); return generatedVolume; } diff --git a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.h b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.h index f8b2224ea0..5b9f036d73 100644 --- a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.h +++ b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticTissueGenerator.h @@ -1,112 +1,114 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef mitkPhotoacousticTissueGenerator_h #define mitkPhotoacousticTissueGenerator_h #include #include #include #include #include #include "mitkPhotoacousticVesselTree.h" #include "mitkPhotoacousticVolume.h" #include "mitkCommon.h" namespace mitk { class MITKPHOTOACOUSTICSIMULATION_EXPORT PhotoacousticTissueGenerator final { public: /** * @brief GenerateInSilicoData This method will return a PhotoacousticVolume created in terms of the given parameters. * @param xDim x dimension of the generated volume * @param yDim y dimension of the generated volume * @param zDim z dimension of the generated volume * @param spacing voxel spacing. Every dimension is equally spaced. * @param basicAbsorption absorption coefficient for standard tissue * @param basicScattering scattering coefficient for standard tissue * @param basicAnisotropy anisotropy factor for standard tissue * @param airThickness * @param skinAbsorption * @param skinScattering * @param skinAnisotropy * @param skinThickness * @param fatAbsorption * @param fatScattering * @param fatAnisotropy * @param fatPercentage, * @param minNumberOfVessels minimum number of vessels generated in volume * @param maxNumberOfVessels maximum number of vessels generated in volume * @param minBending minimum bending coefficient (0 = not bending; >1 = bending a lot) * @param maxBending maximum bending coefficient * @param minAbs minimum absorption coefficient for blood vessel * @param maxAbs maximum absorption coefficient for blood vessel * @param minRadius minimum vessel radius * @param maxRadius maximum vessel radius * @param mcflag the montecarlo flag (chosen probe design) * @param launchflag * @param boundaryflag * @param launchPointX * @param launchPointY * @param launchPointZ * @param focusPointX * @param focusPointY * @param focusPointZ * @param trajectoryVectorX * @param trajectoryVectorY * @param trajectoryVectorZ * @param radius * @param waist * @param sigma * @param doGauss * @param bifurcationFrequency * @param calculateNewVesselPositionCallback * @return */ static mitk::PhotoacousticVolume::Pointer GenerateInSilicoData(int xDim, int yDim, int zDim, double spacing, double basicAbsorption, double basicScattering, double basicAnisotropy, double airThickness, double skinAbsorption, double skinScattering, double skinAnisotropy, double skinThickness, double fatAbsorption, double fatScattering, double fatAnisotropy, double fatPercentage, bool randomizePhysicalproperties, double randomPercentage, int minNumberOfVessels, int maxNumberOfVessels, double minBending, double maxBending, double minAbs, double maxAbs, double minRadius, double maxRadius, double mcflag, double launchflag, double boundaryflag, double launchPointX, double launchPointY, double launchPointZ, double focusPointX, double focusPointY, double focusPointZ, double trajectoryVectorX, double trajectoryVectorY, double trajectoryVectorZ, double radius, double waist, double sigma, bool doGauss, int bifurcationFrequency, double vesselScattering, double vesselAnisotropy, bool useRngSeed, long rngSeed, mitk::PhotoacousticVessel::CalculateNewVesselPositionCallback calculateNewVesselPositionCallback); private: PhotoacousticTissueGenerator(); virtual ~PhotoacousticTissueGenerator(); + const double DIRECTION_VECTOR_INITIAL_VARIANCE = 0.2; + }; } #endif diff --git a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVessel.cpp b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVessel.cpp index 1c7cc04292..432423ed99 100644 --- a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVessel.cpp +++ b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVessel.cpp @@ -1,162 +1,163 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkPhotoacousticVessel.h" #include #include #include mitk::PhotoacousticVessel::PhotoacousticVessel(): m_Range(M_PI/16, M_PI/8), m_Sign(-1, 1) { srand(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); m_Finished = false; m_Position = nullptr; m_Direction = nullptr; m_Radius = -1; m_AbsorptionCoefficient = -1; m_ScatteringCoefficient = -1; m_AnisotropyCoefficient = -1; m_VesselMeanderStrategy = nullptr; m_WalkedDistance = 0; m_State = UNINITIALIZED; } mitk::PhotoacousticVessel::~PhotoacousticVessel() { m_Position = nullptr; m_Direction = nullptr; m_VesselMeanderStrategy = nullptr; m_State = UNINITIALIZED; } void mitk::PhotoacousticVessel::Initialize(mitk::PhotoacousticSmartVector::Pointer initialPosition, mitk::PhotoacousticSmartVector::Pointer initialDirection, double initialRadius, double absorptionCoefficient, double scatteringCoefficient, double anisotophyCoefficient, double bifurcationFrequency, std::mt19937* rng) { m_Radius = initialRadius; m_AbsorptionCoefficient = absorptionCoefficient; m_ScatteringCoefficient = scatteringCoefficient; m_AnisotropyCoefficient = anisotophyCoefficient; m_Finished = false; m_Position = initialPosition; m_Direction = initialDirection; m_VesselMeanderStrategy = mitk::PhotoacousticVesselMeanderStrategy::New(); m_State = INITIALIZED; std::normal_distribution<> factor(1, 0.2); m_BifurcationFrequency = bifurcationFrequency * factor(*rng); + MITK_INFO << "Bif. frequency: " << m_BifurcationFrequency; } void mitk::PhotoacousticVessel::ExpandVessel(mitk::PhotoacousticVolume::Pointer volume, CalculateNewVesselPositionCallback calculateNewPosition, double bendingFactor, std::mt19937* rng) { AssertState(INITIALIZED); mitk::PhotoacousticSmartVector::Pointer oldPosition = mitk::PhotoacousticSmartVector::New(); oldPosition->SetValue(m_Position); (m_VesselMeanderStrategy->*calculateNewPosition)(m_Position, m_Direction, bendingFactor, rng); DrawVesselInVolume(oldPosition, volume); } bool mitk::PhotoacousticVessel::CanBifurcate() { return m_BifurcationFrequency < m_WalkedDistance; } mitk::PhotoacousticVessel::Pointer mitk::PhotoacousticVessel::Bifurcate(std::mt19937* rng) { AssertState(INITIALIZED); mitk::PhotoacousticVessel::Pointer newVessel = mitk::PhotoacousticVessel::New(); mitk::PhotoacousticSmartVector::Pointer newDirection = m_Direction->Clone(); double thetaChange = m_Range(*rng) * (m_Sign(*rng) < 0 ? -1 : 1); double phiChange = m_Range(*rng) * (m_Sign(*rng) < 0 ? -1 : 1); - MITK_INFO << "Theta change: " << thetaChange; - MITK_INFO << "Phi change: " << phiChange; - MITK_INFO << "(m_Sign(*rng) = " << (m_Sign(*rng)); + MITK_DEBUG << "Theta change: " << thetaChange; + MITK_DEBUG << "Phi change: " << phiChange; + MITK_DEBUG << "(m_Sign(*rng) = " << (m_Sign(*rng)); newDirection->Rotate(thetaChange, phiChange); m_Direction->Rotate(-thetaChange, -phiChange); std::uniform_real_distribution<> rangeRadius(m_Radius*0.6, m_Radius*0.8); double newRadius = rangeRadius(*rng); m_Radius = sqrt(m_Radius*m_Radius - newRadius*newRadius); newVessel->Initialize(m_Position->Clone(), newDirection, newRadius, m_AbsorptionCoefficient, m_ScatteringCoefficient, m_AnisotropyCoefficient, m_BifurcationFrequency, rng); m_WalkedDistance = 0; return newVessel; } void mitk::PhotoacousticVessel::DrawVesselInVolume(mitk::PhotoacousticSmartVector::Pointer fromPosition, mitk::PhotoacousticVolume::Pointer volume) { AssertState(INITIALIZED); mitk::PhotoacousticSmartVector::Pointer diffVector = mitk::PhotoacousticSmartVector::New(); diffVector->SetElement(0, fromPosition->GetElement(0)-m_Position->GetElement(0)); diffVector->SetElement(1, fromPosition->GetElement(1)-m_Position->GetElement(1)); diffVector->SetElement(2, fromPosition->GetElement(2)-m_Position->GetElement(2)); mitk::PhotoacousticSmartVector::Pointer stepSize = mitk::PhotoacousticSmartVector::New(); stepSize->SetValue(m_Direction); stepSize->Scale(SCALING_FACTOR); while (diffVector->GetNorm() >= SCALING_FACTOR) { m_WalkedDistance += stepSize->GetNorm(); fromPosition->SetElement(0, fromPosition->GetElement(0)+stepSize->GetElement(0)); fromPosition->SetElement(1, fromPosition->GetElement(1)+stepSize->GetElement(1)); fromPosition->SetElement(2, fromPosition->GetElement(2)+stepSize->GetElement(2)); int xPos = fromPosition->GetElement(0); int yPos = fromPosition->GetElement(1); int zPos = fromPosition->GetElement(2); for(int x = xPos - m_Radius; x <= xPos + m_Radius; x++) for(int y = yPos - m_Radius; y <= yPos + m_Radius; y++) for(int z = zPos - m_Radius; z <= zPos + m_Radius; z++) { if( m_Radius*m_Radius >= (x-xPos)*(x-xPos)+(y-yPos)*(y-yPos)+(z-zPos)*(z-zPos)) { volume->SetVolumeValues(x, y, z, m_AbsorptionCoefficient, m_ScatteringCoefficient, m_AnisotropyCoefficient, mitk::PhotoacousticVolume::SegmentationType::VESSEL); } } diffVector->SetElement(0, fromPosition->GetElement(0)-m_Position->GetElement(0)); diffVector->SetElement(1, fromPosition->GetElement(1)-m_Position->GetElement(1)); diffVector->SetElement(2, fromPosition->GetElement(2)-m_Position->GetElement(2)); if(!volume->IsInsideVolume(xPos, yPos, zPos)) { m_Radius = 0; break; } } } bool mitk::PhotoacousticVessel::IsFinished() { return m_Radius < MIN_RADIUS; } diff --git a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVesselMeanderStrategy.cpp b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVesselMeanderStrategy.cpp index 63a4e803a5..9295a00387 100644 --- a/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVesselMeanderStrategy.cpp +++ b/Modules/PhotoacousticSimulation/src/Algorithms/mitkPhotoacousticVesselMeanderStrategy.cpp @@ -1,53 +1,53 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkPhotoacousticVesselMeanderStrategy.h" mitk::PhotoacousticVesselMeanderStrategy::PhotoacousticVesselMeanderStrategy() { } mitk::PhotoacousticVesselMeanderStrategy::~PhotoacousticVesselMeanderStrategy() { } void mitk::PhotoacousticVesselMeanderStrategy::CalculateNewPositionInStraightLine(mitk::PhotoacousticSmartVector::Pointer position, mitk::PhotoacousticSmartVector::Pointer direction, double /*bendingFactor*/, std::mt19937* rng) { if(direction->GetNorm() <= mitk::eps) { direction->Randomize(rng); } position->SetElement(0,position->GetElement(0) + direction->GetElement(0)); position->SetElement(1,position->GetElement(1) + direction->GetElement(1)); position->SetElement(2,position->GetElement(2) + direction->GetElement(2)); } void mitk::PhotoacousticVesselMeanderStrategy::CalculateRandomlyDivergingPosition(mitk::PhotoacousticSmartVector::Pointer position, mitk::PhotoacousticSmartVector::Pointer direction, double bendingFactor, std::mt19937* rng) { if(direction->GetNorm() <= mitk::eps) { direction->Randomize(rng); } - direction->RandomizeByPercentage(0.1, bendingFactor, rng); + direction->RandomizeByPercentage(0.4, bendingFactor, rng); position->SetElement(0,position->GetElement(0) + direction->GetElement(0)); position->SetElement(1,position->GetElement(1) + direction->GetElement(1)); position->SetElement(2,position->GetElement(2) + direction->GetElement(2)); } diff --git a/Modules/PhotoacousticSimulation/src/Utils/mitkPhotoacousticSmartVector.cpp b/Modules/PhotoacousticSimulation/src/Utils/mitkPhotoacousticSmartVector.cpp index c33a9f6a0c..b1b816606c 100644 --- a/Modules/PhotoacousticSimulation/src/Utils/mitkPhotoacousticSmartVector.cpp +++ b/Modules/PhotoacousticSimulation/src/Utils/mitkPhotoacousticSmartVector.cpp @@ -1,139 +1,139 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkPhotoacousticSmartVector.h" #include "chrono" #include "math.h" mitk::PhotoacousticSmartVector::PhotoacousticSmartVector() { srand(std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count()); m_Vector.Fill(0); } mitk::PhotoacousticSmartVector::~PhotoacousticSmartVector() { m_Vector.Fill(0); } double mitk::PhotoacousticSmartVector::GetNorm() { return m_Vector.GetNorm(); } double mitk::PhotoacousticSmartVector::GetElement(unsigned short index) { return m_Vector.GetElement(index); } void mitk::PhotoacousticSmartVector::SetElement(unsigned short index, double value) { m_Vector.SetElement(index, value); } void mitk::PhotoacousticSmartVector::Normalize() { double norm = m_Vector.GetNorm(); m_Vector.SetElement(0, m_Vector.GetElement(0)/norm); m_Vector.SetElement(1, m_Vector.GetElement(1)/norm); m_Vector.SetElement(2, m_Vector.GetElement(2)/norm); } void mitk::PhotoacousticSmartVector::SetValue(mitk::PhotoacousticSmartVector::Pointer value) { m_Vector.SetElement(0, value->GetElement(0)); m_Vector.SetElement(1, value->GetElement(1)); m_Vector.SetElement(2, value->GetElement(2)); } void mitk::PhotoacousticSmartVector::RandomizeByPercentage(double percentage, double bendingFactor, std::mt19937* rng) { std::uniform_real_distribution<> range(-percentage, percentage); m_Vector.SetElement(0, m_Vector.GetElement(0) + (bendingFactor * range(*rng))); m_Vector.SetElement(1, m_Vector.GetElement(1) + (bendingFactor * range(*rng))); m_Vector.SetElement(2, m_Vector.GetElement(2) + (bendingFactor * range(*rng))); } void mitk::PhotoacousticSmartVector::Randomize(double xLowerLimit, double xUpperLimit, double yLowerLimit, double yUpperLimit, double zLowerLimit, double zUpperLimit, std::mt19937* rng) { std::uniform_real_distribution<> rangeX(xLowerLimit, xUpperLimit); std::uniform_real_distribution<> rangeY(yLowerLimit, yUpperLimit); std::uniform_real_distribution<> rangeZ(zLowerLimit, zUpperLimit); m_Vector.SetElement(0, rangeX(*rng)); m_Vector.SetElement(1, rangeY(*rng)); m_Vector.SetElement(2, rangeZ(*rng)); } void mitk::PhotoacousticSmartVector::Randomize(double xLimit, double yLimit, double zLimit, std::mt19937* rng) { Randomize(0, xLimit, 0, yLimit, 0, zLimit, rng); } void mitk::PhotoacousticSmartVector::Randomize(std::mt19937* rng) { Randomize(-1, 1, -1, 1, -1, 1, rng); } void mitk::PhotoacousticSmartVector::PrintSelf(std::ostream& os, itk::Indent indent) const { os << "X: " << m_Vector.GetElement(0) << std::endl; os << "Y: " << m_Vector.GetElement(1) << std::endl; os << "Z: " << m_Vector.GetElement(2) << std::endl; os << "Length: " << m_Vector.GetNorm() << std::endl; } void mitk::PhotoacousticSmartVector::Rotate(double thetaChange, double phiChange) { - MITK_INFO << "Vector before rotation: ("<SetElement(0, this->GetElement(0)); returnVector->SetElement(1, this->GetElement(1)); returnVector->SetElement(2, this->GetElement(2)); return returnVector; }