99 {
100 static const qreal
eps = 1e-6;
101
102
105
106 qreal nu = 0.0;
108 qreal sqrtD = 0.0;
109
110 bool dontCheckOtherNu = false;
111
113 nu = -qC / qB;
114 dontCheckOtherNu = true;
115 } else {
118 sqrtD = std::sqrt(
D);
120 } else {
121 nu = 0.0;
122 dontCheckOtherNu = true;
123 }
124 }
125
126 qreal nu1 = nu;
127
129 qreal xMu1 =
xBasedMu(nu1, xDenomNu1);
130
132
135 }
136
138 qreal yMu1 =
yBasedMu(nu1, yDenomNu1);
139
140
143 }
144
145 qreal nu2 = nu1, xDenomNu2 = xDenomNu1, xMu2 = xMu1, yDenomNu2 = yDenomNu1, yMu2 = yMu1;
146
147 if (!dontCheckOtherNu) {
149
152
154
157 }
158
161
164 }
165 }
166
167
168 const int count = 4;
169 qreal denoms[count] = {xDenomNu1, yDenomNu1, xDenomNu2, yDenomNu2};
170 qreal mus[count] = {xMu1, yMu1, xMu2, yMu2};
171 qreal nus[count] = {nu1, nu1, nu2, nu2};
172 QPointF results[count];
173#ifdef FPIB_DEBUG
174 qCritical() << "For point: x = " << m_dbgOrigX << " y = " << m_dbgOrigY << " | src polygon = " << m_dbgSrcPolygon << " | dst polygon = " << m_dbgDstPolygon;
175 for (int i = 0; i < count; i++) {
176 qCritical() <<
"for i = " << i <<
": denoms[i] = " << denoms[i] <<
"mus[i] = " << mus[i] <<
"nus[i] = " << nus[i] <<
"result: " <<
getResult(nus[i], mus[i]);
177 }
178#endif
179
180 int bestI = -1;
181 qreal distanceFromCenter = 0.0;
183
184 int meaningfulCount = dontCheckOtherNu ? 2 : 4;
185 for (int i = 0; i < meaningfulCount; i++) {
186
187 if (qAbs(denoms[i]) <
eps) {
188 continue;
189 }
190
193 if (bestI < 0 || dist < distanceFromCenter) {
194 distanceFromCenter = dist;
195 bestI = i;
196 }
197 }
198#ifdef FPIB_DEBUG
199 if (bestI < 0) {
200 for (int i = 0; i < count; i++) {
201 qCritical() <<
"for i = " << i <<
"denom=" << denoms[i] <<
"mu=" << mus[i] <<
"nu=" << nus[i] <<
"result: " <<
getResult(nus[i], mus[i]);
202 }
203 qCritical() << "Center point: " << center;
204 qCritical() << "dont check other nu: " << dontCheckOtherNu;
205
206 }
207#endif
208
209
211
212 return results[bestI];
213 }
qreal D(qreal t, const QPointF &P0, const QPointF &P1, const QPointF &P2, const QPointF &P3, const QPointF &p)
QPointF getResult(qreal nu, qreal mu) const
qreal yBasedMu(qreal nu, qreal yBasedDenominator) const
bool inGoodRange(qreal value) const
QPointF fallbackSourcePoint() const
qreal xBasedDenom(qreal nu) const
qreal yBasedDenom(qreal nu) const
qreal xBasedMu(qreal nu, qreal xBasedDenominator) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
qreal normSquared(const T &a)