diff options
| -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() { | 
