Chekushka

Untitled

Aug 12th, 2025
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. void CrosshairManager::setTargetSliceDirection(const SliceDirection & dir)
  2. {
  3.     this->targeDir = dir;
  4. }
  5.  
  6. Coordinate CrosshairManager::getCoordinateMR(const SliceDirection& targetDir) const
  7. {
  8.     int targetIndex = static_cast<int>(targetDir);
  9.     int sagittalIndex = static_cast<int>(SliceDirection::Sagittal);
  10.     int coronalIndex = static_cast<int>(SliceDirection::Coronal);
  11.     int axialIndex = static_cast<int>(SliceDirection::Axial);
  12.  
  13.     int index = static_cast<int>(this->targeDir);
  14.      
  15.     // Получаем центральные индексы для всех проекций
  16.     int center = maxSliceIndices[index] / 2;
  17.  
  18.     int sagittalSlice = sliceIndices[sagittalIndex];
  19.     int coronalSlice = sliceIndices[coronalIndex];
  20.     int axialSlice = sliceIndices[axialIndex];
  21.  
  22.     sagittalSlice = std::clamp(sagittalSlice, 1, maxSliceIndices[index]);
  23.     coronalSlice = std::clamp(sagittalSlice, 1, maxSliceIndices[index]);
  24.     axialSlice = std::clamp(sagittalSlice, 1, maxSliceIndices[index]);
  25.  
  26.     // Вычисляем смещения от центра в единицах слайсов (не в мм!)
  27.     double sagittalOffset = sagittalSlice - center;
  28.     double coronalOffset = coronalSlice - center;
  29.     double axialOffset = axialSlice - center;
  30.  
  31.  
  32.     Coordinate normCoord;
  33.     switch (targetDir)
  34.     {
  35.         case SliceDirection::Axial:
  36.         {
  37.             // Для аксиалки используем только spacing аксиалки
  38.             double xSpacing = spacing[axialIndex][0]; // X - это сагиттальное направление
  39.             double ySpacing = spacing[axialIndex][1]; // Y - это корональное направление
  40.             double sagittalSpacing = spacing[sagittalIndex][0];
  41.             double coronalSpacing = spacing[coronalIndex][1];
  42.  
  43.             sagittalSpacing = sagittalSpacing == 0 ? 1 : sagittalSpacing;
  44.             coronalSpacing = coronalSpacing == 0 ? 1 : coronalSpacing;
  45.  
  46.             normCoord.setXYZ(
  47.                 0.5 + (sagittalOffset * (xSpacing / spacingFactory)) / (maxSliceIndices[index] * sagittalSpacing),
  48.                 0.5 + (coronalOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[index] * coronalSpacing)
  49.             );
  50.             normCoord.setX(1.0 - normCoord.getX());
  51.             break;
  52.         }
  53.         case SliceDirection::Sagittal:
  54.         {
  55.             // Для сагитталки используем только spacing сагитталки
  56.             double xSpacing = spacing[sagittalIndex][0]; // X - это корональное направление
  57.             double ySpacing = spacing[sagittalIndex][1]; // Y - это аксиальное направление
  58.             double coronalSpacing = spacing[coronalIndex][0];
  59.             double axialSpacing = spacing[axialIndex][1];
  60.  
  61.             coronalSpacing = coronalSpacing == 0 ? 1 : coronalSpacing;
  62.             axialSpacing = axialSpacing == 0 ? 1 : axialSpacing;
  63.  
  64.             normCoord.setXYZ(
  65.                 0.5 + (coronalOffset * (xSpacing / spacingFactory)) / (maxSliceIndices[index] * coronalSpacing),
  66.                 0.5 + (axialOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[index] * axialSpacing)
  67.             );
  68.             break;
  69.         }
  70.         case SliceDirection::Coronal:
  71.         {
  72.             // Для короналки используем только spacing короналки
  73.             double xSpacing = spacing[coronalIndex][0]; // X - это сагиттальное направление
  74.             double ySpacing = spacing[coronalIndex][1]; // Y - это аксиальное направление
  75.             double sagittalSpacing = spacing[sagittalIndex][0];
  76.             double axialSpacing = spacing[axialIndex][1];
  77.  
  78.             sagittalSpacing = sagittalSpacing == 0 ? 1 : sagittalSpacing;
  79.             axialSpacing = axialSpacing == 0 ? 1 : axialSpacing;
  80.  
  81.             normCoord.setXYZ(
  82.                 0.5 + (sagittalOffset * (xSpacing / spacingFactory)) / (maxSliceIndices[index] * sagittalSpacing),
  83.                 0.5 + (axialOffset * (ySpacing / spacingFactory)) / (maxSliceIndices[index] * axialSpacing)
  84.             );
  85.             normCoord.setX(1.0 - normCoord.getX());
  86.             break;
  87.         }
  88.     }
  89.  
  90.     return applyFlipToCoordinate(normCoord, targetDir);
  91. }
Advertisement
Add Comment
Please, Sign In to add comment