Line data Source code
1 : #include "CircleTrajectoryGenerator.h" 2 : #include "PlanarDetectorDescriptor.h" 3 : 4 : #include <optional> 5 : #include <vector> 6 : 7 : namespace elsa 8 : { 9 : std::unique_ptr<PlanarDetectorDescriptor> CircleTrajectoryGenerator::createTrajectory( 10 : index_t numberOfPoses, const DataDescriptor& volumeDescriptor, index_t arcDegrees, 11 : real_t sourceToCenter, real_t centerToDetector, 12 : std::optional<RealVector_t> principalPointOffset, 13 : std::optional<RealVector_t> centerOfRotOffset, std::optional<IndexVector_t> detectorSize, 14 : std::optional<RealVector_t> detectorSpacing) 15 20 : { 16 20 : auto thetas = [&]() { 17 20 : auto tmp = RealVector_t::LinSpaced(numberOfPoses, 0, static_cast<real_t>(arcDegrees)); 18 20 : return std::vector<real_t>{tmp.begin(), tmp.end()}; 19 20 : }(); 20 : 21 20 : return trajectoryFromAngles(thetas, volumeDescriptor, sourceToCenter, centerToDetector, 22 20 : principalPointOffset, centerOfRotOffset, detectorSize, 23 20 : detectorSpacing); 24 20 : } 25 : 26 : std::unique_ptr<PlanarDetectorDescriptor> CircleTrajectoryGenerator::trajectoryFromAngles( 27 : const std::vector<real_t>& thetas, const DataDescriptor& volumeDescriptor, 28 : real_t sourceToCenter, real_t centerToDetector, 29 : std::optional<RealVector_t> principalPointOffset, 30 : std::optional<RealVector_t> centerOfRotOffset, std::optional<IndexVector_t> detectorSize, 31 : std::optional<RealVector_t> detectorSpacing) 32 20 : { 33 20 : auto [coeffs, spacing, geometryList] = BaseCircleTrajectoryGenerator::createTrajectoryData( 34 20 : thetas, volumeDescriptor, sourceToCenter, centerToDetector, principalPointOffset, 35 20 : centerOfRotOffset, detectorSize, detectorSpacing); 36 : 37 20 : return std::make_unique<PlanarDetectorDescriptor>(std::move(coeffs), std::move(spacing), 38 20 : std::move(geometryList)); 39 20 : } 40 : } // namespace elsa