31 Private () : transformedCageDirection(0) {}
53inline void KisGreenCoordinatesMath::
54Private::precalculateOneEdge(
const QPointF &pt,
69 qreal SRT = std::sqrt(4 *
S *
Q -
pow2(
R));
70 qreal L0 = std::log(
S);
71 qreal L1 = std::log(
S +
Q +
R);
72 qreal A0 = std::atan(
R / SRT) / SRT;
73 qreal A1 = std::atan((2 *
Q +
R) / SRT) / SRT;
82 static const qreal magicMultiplier = -1.0;
84 *edge_psi = -magicMultiplier *
norm(a) / (4 *
M_PI) *
85 ((4 *
S -
pow2(
R) /
Q) * A10 +
R / (2 *
Q) * L10 + L1 - 2);
87 *vertex2_phi += -BA / (2 *
M_PI) * (L10 / (2 *
Q) - A10 *
R /
Q);
88 *vertex1_phi += BA / (2 *
M_PI) * (L10 / (2 *
Q) - A10 * (2 +
R /
Q));
91void KisGreenCoordinatesMath::Private::precalculateOnePoint(
const QVector<QPointF> &originalCage,
96 const int numCagePoints = originalCage.size();
101 for (
int i = 1; i <= numCagePoints; i++) {
102 int endIndex = i != numCagePoints ? i : 0;
103 int startIndex = i - 1;
105 precalculateOneEdge(pt,
106 originalCage[startIndex],
107 originalCage[endIndex],
108 &coords->
psi[startIndex],
109 &coords->
phi[startIndex],
110 &coords->
phi[endIndex],
127 const int numPoints = points.size();
128 const int numCagePoints = originalCage.size();
130 m_d->originalCageEdgeSizes.resize(numCagePoints);
132 for (
int i = 1; i <= numCagePoints; i++) {
133 int endIndex = i != numCagePoints ? i : 0;
134 int startIndex = i - 1;
136 m_d->originalCageEdgeSizes[startIndex] =
137 norm(originalCage[endIndex] - originalCage[startIndex]);
140 m_d->precalculatedCoords.resize(numPoints);
142 for (
int i = 0; i < numPoints; i++) {
143 m_d->precalculatedCoords[i].psi.resize(numCagePoints);
144 m_d->precalculatedCoords[i].phi.resize(numCagePoints);
146 m_d->precalculateOnePoint(originalCage,
147 &
m_d->precalculatedCoords[i],
157 const int numCagePoints = transformedCage.size();
158 m_d->transformedCageNormals.resize(numCagePoints);
160 for (
int i = 1; i <= numCagePoints; i++) {
161 int endIndex = i != numCagePoints ? i : 0;
162 int startIndex = i - 1;
164 QPointF transformedEdge =
165 transformedCage[endIndex] - transformedCage[startIndex];
168 norm(transformedEdge) /
m_d->originalCageEdgeSizes[startIndex];
170 m_d->transformedCageNormals[startIndex] =
179 const int numCagePoints = transformedCage.size();
184 for (
int i = 0; i < numCagePoints; i++) {
185 result += coords->
phi[i] * transformedCage[i];
186 result += coords->
psi[i] *
m_d->transformedCageNormals[i];
Eigen::Matrix< double, 4, 2 > Q
Eigen::Matrix< double, 4, 2 > S
Eigen::Matrix< double, 4, 2 > R
PointTypeTraits< T >::value_type dotProduct(const T &a, const T &b)
int polygonDirection(const QVector< T > &polygon)
T inwardUnitNormal(const T &a, int polygonDirection)
void generateTransformedCageNormals(const QVector< QPointF > &transformedCage)
void precalculateOneEdge(const QPointF &pt, const QPointF &v1, const QPointF &v2, qreal *edge_psi, qreal *vertex1_phi, qreal *vertex2_phi, int polygonDirection)
~KisGreenCoordinatesMath()
QVector< PrecalculatedCoords > precalculatedCoords
QPointF transformedPoint(int pointIndex, const QVector< QPointF > &transformedCage)
KisGreenCoordinatesMath()
QVector< QPointF > transformedCageNormals
QVector< qreal > originalCageEdgeSizes
const QScopedPointer< Private > m_d
void precalculateGreenCoordinates(const QVector< QPointF > &originalCage, const QVector< QPointF > &points)
int transformedCageDirection
void precalculateOnePoint(const QVector< QPointF > &originalCage, PrecalculatedCoords *coords, const QPointF &pt, int polygonDirection)