Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void CrosshairManager::setTargetSliceDirection(const SliceDirection & dir)
- {
- this->targeDir = dir;
- }
- Coordinate CrosshairManager::getCoordinateMR(const SliceDirection& targetDir) const
- {
- int targetIndex = static_cast<int>(this->targeDir);
- int sagittalIndex = static_cast<int>(SliceDirection::Sagittal);
- int coronalIndex = static_cast<int>(SliceDirection::Coronal);
- int axialIndex = static_cast<int>(SliceDirection::Axial);
- // Получаем центральные индексы для всех проекций
- int centerSagittal = maxSliceIndices[sagittalIndex] / 2;
- int centerCoronal = maxSliceIndices[coronalIndex] / 2;
- int centerAxial = maxSliceIndices[axialIndex] / 2;
- // Вычисляем смещения от центра в единицах слайсов (не в мм!)
- double sagittalOffset = sliceIndices[sagittalIndex] - centerSagittal;
- double coronalOffset = sliceIndices[coronalIndex] - centerCoronal;
- double axialOffset = sliceIndices[axialIndex] - centerAxial;
- Coordinate normCoord;
- switch (targetDir)
- {
- case SliceDirection::Axial:
- {
- // Для аксиалки используем только spacing аксиалки
- double xSpacing = spacing[axialIndex][0]; // X - это сагиттальное направление
- double ySpacing = spacing[axialIndex][1]; // Y - это корональное направление
- double sagittalSpacing = spacing[sagittalIndex][0];
- double coronalSpacing = spacing[coronalIndex][1];
- sagittalSpacing = sagittalSpacing == 0 ? 1 : sagittalSpacing;
- coronalSpacing = coronalSpacing == 0 ? 1 : coronalSpacing;
- normCoord.setXYZ(
- 0.5 + (sagittalOffset * (xSpacing / spacingFactory)) / (maxSliceIndices[targetIndex] * sagittalSpacing),
- 0.5 + (coronalOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[targetIndex] * coronalSpacing)
- );
- normCoord.setX(1.0 - normCoord.getX());
- break;
- }
- case SliceDirection::Sagittal:
- {
- // Для сагитталки используем только spacing сагитталки
- double xSpacing = spacing[sagittalIndex][0]; // X - это корональное направление
- double ySpacing = spacing[sagittalIndex][1]; // Y - это аксиальное направление
- double coronalSpacing = spacing[coronalIndex][0];
- double axialSpacing = spacing[axialIndex][1];
- coronalSpacing = coronalSpacing == 0 ? 1 : coronalSpacing;
- axialSpacing = axialSpacing == 0 ? 1 : axialSpacing;
- normCoord.setXYZ(
- 0.5 + (coronalOffset * (xSpacing / spacingFactory)) / (maxSliceIndices[targetIndex] * coronalSpacing),
- 0.5 + (axialOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[targetIndex] * axialSpacing)
- );
- break;
- }
- case SliceDirection::Coronal:
- {
- // Для короналки используем только spacing короналки
- double xSpacing = spacing[coronalIndex][0]; // X - это сагиттальное направление
- double ySpacing = spacing[coronalIndex][1]; // Y - это аксиальное направление
- double sagittalSpacing = spacing[sagittalIndex][0];
- double axialSpacing = spacing[axialIndex][1];
- sagittalSpacing = sagittalSpacing == 0 ? 1 : sagittalSpacing;
- axialSpacing = axialSpacing == 0 ? 1 : axialSpacing;
- normCoord.setXYZ(
- 0.5 + (sagittalOffset * (xSpacing / spacingFactory)) / (maxSliceIndices[targetIndex] * sagittalSpacing),
- 0.5 + (axialOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[targetIndex] * axialSpacing)
- );
- normCoord.setX(1.0 - normCoord.getX());
- break;
- }
- }
- return applyFlipToCoordinate(normCoord, targetDir);
- }
Advertisement
Add Comment
Please, Sign In to add comment