summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2005-11-14 23:14:58 +0100
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2005-11-14 23:14:58 +0100
commit2658022a5f71690c18478d94c64d445aa38a68ee (patch)
tree4434ca3aeda58364c8a9932010ae03d6aa097aa1 /src
parent7bf6b08fcda6c2fc37405e4a77f23b73191bd671 (diff)
fix wrap-around bug in ProjectionTangential
Diffstat (limited to 'src')
-rw-r--r--src/ProjectionTangential.H2
-rw-r--r--src/ProjectionTangential.cxx25
2 files changed, 25 insertions, 2 deletions
diff --git a/src/ProjectionTangential.H b/src/ProjectionTangential.H
index d4646d7..8e7673e 100644
--- a/src/ProjectionTangential.H
+++ b/src/ProjectionTangential.H
@@ -31,6 +31,8 @@ class ProjectionTangential : public Projection {
double comp_scale(double alph_a, double alph_b, double d1, double d2);
+ double angle_dist(double a1, double a2);
+
int optimize(const Hill *m1, const Hill *m2, ViewParams *parms);
public:
diff --git a/src/ProjectionTangential.cxx b/src/ProjectionTangential.cxx
index 8297ee4..032005d 100644
--- a/src/ProjectionTangential.cxx
+++ b/src/ProjectionTangential.cxx
@@ -76,6 +76,27 @@ ProjectionTangential::comp_params(const Hill *m1, const Hill *m2, ViewParams *pa
}
}
+double
+ProjectionTangential::angle_dist(double a1, double a2) {
+ double ret;
+
+ a1 = fmod(a1, 2.0 * pi_d);
+ if (a1 < 0.0) {
+ a1 = a1 + 2.0 * pi_d;
+ }
+ a2 = fmod(a2, 2.0 * pi_d);
+ if (a2 < 0.0) {
+ a2 = a2 + 2.0 * pi_d;
+ }
+
+ ret = fabs(a1 - a2);
+ if (ret > pi_d) {
+ ret = 2.0 * pi_d - ret;
+ }
+
+ return ret;
+}
+
int
ProjectionTangential::optimize(const Hill *m1, const Hill *m2, ViewParams *parms) {
int i;
@@ -118,10 +139,10 @@ ProjectionTangential::optimize(const Hill *m1, const Hill *m2, ViewParams *parms
// atan(tan_dir_view) is not the only possible solution.
// Choose the one which is close to m1->alph.
- if (fabs(parms->a_center - m1->alph) > pi_d/2.0) {
+ if (angle_dist(parms->a_center, m1->alph) > pi_d/2.0) {
parms->a_center = parms->a_center + pi_d;
}
-
+
parms->scale = n_scale;
// use the point with greater distance from center for tilt computation