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 }