Chekushka

Untitled

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