32 FeatureLineDistance::FeatureLineDistance(
const string &pointName)
34 positionSIN(NULL,
"sotFeatureLineDistance(" +
name +
35 ")::input(matrixHomo)::position"),
37 NULL,
"sotFeatureLineDistance(" +
name +
")::input(matrix)::Jq"),
38 positionRefSIN(NULL,
"sotFeatureLineDistance(" +
name +
39 ")::input(vector)::positionRef"),
41 "sotFeatureVector3(" +
name +
")::input(vector3)::vector"),
44 positionSIN << positionRefSIN,
45 "sotFeatureAbstract(" +
name +
")::output(vector)::line") {
111 Skew(0, 1) = -vect(2);
112 Skew(0, 2) = vect(1);
113 Skew(1, 0) = vect(2);
115 Skew(1, 2) = -vect(0);
116 Skew(2, 0) = -vect(1);
117 Skew(2, 1) = vect(0);
123 Jline.resize(6, Jq.cols());
124 for (std::size_t
i = 0;
i < 3; ++
i)
125 for (
size_type j = 0; j < Jq.cols(); ++j) {
128 for (std::size_t k = 0; k < 3; ++k) {
129 Jline(
i, j) +=
R(
i, k) * Jq(k, j);
130 Jline(
i + 3, j) += -RSk(
i, k) * Jq(k + 3, j);
137 const double &
x0 =
line(0);
138 const double &y0 =
line(1);
139 const double &z0 =
line(2);
140 const double &
a0 =
line(3);
141 const double &b0 =
line(4);
142 const double &c0 =
line(5);
145 const double &x1 = posRef(0);
146 const double &y1 = posRef(1);
147 const double &z1 = posRef(2);
148 const double &a1 = posRef(3);
149 const double &b1 = posRef(4);
150 const double &c1 = posRef(5);
153 const double a1_3 = a1 * a1 * a1;
154 const double b1_3 = b1 * b1 * b1;
155 const double c1_3 = c1 * c1 * c1;
157 double K = c0 * c0 * a1 * a1 - 2 * c0 * a1 *
a0 * c1 - 2 * c0 * b1 * b0 * c1 +
158 c0 * c0 * b1 * b1 - 2 * b0 * a1 *
a0 * b1 + b0 * b0 * a1 * a1 +
159 b0 * b0 * c1 * c1 +
a0 *
a0 * b1 * b1 +
a0 *
a0 * c1 * c1;
161 const double diffx0 = -b0 * c1 + c0 * b1;
162 const double diffy0 =
a0 * c1 - c0 * a1;
163 const double diffz0 = -
a0 * b1 + b0 * a1;
165 const double diffa0 =
166 2 * b0 * c1 *
x0 *
a0 * b1 * b1 + 2 * c0 * b1 * b1 *
x0 * b0 * a1 +
167 2 * c0 * c0 * b1 *
x0 * c1 * a1 + 2 * c1 * c1 * y0 * c0 * a1 *
a0 -
168 2 * b0 * c1 * c1 *
x0 * c0 * a1 - 2 * b0 * b0 * c1 *
x0 * b1 * a1 -
169 2 * c1 * c1 * y0 * c0 * b1 * b0 + 2 * b0 * b0 * c1 * x1 * b1 * a1 +
170 2 * b0 * c1 * c1 * x1 * c0 * a1 - 2 * b0 * c1 * x1 *
a0 * b1 * b1 -
171 c1 * y0 * c0 * c0 * a1 * a1 + c1 * y0 * c0 * c0 * b1 * b1 +
172 c1 * y0 * b0 * b0 * a1 * a1 - c1 * y0 *
a0 *
a0 * b1 * b1 +
173 c1 * y1 * c0 * c0 * a1 * a1 - c1 * y1 * c0 * c0 * b1 * b1 -
174 c1 * y1 * b0 * b0 * a1 * a1 + c1 * y1 *
a0 *
a0 * b1 * b1 -
175 b1 * z0 * c0 * c0 * a1 * a1 + b1 * z0 * b0 * b0 * a1 * a1 -
176 b1 * z0 * b0 * b0 * c1 * c1 + b1 * z0 *
a0 *
a0 * c1 * c1 +
177 b1 * z1 * c0 * c0 * a1 * a1 - b1 * z1 * b0 * b0 * a1 * a1 +
178 b1 * z1 * b0 * b0 * c1 * c1 - b1 * z1 *
a0 *
a0 * c1 * c1 +
179 2 * b0 * c1_3 *
x0 *
a0 - 2 * b0 * c1_3 * x1 *
a0 -
180 2 * c0 * b1_3 *
x0 *
a0 + 2 * c0 * b1_3 * x1 *
a0 + c1_3 * y0 * b0 * b0 -
181 c1_3 * y0 *
a0 *
a0 - c1_3 * y1 * b0 * b0 + c1_3 * y1 *
a0 *
a0 -
182 b1_3 * z0 * c0 * c0 + b1_3 * z0 *
a0 *
a0 + b1_3 * z1 * c0 * c0 -
183 b1_3 * z1 *
a0 *
a0 - 2 * c1 * c1 * y1 * c0 * a1 *
a0 +
184 2 * c1 * c1 * y1 * c0 * b1 * b0 + 2 * b1 * b1 * z0 * c0 * b0 * c1 -
185 2 * b1 * b1 * z0 * b0 * a1 *
a0 - 2 * b1 * b1 * z1 * c0 * b0 * c1 +
186 2 * b1 * b1 * z1 * b0 * a1 *
a0 - 2 * c0 * b1 *
x0 *
a0 * c1 * c1 -
187 2 * c0 * b1 * b1 * x1 * b0 * a1 - 2 * c0 * c0 * b1 * x1 * c1 * a1 +
188 2 * c0 * b1 * x1 *
a0 * c1 * c1 + 2 * c0 * a1 * y0 *
a0 * b1 * b1 -
189 2 * c0 * a1 * a1 * y0 * b1 * b0 - 2 * c0 * a1 * y1 *
a0 * b1 * b1 +
190 2 * c0 * a1 * a1 * y1 * b1 * b0 + 2 * b0 * a1 * a1 * z0 * c1 * c0 -
191 2 * b0 * a1 * z0 *
a0 * c1 * c1 - 2 * b0 * a1 * a1 * z1 * c1 * c0 +
192 2 * b0 * a1 * z1 *
a0 * c1 * c1;
193 const double diffb0 =
194 -2 * c1 * c1 *
x0 * c0 * b1 * b0 + 2 * c1 * c1 *
x0 * c0 * a1 *
a0 -
195 c1 *
x0 * c0 * c0 * a1 * a1 + c1 *
x0 * c0 * c0 * b1 * b1 +
196 c1 *
x0 * b0 * b0 * a1 * a1 - c1 *
x0 *
a0 *
a0 * b1 * b1 +
197 c1 * x1 * c0 * c0 * a1 * a1 - c1 * x1 * c0 * c0 * b1 * b1 -
198 c1 * x1 * b0 * b0 * a1 * a1 + c1 * x1 *
a0 *
a0 * b1 * b1 +
199 a1 * z0 * c0 * c0 * b1 * b1 - a1 * z0 * b0 * b0 * c1 * c1 -
200 a1 * z0 *
a0 *
a0 * b1 * b1 + a1 * z0 *
a0 *
a0 * c1 * c1 -
201 a1 * z1 * c0 * c0 * b1 * b1 + a1 * z1 * b0 * b0 * c1 * c1 +
202 a1 * z1 *
a0 *
a0 * b1 * b1 - a1 * z1 *
a0 *
a0 * c1 * c1 -
203 2 *
a0 * c1_3 * y0 * b0 + 2 *
a0 * c1_3 * y1 * b0 + c1_3 *
x0 * b0 * b0 -
204 c1_3 *
x0 *
a0 *
a0 - c1_3 * x1 * b0 * b0 + c1_3 * x1 *
a0 *
a0 +
205 a1_3 * z0 * c0 * c0 - 2 * c1 * c1 * x1 * c0 * a1 *
a0 +
206 2 * c1 * c1 * x1 * c0 * b1 * b0 - 2 * a1 * a1 * z0 * c0 *
a0 * c1 +
207 2 * a1 * a1 * z0 * b0 *
a0 * b1 - a1_3 * z0 * b0 * b0 -
208 a1_3 * z1 * c0 * c0 + a1_3 * z1 * b0 * b0 +
209 2 * a1 * a1 * z1 * c0 *
a0 * c1 - 2 * a1 * a1 * z1 * b0 *
a0 * b1 +
210 2 * c0 * b1 * b1 *
x0 * a1 *
a0 - 2 * c0 * b1 *
x0 * b0 * a1 * a1 -
211 2 * c0 * b1 * b1 * x1 * a1 *
a0 + 2 * c0 * b1 * x1 * b0 * a1 * a1 +
212 2 *
a0 *
a0 * c1 * y0 * a1 * b1 - 2 *
a0 * c1 * y0 * b0 * a1 * a1 +
213 2 *
a0 * c1 * c1 * y0 * c0 * b1 - 2 *
a0 *
a0 * c1 * y1 * a1 * b1 +
214 2 *
a0 * c1 * y1 * b0 * a1 * a1 - 2 *
a0 * c1 * c1 * y1 * c0 * b1 -
215 2 * c0 * a1 * a1 * y0 *
a0 * b1 + 2 * c0 * a1_3 * y0 * b0 -
216 2 * c0 * a1_3 * y1 * b0 + 2 * c0 * a1 * y0 * b0 * c1 * c1 -
217 2 * c0 * c0 * a1 * y0 * c1 * b1 + 2 * c0 * a1 * a1 * y1 *
a0 * b1 -
218 2 * c0 * a1 * y1 * b0 * c1 * c1 + 2 * c0 * c0 * a1 * y1 * c1 * b1 +
219 2 *
a0 * b1 * z0 * b0 * c1 * c1 - 2 *
a0 * b1 * b1 * z0 * c1 * c0 -
220 2 *
a0 * b1 * z1 * b0 * c1 * c1 + 2 *
a0 * b1 * b1 * z1 * c1 * c0;
223 diffh(0, 0) = diffx0 / K;
224 diffh(0, 1) = diffy0 / K;
225 diffh(0, 2) = diffz0 / K;
227 diffh(0, 3) = diffa0 / K;
228 diffh(0, 4) = diffb0 / K;
232 J.resize(1,
J.cols());
248 const double &
x0 =
line(0);
249 const double &y0 =
line(1);
250 const double &z0 =
line(2);
251 const double &
a0 =
line(3);
252 const double &b0 =
line(4);
253 const double &c0 =
line(5);
256 const double &x1 = posRef(0);
257 const double &y1 = posRef(1);
258 const double &z1 = posRef(2);
259 const double &a1 = posRef(3);
260 const double &b1 = posRef(4);
261 const double &c1 = posRef(5);
264 double K = c0 * c0 * a1 * a1 - 2 * c0 * a1 *
a0 * c1 - 2 * c0 * b1 * b0 * c1 +
265 c0 * c0 * b1 * b1 - 2 * b0 * a1 *
a0 * b1 + b0 * b0 * a1 * a1 +
266 b0 * b0 * c1 * c1 +
a0 *
a0 * b1 * b1 +
a0 *
a0 * c1 * c1;
267 error(0) = (-b0 * c1 *
x0 + b0 * c1 * x1 + c0 * b1 *
x0 - c0 * b1 * x1 +
268 a0 * c1 * y0 -
a0 * c1 * y1 - c0 * a1 * y0 + c0 * a1 * y1 -
269 a0 * b1 * z0 +
a0 * b1 * z1 + b0 * a1 * z0 - b0 * a1 * z1) /
281 os <<
"LineDistance <" <<
name <<
">";