Krita Source Code Documentation
Loading...
Searching...
No Matches
EnhancedPathHandle.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2007 Jan Hambrecht <jaham@gmx.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
8#include "EnhancedPathShape.h"
11#include <KoXmlWriter.h>
12#include <KoXmlNS.h>
14
15#include <math.h>
16
18 : m_parent(parent)
19 , m_positionX(0)
20 , m_positionY(0)
21 , m_minimumX(0)
22 , m_minimumY(0)
23 , m_maximumX(0)
24 , m_maximumY(0)
25 , m_polarX(0)
26 , m_polarY(0)
27 , m_minRadius(0)
28 , m_maxRadius(0)
29{
30 Q_ASSERT(m_parent);
31}
32
36
38{
39 return m_positionX && m_positionY;
40}
41
43{
44 m_positionX = positionX;
45 m_positionY = positionY;
46}
47
49{
50 if (!hasPosition()) {
51 return QPointF();
52 }
53
55 if (isPolar()) {
56 // convert polar coordinates into cartesian coordinates
57 QPointF center(m_polarX->evaluate(), m_polarY->evaluate());
58 qreal angleInRadian = position.x() * M_PI / 180.0;
59 position = center + position.y() * QPointF(cos(angleInRadian), sin(angleInRadian));
60 }
61
62 return position;
63}
64
65void EnhancedPathHandle::changePosition(const QPointF &position)
66{
67 if (!hasPosition()) {
68 return;
69 }
70
71 QPointF constrainedPosition(position);
72
73 if (isPolar()) {
74 // convert cartesian coordinates into polar coordinates
75 QPointF polarCenter(m_polarX->evaluate(), m_polarY->evaluate());
76 QPointF diff = constrainedPosition - polarCenter;
77 // compute the polar radius
78 qreal radius = sqrt(diff.x() * diff.x() + diff.y() * diff.y());
79 // compute the polar angle
80 qreal angle = atan2(diff.y(), diff.x());
81 if (angle < 0.0) {
82 angle += 2 * M_PI;
83 }
84
85 // constrain the radius
86 if (m_minRadius) {
87 radius = qMax(m_minRadius->evaluate(), radius);
88 }
89 if (m_maxRadius) {
90 radius = qMin(m_maxRadius->evaluate(), radius);
91 }
92
93 constrainedPosition.setX(angle * 180.0 / M_PI);
94 constrainedPosition.setY(radius);
95 } else {
96 // constrain x coordinate
97 if (m_minimumX) {
98 constrainedPosition.setX(qMax(m_minimumX->evaluate(), constrainedPosition.x()));
99 }
100 if (m_maximumX) {
101 constrainedPosition.setX(qMin(m_maximumX->evaluate(), constrainedPosition.x()));
102 }
103
104 // constrain y coordinate
105 if (m_minimumY) {
106 constrainedPosition.setY(qMax(m_minimumY->evaluate(), constrainedPosition.y()));
107 }
108 if (m_maximumY) {
109 constrainedPosition.setY(qMin(m_maximumY->evaluate(), constrainedPosition.y()));
110 }
111 }
112
113 m_positionX->modify(constrainedPosition.x());
114 m_positionY->modify(constrainedPosition.y());
115}
116
122
128
130{
131 m_polarX = polarX;
132 m_polarY = polarY;
133}
134
136{
137 m_minRadius = minRadius;
138 m_maxRadius = maxRadius;
139}
140
142{
143 return m_polarX && m_polarY;
144}
EnhancedPathParameter * m_positionY
the position y-coordinate
bool hasPosition() const
Returns if the handle has valid positional parameters.S.
void setPolarCenter(EnhancedPathParameter *polarX, EnhancedPathParameter *polarY)
EnhancedPathParameter * m_polarY
the polar center y-coordinate
~EnhancedPathHandle()
Destroys the handle.
void changePosition(const QPointF &position)
EnhancedPathParameter * m_minRadius
the minimum polar radius
void setPosition(EnhancedPathParameter *positionX, EnhancedPathParameter *positionY)
bool isPolar() const
Returns if handle is polar.
EnhancedPathParameter * m_positionX
the position x-coordinate
EnhancedPathParameter * m_maximumX
the maximum x-coordinate
void setRangeX(EnhancedPathParameter *minX, EnhancedPathParameter *maxX)
void setRangeY(EnhancedPathParameter *minY, EnhancedPathParameter *maxY)
EnhancedPathShape * m_parent
the enhanced path shape owning this handle
void setRadiusRange(EnhancedPathParameter *minRadius, EnhancedPathParameter *maxRadius)
EnhancedPathParameter * m_minimumY
the minimum y-coordinate
EnhancedPathHandle(EnhancedPathShape *parent)
EnhancedPathParameter * m_polarX
the polar center x-coordinate
EnhancedPathParameter * m_maxRadius
the maximum polar radius
EnhancedPathParameter * m_maximumY
the maximum y-coordinate
EnhancedPathParameter * m_minimumX
the minimum x-coordinate
The abstract parameter class.
virtual qreal evaluate()=0
evaluates the parameter using the given path
virtual void modify(qreal value)
modifies the parameter if possible, using the new value
#define M_PI
Definition kis_global.h:111