51 QPointF best_pt = point;
52 double best_dist = DBL_MAX;
67 bool insideLocalRect =
rect.contains(point);
69 return QPointF(qQNaN(), qQNaN());
70 }
else if (insideLocalRect) {
75 if (!isLastUsedPointCorrectNow &&
KisAlgebra2D::norm(point - strokeBegin) < moveThreshold) {
79 if (!snapToAny && isLastUsedPointCorrectNow) {
89 Q_FOREACH (
int vpIndex, possibleHandles) {
90 QPointF vp = *
handles()[vpIndex];
92 QPointF pt = QPointF();
93 QLineF snapLine = QLineF();
99 qreal dx = point.x() - strokeBegin.x();
100 qreal dy = point.y() - strokeBegin.y();
103 snapLine = QLineF(vp, strokeBegin);
105 QLineF vertical = QLineF(*
handles()[0],*
handles()[1]).normalVector();
106 snapLine = QLineF(vertical.p1(), vertical.p2());
107 QPointF translation = (vertical.p1()-strokeBegin)*-1.0;
108 snapLine = snapLine.translated(translation);
114 const qreal dx2 = dx * dx;
115 const qreal dy2 = dy * dy;
116 const qreal invsqrlen = 1.0 / (dx2 + dy2);
118 pt = QPointF(dx2 * point.x() + dy2 * snapLine.x1() + dx * dy * (point.y() - snapLine.y1()),
119 dx2 * snapLine.y1() + dy2 * point.y() + dx * dy * (point.x() - snapLine.x1()));
122 dist = qAbs(pt.x() - point.x()) + qAbs(pt.y() - point.y());
124 if (dist < best_dist) {
154 Q_UNUSED(updateRect);
162 bool isEditing =
false;
170 Q_FOREACH (
const QPointF* handle,
handles()) {
171 QPointF h = initialTransform.map(*handle);
172 QRectF ellipse = QRectF(QPointF(h.x() -15, h.y() -15), QSizeF(30, 30));
174 QPainterPath pathCenter;
175 pathCenter.addEllipse(ellipse);
181 QLineF normal = horizon.normalVector();
182 normal.translate(*
handles()[2]-normal.p1());
183 QPointF cov = horizon.center();
184 normal.intersects(horizon,&cov);
185 const QPointF center = initialTransform.map(cov);
186 QRectF center_ellipse = QRectF(QPointF(center.x() -15, center.y() -15), QSizeF(30, 30));
187 QPainterPath pathCenter;
188 pathCenter.addEllipse(center_ellipse);
196 QRect viewport = gc.viewport();
198 for (
int i = 0; i <
handles().size(); i++) {
199 const QPointF
p = initialTransform.map(*
handles()[i]);
200 for (
int currentAngle=0; currentAngle <= 180; currentAngle = currentAngle + tempDensity) {
203 float xPos = cos(currentAngle *
M_PI / 180);
204 float yPos = sin(currentAngle *
M_PI / 180);
209 QLineF snapLine = QLineF(
p,
p + unit);
213 path.moveTo(snapLine.p1());
214 path.lineTo(snapLine.p2());
217 QLineF snapLine2 = QLineF(
p,
p - unit);
221 path.moveTo(snapLine2.p1());
222 path.lineTo(snapLine2.p2());
239 const QRect viewport= gc.viewport();
241 const QPolygonF localPoly = (
isLocal() &&
handles().size() == 5) ? initialTransform.map(QPolygonF(
getLocalRect())) : QPolygonF();
242 const QPolygonF viewportAndLocalPoly = !localPoly.isEmpty() ? QPolygonF(QRectF(viewport)).intersected(localPoly) : QRectF(viewport);
246 QPainterPath previewPath;
249 if (assistantVisible ==
true || isEditing ==
true) {
250 QLineF horizonLine = initialTransform.map(QLineF(
p1,
p2));
252 path.moveTo(horizonLine.p1());
253 path.lineTo(horizonLine.p2());
257 if (isEditing ==
false && previewVisible ==
true &&
isSnappingActive() ==
true) {
260 QLineF snapMouse1 = QLineF(initialTransform.map(
p1), mousePos);
261 QLineF snapMouse2 = QLineF(initialTransform.map(
p2), mousePos);
264 previewPath.moveTo(snapMouse1.p1());
265 previewPath.lineTo(snapMouse1.p2());
266 previewPath.moveTo(snapMouse2.p1());
267 previewPath.lineTo(snapMouse2.p2());
271 if (isEditing ==
true && !
sideHandles().isEmpty()) {
272 path.moveTo(initialTransform.map(
p1));
273 path.lineTo(initialTransform.map(*
sideHandles()[0]));
274 path.lineTo(initialTransform.map(*
sideHandles()[1]));
275 path.moveTo(initialTransform.map(
p2));
276 path.lineTo(initialTransform.map(*
sideHandles()[2]));
277 path.lineTo(initialTransform.map(*
sideHandles()[3]));
278 path.moveTo(initialTransform.map(
p1));
279 path.lineTo(initialTransform.map(*
sideHandles()[4]));
280 path.lineTo(initialTransform.map(*
sideHandles()[5]));
281 path.moveTo(initialTransform.map(
p2));
282 path.lineTo(initialTransform.map(*
sideHandles()[6]));
283 path.lineTo(initialTransform.map(*
sideHandles()[7]));
287 if (showLocal && assistantVisible) {
290 QPointF
p2 = QPointF(
p1.x(),
p3.y());
291 QPointF p4 = QPointF(
p3.x(),
p1.y());
293 path.moveTo(initialTransform.map(
p1));
295 path.lineTo(initialTransform.map(
p2));
296 path.lineTo(initialTransform.map(
p3));
297 path.lineTo(initialTransform.map(p4));
298 path.lineTo(initialTransform.map(
p1));
302 drawPreview(gc,previewPath, displayRenderInterface);
306 path = QPainterPath();
311 const QTransform inv = t.inverted();
312 const QPointF vp_a = t.map(
p1);
313 const QPointF vp_b = t.map(
p2);
315 if ((vp_a.x() < 0 && vp_b.x() > 0) ||
316 (vp_a.x() > 0 && vp_b.x() < 0)) {
319 QLineF vertical = initialTransform.map(inv.map(QLineF::fromPolar(1,90)));
320 if (!isEditing) vertical.translate(mousePos - vertical.p1());
322 if (previewVisible) {
323 path.moveTo(vertical.p1());
324 path.lineTo(vertical.p2());
327 if (assistantVisible) {
329 path.moveTo(initialTransform.map(inv.map(QPointF(0,vp_a.y()-10))));
330 path.lineTo(initialTransform.map(inv.map(QPointF(0,vp_a.y()+10))));
333 path = QPainterPath();
337 const QPointF upper = QPointF(0,vp_a.y() + size);
338 const QPointF lower = QPointF(0,vp_a.y() - size);
342 QColor color = canvasAssistantColor;
343 QGradient fade = QLinearGradient(initialTransform.map(inv.map(upper)),
344 initialTransform.map(inv.map(lower)));
346 fade.setColorAt(0.4, canvasAssistantColor);
347 fade.setColorAt(0.5, color);
348 fade.setColorAt(0.6, canvasAssistantColor);
349 const QPen pen = gc.pen();
350 const QBrush new_brush = QBrush(fade);
352 const QPen new_pen = QPen(new_brush, width, pen.style());
359 Q_FOREACH (
const QPointF sp, station_points) {
362 Q_FOREACH (
const QPointF vp, vanishing_points) {
365 const qreal initial_angle = QLineF(sp, vp).angle();
366 const qreal interval = size*
m_gridDensity / cos((initial_angle - 90) *
M_PI/180);
367 const QPointF translation = QPointF(interval, 0);
370 Q_FOREACH (
const int dir,
QList<int>({-1, 1})) {
373 for (
int i = 0; i <= 300; i++) {
374 const QLineF gridline = QLineF(sp + translation * i * dir, vp);
377 const qreal angle = gridline.angle();
378 if (angle < 0.25 || angle > 359.75 || (angle < 180.25 && angle > 179.75)) {
382 QLineF drawn_gridline = initialTransform.map(inv.map(gridline));
385 if (assistantVisible || isEditing ==
true) {
386 path.moveTo(drawn_gridline.p2());
387 path.lineTo(drawn_gridline.p1());