Commit 4e9565bd2393541dd0249f0cdfa13d49fd6886f4
1 parent
9aae907d
Correct solidangle computation for triangular pixels.
Showing
1 changed file
with
9 additions
and
23 deletions
src/sky/GWcs.cpp
| ... | ... | @@ -564,46 +564,32 @@ double GWcs::solidangle(const GSkyPixel& pixel) const |
| 564 | 564 | double a12 = dir1.dist(dir2); |
| 565 | 565 | double a14 = dir1.dist(dir4); |
| 566 | 566 | double a23 = dir2.dist(dir3); |
| 567 | + double a24 = dir2.dist(dir4); | |
| 567 | 568 | double a34 = dir3.dist(dir4); |
| 568 | 569 | |
| 569 | 570 | // Special case: a12 or a14 is zero, then pixel is a triangle composed |
| 570 | 571 | // of [2,3,4] |
| 571 | 572 | if (a12 <= 0.0 || a14 <= 0.0) { |
| 572 | - | |
| 573 | - // Compute diagonals | |
| 574 | - double a24 = dir2.dist(dir4); | |
| 575 | - | |
| 576 | - // Triangle [2,3,4] | |
| 577 | 573 | double s = 0.5 * (a23 + a34 + a24); |
| 578 | - solidangle = std::atan(std::sqrt(std::tan(0.5*s) * | |
| 579 | - std::tan(0.5*(s-a23)) * | |
| 580 | - std::tan(0.5*(s-a34)) * | |
| 581 | - std::tan(0.5*(s-a24)))); | |
| 582 | - | |
| 574 | + solidangle = 4.0 * std::atan(std::sqrt(std::tan(0.5*s) * | |
| 575 | + std::tan(0.5*(s-a23)) * | |
| 576 | + std::tan(0.5*(s-a34)) * | |
| 577 | + std::tan(0.5*(s-a24)))); | |
| 583 | 578 | } |
| 584 | 579 | |
| 585 | 580 | // Special case: a23 or a 34 is zero, then pixel is a triangle composed |
| 586 | 581 | // of [1,2,4] |
| 587 | 582 | else if (a23 <= 0.0 || a34 <= 0.0) { |
| 588 | - | |
| 589 | - // Compute diagonals | |
| 590 | - double a24 = dir2.dist(dir4); | |
| 591 | - | |
| 592 | - // Triangle [1,2,4] | |
| 593 | 583 | double s = 0.5 * (a12 + a24 + a14); |
| 594 | - solidangle = std::atan(std::sqrt(std::tan(0.5*s) * | |
| 595 | - std::tan(0.5*(s-a12)) * | |
| 596 | - std::tan(0.5*(s-a24)) * | |
| 597 | - std::tan(0.5*(s-a14)))); | |
| 598 | - | |
| 584 | + solidangle = 4.0 * std::atan(std::sqrt(std::tan(0.5*s) * | |
| 585 | + std::tan(0.5*(s-a12)) * | |
| 586 | + std::tan(0.5*(s-a24)) * | |
| 587 | + std::tan(0.5*(s-a14)))); | |
| 599 | 588 | } |
| 600 | 589 | |
| 601 | 590 | // Otherwise we have a polygon |
| 602 | 591 | else { |
| 603 | 592 | |
| 604 | - // Compute diagonal | |
| 605 | - double a24 = dir2.dist(dir4); | |
| 606 | - | |
| 607 | 593 | // Triangle 1 [1,2,4] |
| 608 | 594 | double s1 = 0.5 * (a12 + a24 + a14); |
| 609 | 595 | double excess1 = std::atan(std::sqrt(std::tan(0.5*s1) * | ... | ... |