|
34 | 34 | import bdv.viewer.SourceAndConverter; |
35 | 35 | import net.imglib2.realtransform.AffineTransform3D; |
36 | 36 | import bdv.viewer.TransformListener; |
37 | | -import org.scijava.vecmath.Point3d; |
38 | 37 | import sc.fiji.bdvpg.services.SourceAndConverterServices; |
39 | 38 | import sc.fiji.bdvpg.sourceandconverter.transform.SourceAffineTransformer; |
40 | 39 |
|
@@ -221,58 +220,65 @@ public static AffineTransform3D ensureOrthoNormalTransform( |
221 | 220 | correctedAffineTransform.set(at3D); |
222 | 221 |
|
223 | 222 | // Gets three vectors |
224 | | - Point3d v1 = new Point3d(at3D.get(0, 0), at3D.get(0, 1), at3D.get(0, 2)); |
225 | | - Point3d v2 = new Point3d(at3D.get(1, 0), at3D.get(1, 1), at3D.get(1, 2)); |
| 223 | + double v1x = at3D.get(0, 0); |
| 224 | + double v1y = at3D.get(0, 1); |
| 225 | + double v1z = at3D.get(0, 2); |
| 226 | + |
| 227 | + double v2x = at3D.get(1, 0); |
| 228 | + double v2y = at3D.get(1, 1); |
| 229 | + double v2z = at3D.get(1,2); |
226 | 230 |
|
227 | 231 | // 0 - Ensure v1 and v2 have the same norm |
228 | | - double normv1 = Math.sqrt(v1.x * v1.x + v1.y * v1.y + v1.z * v1.z); |
229 | | - double normv2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z); |
| 232 | + double normv1 = Math.sqrt(v1x * v1x + v1y * v1y + v1z * v1z); |
| 233 | + double normv2 = Math.sqrt(v2x * v2x + v2y * v2y + v2z * v2z); |
230 | 234 |
|
231 | 235 | // If v1 and v2 do not have the same norm |
232 | 236 | if (Math.abs(normv1 - normv2) / normv1 > 1e-10) { |
233 | 237 | // We make v2 having the norm of v1 |
234 | | - v2.x = v2.x / normv2 * normv1; |
235 | | - v2.y = v2.y / normv2 * normv1; |
236 | | - v2.z = v2.z / normv2 * normv1; |
| 238 | + v2x = v2x / normv2 * normv1; |
| 239 | + v2y = v2y / normv2 * normv1; |
| 240 | + v2z = v2z / normv2 * normv1; |
237 | 241 |
|
238 | | - correctedAffineTransform.set(v2.x, 1, 0); |
239 | | - correctedAffineTransform.set(v2.y, 1, 1); |
240 | | - correctedAffineTransform.set(v2.z, 1, 2); |
| 242 | + correctedAffineTransform.set(v2x, 1, 0); |
| 243 | + correctedAffineTransform.set(v2y, 1, 1); |
| 244 | + correctedAffineTransform.set(v2z, 1, 2); |
241 | 245 | } |
242 | 246 |
|
243 | 247 | // 1 - Ensure v1 and v2 are perpendicular |
244 | 248 |
|
245 | | - if (Math.abs(v1.x * v2.x + v1.y * v2.y + v1.z * v2.z) / (normv1 * |
| 249 | + if (Math.abs(v1x * v2x + v1y * v2y + v1z * v2z) / (normv1 * |
246 | 250 | normv2) > (1e-10)) |
247 | 251 | { |
248 | 252 | // v1 and v2 not perpendicular enough |
249 | 253 | // Compute the projection of v1 onto v2 |
250 | | - Point3d u1 = new Point3d(v1.x / normv1, v1.y / normv1, v1.z / normv1); |
251 | | - double dotProductNormalized = (u1.x * v2.x + u1.y * v2.y + u1.z * v2.z); |
252 | | - v2.x = v2.x - dotProductNormalized * u1.x; |
253 | | - v2.y = v2.y - dotProductNormalized * u1.y; |
254 | | - v2.z = v2.z - dotProductNormalized * u1.z; |
255 | | - |
256 | | - normv2 = Math.sqrt(v2.x * v2.x + v2.y * v2.y + v2.z * v2.z); |
257 | | - v2.x = v2.x / normv2 * normv1; |
258 | | - v2.y = v2.y / normv2 * normv1; |
259 | | - v2.z = v2.z / normv2 * normv1; |
260 | | - |
261 | | - correctedAffineTransform.set(v2.x, 1, 0); |
262 | | - correctedAffineTransform.set(v2.y, 1, 1); |
263 | | - correctedAffineTransform.set(v2.z, 1, 2); |
| 254 | + double u1x = v1x / normv1; |
| 255 | + double u1y = v1y / normv1; |
| 256 | + double u1z = v1z / normv1; |
| 257 | + double dotProductNormalized = (u1x * v2x + u1y * v2y + u1z * v2z); |
| 258 | + v2x = v2x - dotProductNormalized * u1x; |
| 259 | + v2y = v2y - dotProductNormalized * u1y; |
| 260 | + v2z = v2z - dotProductNormalized * u1z; |
| 261 | + |
| 262 | + normv2 = Math.sqrt(v2x * v2x + v2y * v2y + v2z * v2z); |
| 263 | + v2x = v2x / normv2 * normv1; |
| 264 | + v2y = v2y / normv2 * normv1; |
| 265 | + v2z = v2z / normv2 * normv1; |
| 266 | + |
| 267 | + correctedAffineTransform.set(v2x, 1, 0); |
| 268 | + correctedAffineTransform.set(v2y, 1, 1); |
| 269 | + correctedAffineTransform.set(v2z, 1, 2); |
264 | 270 | } |
265 | 271 |
|
266 | 272 | // 2 - We now set v3 as the cross product of v1 and v2, no matter what |
267 | | - double xr = (v1.y * v2.z - v1.z * v2.y) / normv1; |
268 | | - double yr = (v1.z * v2.x - v1.x * v2.z) / normv1; |
269 | | - double zr = (v1.x * v2.y - v1.y * v2.x) / normv1; |
| 273 | + double xr = (v1y * v2z - v1z * v2y) / normv1; |
| 274 | + double yr = (v1z * v2x - v1x * v2z) / normv1; |
| 275 | + double zr = (v1x * v2y - v1y * v2x) / normv1; |
270 | 276 |
|
271 | | - Point3d v3orthonormal = new Point3d(xr, yr, zr); |
| 277 | + //double v3orthonormal = new Point3d(xr, yr, zr); |
272 | 278 |
|
273 | | - correctedAffineTransform.set(v3orthonormal.x, 2, 0); |
274 | | - correctedAffineTransform.set(v3orthonormal.y, 2, 1); |
275 | | - correctedAffineTransform.set(v3orthonormal.z, 2, 2); |
| 279 | + correctedAffineTransform.set(xr, 2, 0); |
| 280 | + correctedAffineTransform.set(yr, 2, 1); |
| 281 | + correctedAffineTransform.set(zr, 2, 2); |
276 | 282 |
|
277 | 283 | return correctedAffineTransform; |
278 | 284 |
|
|
0 commit comments