Changes in src/tesselationhelpers.cpp [bdc91e:797126]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tesselationhelpers.cpp
rbdc91e r797126 21 21 #include "verbose.hpp" 22 22 #include "Plane.hpp" 23 24 double DetGet(gsl_matrix * const A, const int inPlace) 25 { 26 Info FunctionInfo(__func__); 27 /* 28 inPlace = 1 => A is replaced with the LU decomposed copy. 29 inPlace = 0 => A is retained, and a copy is used for LU. 30 */ 31 32 double det; 33 int signum; 34 gsl_permutation *p = gsl_permutation_alloc(A->size1); 35 gsl_matrix *tmpA=0; 36 37 if (inPlace) 38 tmpA = A; 39 else { 40 gsl_matrix *tmpA = gsl_matrix_alloc(A->size1, A->size2); 41 gsl_matrix_memcpy(tmpA , A); 42 } 43 44 45 gsl_linalg_LU_decomp(tmpA , p , &signum); 46 det = gsl_linalg_LU_det(tmpA , signum); 47 gsl_permutation_free(p); 48 if (! inPlace) 49 gsl_matrix_free(tmpA); 50 51 return det; 52 }; 23 #include "Matrix.hpp" 53 24 54 25 void GetSphere(Vector * const center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS) 55 26 { 56 27 Info FunctionInfo(__func__); 57 gsl_matrix *A = gsl_matrix_calloc(3,3);28 Matrix mat; 58 29 double m11, m12, m13, m14; 59 30 60 31 for(int i=0;i<3;i++) { 61 gsl_matrix_set(A,i, 0, a[i]);62 gsl_matrix_set(A,i, 1, b[i]);63 gsl_matrix_set(A,i, 2, c[i]);64 } 65 m11 = DetGet(A, 1);32 mat.set(i, 0, a[i]); 33 mat.set(i, 1, b[i]); 34 mat.set(i, 2, c[i]); 35 } 36 m11 = mat.determinant(); 66 37 67 38 for(int i=0;i<3;i++) { 68 gsl_matrix_set(A,i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);69 gsl_matrix_set(A,i, 1, b[i]);70 gsl_matrix_set(A,i, 2, c[i]);71 } 72 m12 = DetGet(A, 1);39 mat.set(i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]); 40 mat.set(i, 1, b[i]); 41 mat.set(i, 2, c[i]); 42 } 43 m12 = mat.determinant(); 73 44 74 45 for(int i=0;i<3;i++) { 75 gsl_matrix_set(A,i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);76 gsl_matrix_set(A,i, 1, a[i]);77 gsl_matrix_set(A,i, 2, c[i]);78 } 79 m13 = DetGet(A, 1);46 mat.set(i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]); 47 mat.set(i, 1, a[i]); 48 mat.set(i, 2, c[i]); 49 } 50 m13 = mat.determinant(); 80 51 81 52 for(int i=0;i<3;i++) { 82 gsl_matrix_set(A,i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);83 gsl_matrix_set(A,i, 1, a[i]);84 gsl_matrix_set(A,i, 2, b[i]);85 } 86 m14 = DetGet(A, 1);53 mat.set(i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]); 54 mat.set(i, 1, a[i]); 55 mat.set(i, 2, b[i]); 56 } 57 m14 = mat.determinant(); 87 58 88 59 if (fabs(m11) < MYEPSILON) … … 95 66 if (fabs(a.distance(*center) - RADIUS) > MYEPSILON) 96 67 DoeLog(1) && (eLog()<< Verbose(1) << "The given center is further way by " << fabs(a.distance(*center) - RADIUS) << " from a than RADIUS." << endl); 97 98 gsl_matrix_free(A);99 68 }; 100 69 … … 248 217 Vector x3; 249 218 Vector x4; 250 };251 252 /**253 * Intersection calculation function.254 *255 * @param x to find the result for256 * @param function parameter257 */258 double MinIntersectDistance(const gsl_vector * x, void *params)259 {260 Info FunctionInfo(__func__);261 double retval = 0;262 struct Intersection *I = (struct Intersection *)params;263 Vector intersection;264 for (int i=0;i<NDIM;i++)265 intersection[i] = gsl_vector_get(x, i);266 267 Vector SideA = I->x1 -I->x2 ;268 Vector HeightA = intersection - I->x1;269 HeightA.ProjectOntoPlane(SideA);270 271 Vector SideB = I->x3 - I->x4;272 Vector HeightB = intersection - I->x3;273 HeightB.ProjectOntoPlane(SideB);274 275 retval = HeightA.ScalarProduct(HeightA) + HeightB.ScalarProduct(HeightB);276 //Log() << Verbose(1) << "MinIntersectDistance called, result: " << retval << endl;277 278 return retval;279 };280 281 282 /**283 * Calculates whether there is an intersection between two lines. The first line284 * always goes through point 1 and point 2 and the second line is given by the285 * connection between point 4 and point 5.286 *287 * @param point 1 of line 1288 * @param point 2 of line 1289 * @param point 1 of line 2290 * @param point 2 of line 2291 *292 * @return true if there is an intersection between the given lines, false otherwise293 */294 bool existsIntersection(const Vector &point1, const Vector &point2, const Vector &point3, const Vector &point4)295 {296 Info FunctionInfo(__func__);297 bool result;298 299 struct Intersection par;300 par.x1 = point1;301 par.x2 = point2;302 par.x3 = point3;303 par.x4 = point4;304 305 const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex;306 gsl_multimin_fminimizer *s = NULL;307 gsl_vector *ss, *x;308 gsl_multimin_function minexFunction;309 310 size_t iter = 0;311 int status;312 double size;313 314 /* Starting point */315 x = gsl_vector_alloc(NDIM);316 gsl_vector_set(x, 0, point1[0]);317 gsl_vector_set(x, 1, point1[1]);318 gsl_vector_set(x, 2, point1[2]);319 320 /* Set initial step sizes to 1 */321 ss = gsl_vector_alloc(NDIM);322 gsl_vector_set_all(ss, 1.0);323 324 /* Initialize method and iterate */325 minexFunction.n = NDIM;326 minexFunction.f = &MinIntersectDistance;327 minexFunction.params = (void *)∥328 329 s = gsl_multimin_fminimizer_alloc(T, NDIM);330 gsl_multimin_fminimizer_set(s, &minexFunction, x, ss);331 332 do {333 iter++;334 status = gsl_multimin_fminimizer_iterate(s);335 336 if (status) {337 break;338 }339 340 size = gsl_multimin_fminimizer_size(s);341 status = gsl_multimin_test_size(size, 1e-2);342 343 if (status == GSL_SUCCESS) {344 DoLog(1) && (Log() << Verbose(1) << "converged to minimum" << endl);345 }346 } while (status == GSL_CONTINUE && iter < 100);347 348 // check whether intersection is in between or not349 Vector intersection;350 double t1, t2;351 for (int i = 0; i < NDIM; i++) {352 intersection[i] = gsl_vector_get(s->x, i);353 }354 355 Vector SideA = par.x2 - par.x1;356 Vector HeightA = intersection - par.x1;357 358 t1 = HeightA.ScalarProduct(SideA)/SideA.ScalarProduct(SideA);359 360 Vector SideB = par.x4 - par.x3;361 Vector HeightB = intersection - par.x3;362 363 t2 = HeightB.ScalarProduct(SideB)/SideB.ScalarProduct(SideB);364 365 Log() << Verbose(1) << "Intersection " << intersection << " is at "366 << t1 << " for (" << point1 << "," << point2 << ") and at "367 << t2 << " for (" << point3 << "," << point4 << "): ";368 369 if (((t1 >= 0) && (t1 <= 1)) && ((t2 >= 0) && (t2 <= 1))) {370 DoLog(1) && (Log() << Verbose(1) << "true intersection." << endl);371 result = true;372 } else {373 DoLog(1) && (Log() << Verbose(1) << "intersection out of region of interest." << endl);374 result = false;375 }376 377 // free minimizer stuff378 gsl_vector_free(x);379 gsl_vector_free(ss);380 gsl_multimin_fminimizer_free(s);381 382 return result;383 219 }; 384 220 … … 589 425 } 590 426 } else { 591 DoeLog(1) && (eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl); 427 eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," 428 << LC->n[2] << " is invalid!" << endl; 592 429 } 593 430 } … … 644 481 } 645 482 } else { 646 DoeLog(1) && (eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl); 483 eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," 484 << LC->n[2] << " is invalid!" << endl; 647 485 } 648 486 }
Note:
See TracChangeset
for help on using the changeset viewer.