96{
98
99
100 return;
101 }
102
103 std::vector<QLineF> norms = {
104 {0.,0., 0., 1.},
105 {0.,0., 1., 0.},
106 {0.,0., 0, -1.},
107 {0.,0., -1., 0.},
108 };
109
110 qreal xoffset;
111 qreal yoffset;
112 const qreal xfactor = 23.0;
113 const qreal yfactor = 17.0;
116 }
117 else {
119 }
120
123 }
124 else {
126 }
127
128 QPointF start_offset(xoffset, yoffset);
129 QPointF end_offset(0, 0);
130
135 QPointF intersect_point_start, intersect_point_end;
136 QLineF intersect_norm_start, intersect_norm_end;
137
138
140 for ( int i = 1; i < end_polygon.count(); ++i )
141 {
142
144 QLineF item_side = QLineF (
p1,
p2 );
145 QLineF::IntersectType intersect_type = item_side.intersects ( center_line, &intersect_point_end );
146
147 if ( intersect_type == QLineF::BoundedIntersection ) {
148 intersect_norm_end = norms[i-1];
149 break;
150 }
151
153 }
154
156 QPointF start_sp;
157 for ( int i = 1; i < start_polygon.count(); ++i )
158 {
160 QLineF item_side = QLineF (
p1,
p2 );
161 QLineF::IntersectType intersect_type = item_side.intersects ( center_line,
162 &intersect_point_start );
163 if ( intersect_type == QLineF::BoundedIntersection ) {
164 switch (i) {
165 case 1:
167 intersect_point_start.y()};
168 break;
169 case 3:
171 intersect_point_start.y()};
172 break;
173
174 case 2:
175 case 4: start_sp={intersect_point_start.x(),
177 break;
178 }
179 intersect_norm_start = norms[i-1];
180 break;
181 }
182
184 }
185
186 QLineF direct_line(start_sp, intersect_point_end);
188
189 label_br.translate(-label_br.width()/2, label_br.height()/2);
190
191
193
194 cardinality_br.translate(-cardinality_br.width()/2, cardinality_br.height()/2);
195
196
197 qreal label_x_padding = 2;
198 qreal label_y_padding = -2;
199 qreal card_x_padding = 20;
200 qreal card_y_padding = 0;
201
202 QPainterPath path( intersect_point_start );
203
204 if ((intersect_norm_start.dx() == 0) && (intersect_norm_end.dx() == 0)) {
205
206 QPointF wp1 = QPointF(direct_line.x1(),
207 direct_line.center().y()+yoffset);
208 QPointF wp2 = QPointF(direct_line.x2(),
209 direct_line.center().y()+yoffset);
210 path.moveTo(direct_line.x1(), direct_line.y1());
211 path.lineTo(wp1);
212 path.lineTo(wp2);
213
214
215 label_br.translate( wp2
216 + QPointF(
217 (direct_line.dx() < 0 ? 1 : -1) * (label_x_padding+label_br.width()/2),
218 (direct_line.dy() > 0 ? 1 : -1) * (label_br.height()+label_y_padding)
219 )
220 );
221
222 cardinality_br.translate( intersect_point_start
223 + QPointF(
224 (direct_line.dx() < 0 ? 1 : -1) * (card_x_padding+cardinality_br.width()/2),
225 (direct_line.dy() > 0 ? 1 : -1) * (cardinality_br.height()+card_y_padding)
226 )
227 );
228
229 } else if ((intersect_norm_start.dy() == 0) && (intersect_norm_end.dy() == 0)) {
230
231 QPointF wp1 = QPointF(direct_line.center().x()-xoffset,
232 direct_line.y1());
233 QPointF wp2 = QPointF(direct_line.center().x()-xoffset,
234 direct_line.y2());
235
236 path.moveTo(direct_line.x1(), direct_line.y1());
237 path.lineTo(wp1);
238 path.lineTo(wp2);
239
240
241 label_br.translate( wp2
242 + QPointF(
243 (direct_line.dx() > 0 ? 1 : -1) * (label_x_padding+label_br.width()/2),
244 (direct_line.dy() < 0 ? 1 : -1) * (label_br.height()+label_y_padding)
245 )
246 );
247 cardinality_br.translate( intersect_point_start
248 + QPointF(
249 (direct_line.dx() > 0 ? 1 : -1) * (card_x_padding+cardinality_br.width()/2),
250 (direct_line.dy() < 0 ? 1 : -1) * (cardinality_br.height()+card_y_padding)
251 )
252 );
253
254 } else if (intersect_norm_start.dx() == 0) {
255
256 QPointF wp1 = QPointF(direct_line.x1(), direct_line.y2());
257
258 path.moveTo(direct_line.x1(), direct_line.y1());
259 path.lineTo(wp1);
260
261 label_br.translate( wp1
262 + QPointF(
263 (direct_line.dx() > 0 ? 1 : -1) * (label_x_padding+label_br.width()/2),
264 (direct_line.dy() < 0 ? 1 : -1) * (label_br.height()+label_y_padding)
265 )
266 );
267 cardinality_br.translate( intersect_point_start
268 + QPointF(
269 (direct_line.dx() < 0 ? 1 : -1) * (card_x_padding+cardinality_br.width()/2),
270 (direct_line.dy() > 0 ? 1 : -1) * (cardinality_br.height()+card_y_padding)
271 )
272 );
273
274 } else if (intersect_norm_start.dy() == 0) {
275
276 QPointF wp1 = QPointF(direct_line.x2(), direct_line.y1() );
277 path.moveTo(direct_line.x1(), direct_line.y1());
278
279 path.lineTo(wp1);
280
281
282 label_br.translate( wp1
283 + QPointF(
284 (direct_line.dx() > 0 ? 1 : -1) * (label_x_padding+label_br.width()/2),
285 (direct_line.dy() < 0 ? 1 : -1) * (label_br.height()+label_y_padding)
286 )
287 );
288 cardinality_br.translate( intersect_point_start
289 + QPointF(
290 (direct_line.dx() < 0 ? 1 : -1) * (card_x_padding+cardinality_br.width()/2),
291 (direct_line.dy() > 0 ? 1 : -1) * (cardinality_br.height()+card_y_padding)
292 )
293 );
294
295 }
296
297 path.lineTo( intersect_point_end );
298 setPath(path);
299
302
303
304
306 {
308 } else {
310 }
311}
QRectF boundingRect() const override
QPolygonF make_rhombus(qreal angle) const
QPolygonF make_arrow_head(qreal angle) const
QRectF boundingRect() const