104 std::vector<QLineF> norms = {
113 const qreal xfactor = 23.0;
114 const qreal yfactor = 17.0;
127 QPointF start_offset(xoffset, yoffset);
128 QPointF end_offset(0, 0);
134 QPointF intersect_point_start, intersect_point_end;
135 QLineF intersect_norm_start, intersect_norm_end;
139 for (
int i = 1; i < end_polygon.count(); ++i) {
142 QLineF item_side = QLineF(
p1,
p2);
143 QLineF::IntersectType intersect_type = item_side.intersects(center_line, &intersect_point_end);
145 if (intersect_type == QLineF::BoundedIntersection) {
146 intersect_norm_end = norms[i - 1];
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) {
163 intersect_point_start.y() };
167 intersect_point_start.y() };
172 start_sp = { intersect_point_start.x(),
176 intersect_norm_start = norms[i - 1];
183 QLineF direct_line(start_sp, intersect_point_end);
187 label_br.translate(-label_br.width() / 2, label_br.height() / 2);
191 cardinality_br.translate(-cardinality_br.width() / 2, cardinality_br.height() / 2);
193 qreal label_x_padding = 2;
194 qreal label_y_padding = -2;
195 qreal card_x_padding = 2;
196 qreal card_y_padding = -2;
198 QPainterPath path(intersect_point_start);
200 if ((intersect_norm_start.dx() == 0) && (intersect_norm_end.dx() == 0)) {
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());
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)));
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)));
216 }
else if ((intersect_norm_start.dy() == 0) && (intersect_norm_end.dy() == 0)) {
218 QPointF wp1 = QPointF(direct_line.center().x() - xoffset, direct_line.y1());
219 QPointF wp2 = QPointF(direct_line.center().x() - xoffset, direct_line.y2());
221 path.moveTo(direct_line.x1(), direct_line.y1());
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)));
232 }
else if (intersect_norm_start.dx() == 0) {
234 QPointF wp1 = QPointF(direct_line.x1(), direct_line.y2());
236 path.moveTo(direct_line.x1(), direct_line.y1());
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)));
245 }
else if (intersect_norm_start.dy() == 0) {
247 QPointF wp1 = QPointF(direct_line.x2(), direct_line.y1());
248 path.moveTo(direct_line.x1(), direct_line.y1());
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)));
259 path.lineTo(intersect_point_end);
270 m_marker = this->
make_rhombus(-intersect_norm_start.angle() / 180 * M_PI).translated(this->p1());