Mercurial > hg > orthanc-stone
comparison Framework/Radiography/RadiographyLayerResizeTracker.cpp @ 476:a95090305dd4 am-touch-events
Introduced ControlPoint instead of Corner in the trackers and layers + drawing mask from the ControlPoints
author | am@osimis.io |
---|---|
date | Wed, 13 Feb 2019 12:04:02 +0100 |
parents | 3b4df9925db6 |
children | 4f2416d519b4 |
comparison
equal
deleted
inserted
replaced
475:3c28542229a3 | 476:a95090305dd4 |
---|---|
83 | 83 |
84 | 84 |
85 RadiographyLayerResizeTracker::RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, | 85 RadiographyLayerResizeTracker::RadiographyLayerResizeTracker(UndoRedoStack& undoRedoStack, |
86 RadiographyScene& scene, | 86 RadiographyScene& scene, |
87 size_t layer, | 87 size_t layer, |
88 double x, | 88 const ControlPoint& startControlPoint, |
89 double y, | |
90 Corner corner, | |
91 bool roundScaling) : | 89 bool roundScaling) : |
92 undoRedoStack_(undoRedoStack), | 90 undoRedoStack_(undoRedoStack), |
93 accessor_(scene, layer), | 91 accessor_(scene, layer), |
94 roundScaling_(roundScaling) | 92 roundScaling_(roundScaling) |
95 { | 93 { |
99 originalSpacingX_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingX(); | 97 originalSpacingX_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingX(); |
100 originalSpacingY_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingY(); | 98 originalSpacingY_ = accessor_.GetLayer().GetGeometry().GetPixelSpacingY(); |
101 originalPanX_ = accessor_.GetLayer().GetGeometry().GetPanX(); | 99 originalPanX_ = accessor_.GetLayer().GetGeometry().GetPanX(); |
102 originalPanY_ = accessor_.GetLayer().GetGeometry().GetPanY(); | 100 originalPanY_ = accessor_.GetLayer().GetGeometry().GetPanY(); |
103 | 101 |
104 switch (corner) | 102 size_t oppositeControlPointType; |
103 switch (startControlPoint.index) | |
105 { | 104 { |
106 case Corner_TopLeft: | 105 case ControlPoint_TopLeftCorner: |
107 oppositeCorner_ = Corner_BottomRight; | 106 oppositeControlPointType = ControlPoint_BottomRightCorner; |
108 break; | 107 break; |
109 | 108 |
110 case Corner_TopRight: | 109 case ControlPoint_TopRightCorner: |
111 oppositeCorner_ = Corner_BottomLeft; | 110 oppositeControlPointType = ControlPoint_BottomLeftCorner; |
112 break; | 111 break; |
113 | 112 |
114 case Corner_BottomLeft: | 113 case ControlPoint_BottomLeftCorner: |
115 oppositeCorner_ = Corner_TopRight; | 114 oppositeControlPointType = ControlPoint_TopRightCorner; |
116 break; | 115 break; |
117 | 116 |
118 case Corner_BottomRight: | 117 case ControlPoint_BottomRightCorner: |
119 oppositeCorner_ = Corner_TopLeft; | 118 oppositeControlPointType = ControlPoint_TopLeftCorner; |
120 break; | 119 break; |
121 | 120 |
122 default: | 121 default: |
123 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | 122 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); |
124 } | 123 } |
125 | 124 |
126 accessor_.GetLayer().GetCorner(oppositeX_, oppositeY_, oppositeCorner_); | 125 accessor_.GetLayer().GetControlPoint(startOppositeControlPoint_, oppositeControlPointType); |
127 | 126 |
128 double d = ComputeDistance(x, y, oppositeX_, oppositeY_); | 127 double d = ComputeDistance(startControlPoint.x, startControlPoint.y, startOppositeControlPoint_.x, startOppositeControlPoint_.y); |
129 if (d >= std::numeric_limits<float>::epsilon()) | 128 if (d >= std::numeric_limits<float>::epsilon()) |
130 { | 129 { |
131 baseScaling_ = 1.0 / d; | 130 baseScaling_ = 1.0 / d; |
132 } | 131 } |
133 else | 132 else |
166 static const double ROUND_SCALING = 0.1; | 165 static const double ROUND_SCALING = 0.1; |
167 | 166 |
168 if (accessor_.IsValid() && | 167 if (accessor_.IsValid() && |
169 accessor_.GetLayer().GetGeometry().IsResizeable()) | 168 accessor_.GetLayer().GetGeometry().IsResizeable()) |
170 { | 169 { |
171 double scaling = ComputeDistance(oppositeX_, oppositeY_, sceneX, sceneY) * baseScaling_; | 170 double scaling = ComputeDistance(startOppositeControlPoint_.x, startOppositeControlPoint_.y, sceneX, sceneY) * baseScaling_; |
172 | 171 |
173 if (roundScaling_) | 172 if (roundScaling_) |
174 { | 173 { |
175 scaling = boost::math::round<double>((scaling / ROUND_SCALING) * ROUND_SCALING); | 174 scaling = boost::math::round<double>((scaling / ROUND_SCALING) * ROUND_SCALING); |
176 } | 175 } |
178 RadiographyLayer& layer = accessor_.GetLayer(); | 177 RadiographyLayer& layer = accessor_.GetLayer(); |
179 layer.SetPixelSpacing(scaling * originalSpacingX_, | 178 layer.SetPixelSpacing(scaling * originalSpacingX_, |
180 scaling * originalSpacingY_); | 179 scaling * originalSpacingY_); |
181 | 180 |
182 // Keep the opposite corner at a fixed location | 181 // Keep the opposite corner at a fixed location |
183 double ox, oy; | 182 ControlPoint currentOppositeCorner; |
184 layer.GetCorner(ox, oy, oppositeCorner_); | 183 layer.GetControlPoint(currentOppositeCorner, startOppositeControlPoint_.index); |
185 layer.SetPan(layer.GetGeometry().GetPanX() + oppositeX_ - ox, | 184 layer.SetPan(layer.GetGeometry().GetPanX() + startOppositeControlPoint_.x - currentOppositeCorner.x, |
186 layer.GetGeometry().GetPanY() + oppositeY_ - oy); | 185 layer.GetGeometry().GetPanY() + startOppositeControlPoint_.y - currentOppositeCorner.y); |
187 } | 186 } |
188 } | 187 } |
189 } | 188 } |