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>(targetDir);
- int sagittalIndex = static_cast<int>(SliceDirection::Sagittal);
- int coronalIndex = static_cast<int>(SliceDirection::Coronal);
- int axialIndex = static_cast<int>(SliceDirection::Axial);
- int index = static_cast<int>(this->targeDir);
- // Получаем центральные индексы для всех проекций
- int center = maxSliceIndices[index] / 2;
- int sagittalSlice = sliceIndices[sagittalIndex];
- int coronalSlice = sliceIndices[coronalIndex];
- int axialSlice = sliceIndices[axialIndex];
- sagittalSlice = std::clamp(sagittalSlice, 1, maxSliceIndices[index]);
- coronalSlice = std::clamp(sagittalSlice, 1, maxSliceIndices[index]);
- axialSlice = std::clamp(sagittalSlice, 1, maxSliceIndices[index]);
- // Вычисляем смещения от центра в единицах слайсов (не в мм!)
- double sagittalOffset = sagittalSlice - center;
- double coronalOffset = coronalSlice - center;
- double axialOffset = axialSlice - center;
- 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[index] * sagittalSpacing),
- 0.5 + (coronalOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[index] * 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[index] * coronalSpacing),
- 0.5 + (axialOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[index] * 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[index] * sagittalSpacing),
- 0.5 + (axialOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[index] * axialSpacing)
- );
- normCoord.setX(1.0 - normCoord.getX());
- break;
- }
- }
- return applyFlipToCoordinate(normCoord, targetDir);
- }
Advertisement
Add Comment
Please, Sign In to add comment