Commit 8e42fabd875d7ee468c3aece01be66af1f7df1dc
1 parent
96ba366e
Compute polygon inner angles in GWcs::solidangle method using spherical triangles.
Showing
1 changed file
with
38 additions
and
2 deletions
src/sky/GWcs.cpp
| ... | ... | @@ -435,6 +435,7 @@ double GWcs::solidangle(const GSkyPixel& pixel) const |
| 435 | 435 | GSkyDir dir3 = pix2dir(GSkyPixel(pixel.x()+0.5, pixel.y()+0.5)); |
| 436 | 436 | GSkyDir dir4 = pix2dir(GSkyPixel(pixel.x()-0.5, pixel.y()+0.5)); |
| 437 | 437 | |
| 438 | + /* | |
| 438 | 439 | GVector vec1 = dir1.celvector(); |
| 439 | 440 | GVector vec2 = dir2.celvector(); |
| 440 | 441 | GVector vec3 = dir3.celvector(); |
| ... | ... | @@ -444,9 +445,44 @@ double GWcs::solidangle(const GSkyPixel& pixel) const |
| 444 | 445 | double angle2 = std::acos(cross(vec3, (cross(vec2, vec3))) * cross(vec3, (cross(vec4, vec3)))); |
| 445 | 446 | double angle3 = std::acos(cross(vec4, (cross(vec3, vec4))) * cross(vec4, (cross(vec1, vec4)))); |
| 446 | 447 | double angle4 = std::acos(cross(vec1, (cross(vec4, vec1))) * cross(vec1, (cross(vec2, vec1)))); |
| 447 | - | |
| 448 | + */ | |
| 449 | + | |
| 450 | + // | |
| 451 | + double a; | |
| 452 | + double b; | |
| 453 | + double c; | |
| 454 | + | |
| 455 | + // Angle 1 | |
| 456 | + a = dir1.dist(dir3); | |
| 457 | + b = dir4.dist(dir3); | |
| 458 | + c = dir4.dist(dir1); | |
| 459 | + double angle1 = std::acos((std::cos(a) - std::cos(b)*std::cos(c))/(std::sin(b)*std::sin(c))); | |
| 460 | + | |
| 461 | + // Angle 2 | |
| 462 | + a = dir4.dist(dir2); | |
| 463 | + b = dir2.dist(dir3); | |
| 464 | + c = dir3.dist(dir4); | |
| 465 | + double angle2 = std::acos((std::cos(a) - std::cos(b)*std::cos(c))/(std::sin(b)*std::sin(c))); | |
| 466 | + | |
| 467 | + // Angle 3 | |
| 468 | + a = dir1.dist(dir3); | |
| 469 | + b = dir1.dist(dir2); | |
| 470 | + c = dir2.dist(dir3); | |
| 471 | + double angle3 = std::acos((std::cos(a) - std::cos(b)*std::cos(c))/(std::sin(b)*std::sin(c))); | |
| 472 | + | |
| 473 | + // Angle 4 | |
| 474 | + a = dir4.dist(dir2); | |
| 475 | + b = dir4.dist(dir1); | |
| 476 | + c = dir1.dist(dir2); | |
| 477 | + double angle4 = std::acos((std::cos(a) - std::cos(b)*std::cos(c))/(std::sin(b)*std::sin(c))); | |
| 478 | + | |
| 479 | + std::cout << angle1 << " "; | |
| 480 | + std::cout << angle2 << " "; | |
| 481 | + std::cout << angle3 << " "; | |
| 482 | + std::cout << angle4 << " " << std::endl; | |
| 483 | + | |
| 448 | 484 | // http://mathworld.wolfram.com/SphericalPolygon.html |
| 449 | - double solidangle = (angle1 + angle2 + angle3 + angle4) - (2 * gammalib::pi); | |
| 485 | + double solidangle = (angle1 + angle2 + angle3 + angle4) - (2.0 * gammalib::pi); | |
| 450 | 486 | |
| 451 | 487 | // Return solid angle |
| 452 | 488 | return solidangle; | ... | ... |