97{
99
100
101 return;
102 }
103
104 std::vector<QLineF> norms = {
105 { 0., 0., 0., 1. },
106 { 0., 0., 1., 0. },
107 { 0., 0., 0, -1. },
108 { 0., 0., -1., 0. },
109 };
110
111 qreal xoffset;
112 qreal yoffset;
113 const qreal xfactor = 23.0;
114 const qreal yfactor = 17.0;
117 } else {
119 }
120
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
142 QLineF item_side = QLineF(
p1,
p2);
143 QLineF::IntersectType intersect_type = item_side.intersects(center_line, &intersect_point_end);
144
145 if (intersect_type == QLineF::BoundedIntersection) {
146 intersect_norm_end = norms[i - 1];
147 break;
148 }
149
151 }
152
154 QPointF start_sp;
155 for (int i = 1; i < start_polygon.count(); ++i) {
157 QLineF item_side = QLineF(
p1,
p2);
158 QLineF::IntersectType intersect_type = item_side.intersects(center_line, &intersect_point_start);
159 if (intersect_type == QLineF::BoundedIntersection) {
160 switch (i) {
161 case 1:
163 intersect_point_start.y() };
164 break;
165 case 3:
167 intersect_point_start.y() };
168 break;
169
170 case 2:
171 case 4:
172 start_sp = { intersect_point_start.x(),
174 break;
175 }
176 intersect_norm_start = norms[i - 1];
177 break;
178 }
179
181 }
182
183 QLineF direct_line(start_sp, intersect_point_end);
186
187 label_br.translate(-label_br.width() / 2, label_br.height() / 2);
188
190
191 cardinality_br.translate(-cardinality_br.width() / 2, cardinality_br.height() / 2);
192
193 qreal label_x_padding = 2;
194 qreal label_y_padding = -2;
195 qreal card_x_padding = 2;
196 qreal card_y_padding = -2;
197
198 QPainterPath path(intersect_point_start);
199
200 if ((intersect_norm_start.dx() == 0) && (intersect_norm_end.dx() == 0)) {
201
202 QPointF wp1 = QPointF(direct_line.x1(), direct_line.center().y() + yoffset);
203 QPointF wp2 = QPointF(direct_line.x2(), direct_line.center().y() + yoffset);
204 path.moveTo(direct_line.x1(), direct_line.y1());
205 path.lineTo(wp1);
206 path.lineTo(wp2);
207
208
209 label_br.translate(wp2 + QPointF((direct_line.dx() < 0 ? 1 : -1) * (label_x_padding + label_br.width() / 2),
210 (direct_line.dy() > 0 ? 1 : -1) * (label_br.height() + label_y_padding)));
211
212 cardinality_br.translate(intersect_point_start +
213 QPointF((direct_line.dx() < 0 ? 1 : -1) * (card_x_padding + cardinality_br.width() / 2),
214 (direct_line.dy() > 0 ? 1 : -1) * (cardinality_br.height() + card_y_padding)));
215
216 } else if ((intersect_norm_start.dy() == 0) && (intersect_norm_end.dy() == 0)) {
217
218 QPointF wp1 = QPointF(direct_line.center().x() - xoffset, direct_line.y1());
219 QPointF wp2 = QPointF(direct_line.center().x() - xoffset, direct_line.y2());
220
221 path.moveTo(direct_line.x1(), direct_line.y1());
222 path.lineTo(wp1);
223 path.lineTo(wp2);
224
225
226 label_br.translate(wp2 + QPointF((direct_line.dx() > 0 ? 1 : -1) * (label_x_padding + label_br.width() / 2),
227 (direct_line.dy() < 0 ? 1 : -1) * (label_br.height() + label_y_padding)));
228 cardinality_br.translate(intersect_point_start +
229 QPointF((direct_line.dx() > 0 ? 1 : -1) * (card_x_padding + cardinality_br.width() / 2),
230 (direct_line.dy() < 0 ? 1 : -1) * (cardinality_br.height() + card_y_padding)));
231
232 } else if (intersect_norm_start.dx() == 0) {
233
234 QPointF wp1 = QPointF(direct_line.x1(), direct_line.y2());
235
236 path.moveTo(direct_line.x1(), direct_line.y1());
237 path.lineTo(wp1);
238
239 label_br.translate(wp1 + QPointF((direct_line.dx() > 0 ? 1 : -1) * (label_x_padding + label_br.width() / 2),
240 (direct_line.dy() < 0 ? 1 : -1) * (label_br.height() + label_y_padding)));
241 cardinality_br.translate(intersect_point_start +
242 QPointF((direct_line.dx() < 0 ? 1 : -1) * (card_x_padding + cardinality_br.width() / 2),
243 (direct_line.dy() > 0 ? 1 : -1) * (cardinality_br.height() + card_y_padding)));
244
245 } else if (intersect_norm_start.dy() == 0) {
246
247 QPointF wp1 = QPointF(direct_line.x2(), direct_line.y1());
248 path.moveTo(direct_line.x1(), direct_line.y1());
249
250 path.lineTo(wp1);
251
252 label_br.translate(wp1 + QPointF((direct_line.dx() > 0 ? 1 : -1) * (label_x_padding + label_br.width() / 2),
253 (direct_line.dy() < 0 ? 1 : -1) * (label_br.height() + label_y_padding)));
254 cardinality_br.translate(intersect_point_start +
255 QPointF((direct_line.dx() < 0 ? 1 : -1) * (card_x_padding + cardinality_br.width() / 2),
256 (direct_line.dy() > 0 ? 1 : -1) * (cardinality_br.height() + card_y_padding)));
257 }
258
259 path.lineTo(intersect_point_end);
260 setPath(path);
261
264
265
266
269 } else {
271 }
272}
QRectF boundingRect() const override
QPolygonF make_rhombus(qreal angle) const
QPolygonF make_arrow_head(qreal angle) const
QRectF boundingRect() const