55 res += BaseEqn[0] * Pt[0] * Pt[0];
56 res += BaseEqn[1] * Pt[1] * Pt[1];
57 res += BaseEqn[2] * Pt[2] * Pt[2];
58 res += BaseEqn[3] * Pt[0] * Pt[1];
59 res += BaseEqn[4] * Pt[0] * Pt[2];
60 res += BaseEqn[5] * Pt[1] * Pt[2];
61 res += BaseEqn[6] * Pt[0];
62 res += BaseEqn[7] * Pt[1];
63 res += BaseEqn[8] * Pt[2];
134 matrixForm(A, B, cc);
140 logger.warning() <<
"Problem with matrix :: distance now guessed at\n";
148 const double aa(alpha[0]);
149 const double aa2(aa * aa);
150 const double ab(alpha[1]);
151 const double ab2(ab * ab);
152 const double ac(alpha[2]);
153 const double ac2(ac * ac);
155 const double ba(beta[0]);
156 const double ba2(ba * ba);
157 const double bb(beta[1]);
158 const double bb2(bb * bb);
159 const double bc(beta[2]);
160 const double bc2(bc * bc);
162 const double da(D[0][0]);
163 const double da2(da * da);
164 const double db(D[1][1]);
165 const double db2(db * db);
166 const double dc(D[2][2]);
167 const double dc2(dc * dc);
171 T[0] = aa * ba + ab * bb + ac * bc + cc + aa2 * da + ab2 * db + ac2 * dc;
173 T[1] = -ba2 - bb2 - bc2 + 4 * ab * bb * da + 4 * ac * bc * da + 4 * cc * da + 4 * aa * ba * db + 4 * ac * bc * db +
174 4 * cc * db + 4 * aa2 * da * db + 4 * ab2 * da * db + 4 * aa * ba * dc + 4 * ab * bb * dc + 4 * cc * dc +
175 4 * aa2 * da * dc + 4 * ac2 * da * dc + 4 * ab2 * db * dc + 4 * ac2 * db * dc;
177 T[2] = -ba2 * da - 4 * bb2 * da - 4 * bc2 * da + 4 * ab * bb * da2 + 4 * ac * bc * da2 + 4 * cc * da2 - 4 * ba2 * db -
178 bb2 * db - 4 * bc2 * db + 16 * ac * bc * da * db + 16 * cc * da * db + 4 * ab2 * da2 * db + 4 * aa * ba * db2 +
179 4 * ac * bc * db2 + 4 * cc * db2 + 4 * aa2 * da * db2 - 4 * ba2 * dc - 4 * bb2 * dc - bc2 * dc +
180 16 * ab * bb * da * dc + 16 * cc * da * dc + 4 * ac2 * da2 * dc + 16 * aa * ba * db * dc + 16 * cc * db * dc +
181 16 * aa2 * da * db * dc + 16 * ab2 * da * db * dc + 16 * ac2 * da * db * dc + 4 * ac2 * db2 * dc +
182 4 * aa * ba * dc2 + 4 * ab * bb * dc2 + 4 * cc * dc2 + 4 * aa2 * da * dc2 + 4 * ab2 * db * dc2;
184 T[3] = -4 * bb2 * da2 - 4 * bc2 * da2 - 4 * ba2 * da * db - 4 * bb2 * da * db - 16 * bc2 * da * db +
185 16 * ac * bc * da2 * db + 16 * cc * da2 * db - 4 * ba2 * db2 - 4 * bc2 * db2 + 16 * ac * bc * da * db2 +
186 16 * cc * da * db2 - 4 * ba2 * da * dc - 16 * bb2 * da * dc - 4 * bc2 * da * dc + 16 * ab * bb * da2 * dc +
187 16 * cc * da2 * dc - 16 * ba2 * db * dc - 4 * bb2 * db * dc - 4 * bc2 * db * dc + 64 * cc * da * db * dc +
188 16 * ab2 * da2 * db * dc + 16 * ac2 * da2 * db * dc + 16 * aa * ba * db2 * dc + 16 * cc * db2 * dc +
189 16 * aa2 * da * db2 * dc + 16 * ac2 * da * db2 * dc - 4 * ba2 * dc2 - 4 * bb2 * dc2 + 16 * ab * bb * da * dc2 +
190 16 * cc * da * dc2 + 16 * aa * ba * db * dc2 + 16 * cc * db * dc2 + 16 * aa2 * da * db * dc2 +
191 16 * ab2 * da * db * dc2;
193 T[4] = -4 * bb2 * da2 * db - 16 * bc2 * da2 * db - 4 * ba2 * da * db2 - 16 * bc2 * da * db2 +
194 16 * ac * bc * da2 * db2 + 16 * cc * da2 * db2 - 16 * bb2 * da2 * dc - 4 * bc2 * da2 * dc -
195 16 * ba2 * da * db * dc - 16 * bb2 * da * db * dc - 16 * bc2 * da * db * dc + 64 * cc * da2 * db * dc -
196 16 * ba2 * db2 * dc - 4 * bc2 * db2 * dc + 64 * cc * da * db2 * dc + 16 * ac2 * da2 * db2 * dc -
197 4 * ba2 * da * dc2 - 16 * bb2 * da * dc2 + 16 * ab * bb * da2 * dc2 + 16 * cc * da2 * dc2 -
198 16 * ba2 * db * dc2 - 4 * bb2 * db * dc2 + 64 * cc * da * db * dc2 + 16 * ab2 * da2 * db * dc2 +
199 16 * aa * ba * db2 * dc2 + 16 * cc * db2 * dc2 + 16 * aa2 * da * db2 * dc2;
201 T[5] = -16 * bc2 * da2 * db2 - 16 * bb2 * da2 * db * dc - 16 * bc2 * da2 * db * dc - 16 * ba2 * da * db2 * dc -
202 16 * bc2 * da * db2 * dc + 64 * cc * da2 * db2 * dc - 16 * bb2 * da2 * dc2 - 16 * ba2 * da * db * dc2 -
203 16 * bb2 * da * db * dc2 + 64 * cc * da2 * db * dc2 - 16 * ba2 * db2 * dc2 + 64 * cc * da * db2 * dc2;
205 T[6] = 16 * da * db * dc * (-bc2 * da * db - bb2 * da * dc - ba2 * db * dc + 4 * cc * da * db * dc);
207 std::vector<double> TRange = T.
realRoots(1e-10);
213 std::vector<double>::const_iterator vc;
214 for (vc = TRange.begin(); vc != TRange.end(); ++vc) {
215 const double daI = 1.0 + 2 * (*vc) * da;
216 const double dbI = 1.0 + 2 * (*vc) * db;
217 const double dcI = 1.0 + 2 * (*vc) * dc;
220 DI[0][0] = 1.0 / daI;
221 DI[1][1] = 1.0 / dbI;
222 DI[2][2] = 1.0 / dcI;
223 xvec = R * (DI * (alpha - beta * *vc));
225 const double Dist = xvec.
distance(Pt);
226 if (Out < 0 || Out > Dist)