diff options
author | Johannes Hofmann <johannes.hofmann@gmx.de> | 2005-05-02 14:36:45 +0000 |
---|---|---|
committer | Johannes Hofmann <johannes.hofmann@gmx.de> | 2005-05-02 14:36:45 +0000 |
commit | 279fa2391a9bdff90d0fcf5c2d160aa11bfc4ac9 (patch) | |
tree | 3e6106a2540443302ed1fbaad34f899e4991d248 | |
parent | b46a212d132c4ed1b020be5283d65d24dfbeefcd (diff) |
guess with one given mountain
guess with one given mountain
-rw-r--r-- | src/GipfelWidget.H | 4 | ||||
-rw-r--r-- | src/GipfelWidget.cxx | 8 | ||||
-rw-r--r-- | src/Panorama.cxx | 152 |
3 files changed, 123 insertions, 41 deletions
diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H index 575a9d4..688cb0f 100644 --- a/src/GipfelWidget.H +++ b/src/GipfelWidget.H @@ -1,5 +1,5 @@ // -// "$Id: GipfelWidget.H,v 1.12 2005/04/30 21:18:43 hofmann Exp $" +// "$Id: GipfelWidget.H,v 1.13 2005/05/02 16:36:45 hofmann Exp $" // // X11 header file for the Fast Light Tool Kit (FLTK). // @@ -65,6 +65,8 @@ class GipfelWidget : public Fl_Widget { int guess(); + int update(); + void draw(); }; #endif diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 6e93c37..3ad141d 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -1,5 +1,5 @@ // -// "$Id: GipfelWidget.cxx,v 1.15 2005/04/30 21:18:43 hofmann Exp $" +// "$Id: GipfelWidget.cxx,v 1.16 2005/05/02 16:36:45 hofmann Exp $" // // PSEditWidget routines. // @@ -224,6 +224,12 @@ GipfelWidget::guess() { redraw(); } +int +GipfelWidget::update() { + redraw(); + Fl::wait(1.0); +} + int GipfelWidget::handle(int event) { diff --git a/src/Panorama.cxx b/src/Panorama.cxx index db60de2..3f5a19b 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -1,5 +1,5 @@ // -// "$Id: Panorama.cxx,v 1.19 2005/04/30 21:41:56 hofmann Exp $" +// "$Id: Panorama.cxx,v 1.20 2005/05/02 16:36:45 hofmann Exp $" // // PSEditWidget routines. // @@ -29,6 +29,7 @@ extern "C" { #include <ccmath.h> } +#include "GipfelWidget.H" #include "Panorama.H" static int newton(double *tan_nick_view, @@ -159,9 +160,9 @@ Panorama::get_value(Mountain *p) { double v = 0.0, d_min, d; if (isnan(scale) || isnan(a_center) || isnan(a_tilt) || isnan(a_nick) || - scale < 1000.0 || scale > 100000.0 || + scale < 500.0 || scale > 100000.0 || a_nick > pi_d/4.0 || a_nick < - pi_d/4.0 || - a_tilt > pi_d/8.0 || a_tilt < - pi_d/8.0) { + a_tilt > pi_d/16.0 || a_tilt < - pi_d/16.0) { return 10000000.0; } @@ -185,7 +186,10 @@ Panorama::get_value(Mountain *p) { return v; } +extern GipfelWidget *gipf; + +#if 0 int Panorama::guess(Mountain *p) { Mountain *p1, *p2, *m_tmp1, *m_tmp2; @@ -197,46 +201,49 @@ Panorama::guess(Mountain *p) { while (p1) { p2 = p; while (p2) { - - m_tmp1 = mountains; - while(m_tmp1) { - if (m_tmp1->height / (m_tmp1->dist * EARTH_RADIUS) > - height_dist_ratio) { - m_tmp2 = mountains; + if (fabs(p1->x - p2->x) + fabs(p1->y - p2->y) > 50.0) { + m_tmp1 = mountains; + while(m_tmp1) { + if (m_tmp1->height / (m_tmp1->dist * EARTH_RADIUS) > + height_dist_ratio) { + m_tmp2 = mountains; - while(m_tmp2) { - if (fabs(m_tmp1->alph - m_tmp2->alph) < pi_d / 2.0 && - m_tmp2->height / (m_tmp2->dist * EARTH_RADIUS) > - height_dist_ratio) { - - if (p1 != p2 && m_tmp1 != m_tmp2) { - - m_tmp1->x = p1->x; - m_tmp1->y = p1->y; - m1 = m_tmp1; - m_tmp2->x = p2->x; - m_tmp2->y = p2->y; - m2 = m_tmp2; - - comp_params(); + while(m_tmp2) { + if (fabs(m_tmp1->alph - m_tmp2->alph) < pi_d / 2.0 && + m_tmp2->height / (m_tmp2->dist * EARTH_RADIUS) > + height_dist_ratio) { - v = get_value(p); - - if (v < best) { - best = v; - a_center_best = a_center; - a_nick_best = a_nick; - a_tilt_best = a_tilt; - scale_best = scale; - fprintf(stderr, "best %f\n", best); - } + if (p1 != p2 && m_tmp1 != m_tmp2) { + + m_tmp1->x = p1->x; + m_tmp1->y = p1->y; + m1 = m_tmp1; + m_tmp2->x = p2->x; + m_tmp2->y = p2->y; + m2 = m_tmp2; + + comp_params(); + + v = get_value(p); + + if (v < best) { + best = v; + a_center_best = a_center; + a_nick_best = a_nick; + a_tilt_best = a_tilt; + scale_best = scale; + gipf->update(); + + fprintf(stderr, "best %f\n", best); + } + } } - } - - m_tmp2 = m_tmp2->get_next(); - } + + m_tmp2 = m_tmp2->get_next(); + } + } + m_tmp1 = m_tmp1->get_next(); } - m_tmp1 = m_tmp1->get_next(); } p2 = p2->get_next(); } @@ -253,6 +260,73 @@ Panorama::guess(Mountain *p) { return 0; } +#else +int +Panorama::guess(Mountain *p) { + Mountain *p2, *m_tmp1, *m_tmp2; + double best = 100000000.0, v; + double a_center_best, a_nick_best, a_tilt_best, scale_best; + int x1_sav, y1_sav; + + if (m1 == NULL) { + fprintf(stderr, "Position one mountain first.\n"); + return 1; + } + + m_tmp1 = m1; + x1_sav = m1->x; + y1_sav = m1->y; + + p2 = p; + while (p2) { + m_tmp2 = mountains; + while(m_tmp2) { + m1 = m_tmp1; + m1->x = x1_sav; + m1->y = y1_sav; + + if (fabs(m1->alph - m_tmp2->alph) < pi_d / 2.0 && + m_tmp2->height / (m_tmp2->dist * EARTH_RADIUS) > + height_dist_ratio) { + + if (m1 != m_tmp2) { + + m_tmp2->x = p2->x; + m_tmp2->y = p2->y; + m2 = m_tmp2; + + comp_params(); + + v = get_value(p); + + if (v < best) { + best = v; + a_center_best = a_center; + a_nick_best = a_nick; + a_tilt_best = a_tilt; + scale_best = scale; + gipf->update(); + + fprintf(stderr, "best %f\n", best); + } + } + } + + m_tmp2 = m_tmp2->get_next(); + } + p2 = p2->get_next(); + } + + a_center = a_center_best; + a_nick = a_nick_best; + a_tilt = a_tilt_best; + scale = scale_best; + fprintf(stderr, "best %f\n", best); + fprintf(stderr, "center = %f, scale = %f, nick=%f\n", a_center /deg2rad, scale, a_nick/deg2rad); + update_visible_mountains(); + return 0; +} +#endif int Panorama::comp_params() { |