95{
97
98
99 return;
100 }
101
102 std::vector<QLineF> norms = {
103 {0.,0., 0., 1.},
104 {0.,0., 1., 0.},
105 {0.,0., 0, -1.},
106 {0.,0., -1., 0.},
107 };
108
109 qreal xoffset;
110 qreal yoffset;
111 const qreal xfactor = 23.0;
112 const qreal yfactor = 17.0;
115 }
116 else {
118 }
119
122 }
123 else {
125 }
126
127 QPointF start_offset(xoffset, yoffset);
128 QPointF end_offset(0, 0);
129
134 QPointF intersect_point_start, intersect_point_end;
135 QLineF intersect_norm_start, intersect_norm_end;
136
137
139 for ( int i = 1; i < end_polygon.count(); ++i )
140 {
141
143 QLineF item_side = QLineF (
p1,
p2 );
144 QLineF::IntersectType intersect_type = item_side.intersects ( center_line, &intersect_point_end );
145
146 if ( intersect_type == QLineF::BoundedIntersection ) {
147 intersect_norm_end = norms[i-1];
148 break;
149 }
150
152 }
153
155 QPointF start_sp;
156 for ( int i = 1; i < start_polygon.count(); ++i )
157 {
159 QLineF item_side = QLineF (
p1,
p2 );
160 QLineF::IntersectType intersect_type = item_side.intersects ( center_line,
161 &intersect_point_start );
162 if ( intersect_type == QLineF::BoundedIntersection ) {
163 switch (i) {
164 case 1:
166 intersect_point_start.y()};
167 break;
168 case 3:
170 intersect_point_start.y()};
171 break;
172
173 case 2:
174 case 4: start_sp={intersect_point_start.x(),
176 break;
177 }
178 intersect_norm_start = norms[i-1];
179 break;
180 }
181
183 }
184
185 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 = 2;
200 qreal card_y_padding = -2;
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