diff options
| -rw-r--r-- | src/GipfelWidget.H | 13 | ||||
| -rw-r--r-- | src/GipfelWidget.cxx | 95 | ||||
| -rw-r--r-- | src/Hill.H | 5 | ||||
| -rw-r--r-- | src/Hill.cxx | 6 | ||||
| -rw-r--r-- | src/Panorama.H | 16 | ||||
| -rw-r--r-- | src/Panorama.cxx | 77 | ||||
| -rw-r--r-- | src/gipfel.cxx | 37 | 
7 files changed, 220 insertions, 29 deletions
| diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H index 1eeeb72..4d1f0fe 100644 --- a/src/GipfelWidget.H +++ b/src/GipfelWidget.H @@ -1,5 +1,5 @@  //  -// "$Id: GipfelWidget.H,v 1.3 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: GipfelWidget.H,v 1.4 2005/04/13 21:58:31 hofmann Exp $"  //  // X11 header file for the Fast Light Tool Kit (FLTK).  // @@ -31,7 +31,14 @@ class GipfelWidget : public Fl_Widget {   private:    Fl_Image *img;    Panorama *pan; +  Mountain *cur_mountain; +  int handle(int event); + +  int set_cur_mountain(int m_x, int m_y); + +  int move_mountain(int m_x, int m_y); +     public:    GipfelWidget(int X,int Y,int W, int H); @@ -41,6 +48,10 @@ class GipfelWidget : public Fl_Widget {    int set_viewpoint(const char *pos); +  void set_center_angle(double a); + +  void set_scale(double s); +    void draw();  };  #endif diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 821943d..03267aa 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -1,5 +1,5 @@  //  -// "$Id: GipfelWidget.cxx,v 1.3 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: GipfelWidget.cxx,v 1.4 2005/04/13 21:58:31 hofmann Exp $"  //  // PSEditWidget routines.  // @@ -43,6 +43,7 @@  GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) {    img = NULL;    pan = new Panorama(); +  cur_mountain = NULL;    fl_register_images();  } @@ -82,18 +83,98 @@ GipfelWidget::draw() {    img->draw(x(),y(),w(),h(),0,0); -  fl_color(FL_RED); +    fl_font(FL_COURIER, 10);    m = pan->get_visible_mountains();    while (m) { -    int m_x = pan->get_x(m); - -    fl_line(center + m_x + x(), 0 + y(), center + m_x + x(), h() + y()); -    fl_draw(m->name, m_x + x(), 20 + y() + m_x / 4); -    m = m->get_next(); +    if (m == cur_mountain) { +      fl_color(FL_RED); +    } else { +      fl_color(FL_BLACK); +    } +     +    fl_line(center + m->x + x(), 0 + y(), center + m->x + x(), h() + y()); +    fl_draw(m->name, center + m->x + x(), 20 + y() + (int) m->height / 6); +    m = m->get_next_visible();    }    fl_pop_clip();  } +int +GipfelWidget::set_cur_mountain(int m_x, int m_y) { +  Mountain *m = pan->get_visible_mountains(); +  int center = w() / 2; + +  while (m) { +    if (m_x - center >= m->x - 2 && m_x - center < m->x + 2) { +      cur_mountain = m; +      redraw(); +      return 0; +    } + +    m = m->get_next_visible(); +  } +  cur_mountain = NULL; +  redraw(); +  return 1; +} + +int +GipfelWidget::move_mountain(int m_x, int m_y) { +  int ret; +  int center = w() / 2; + +  if (cur_mountain == NULL) { +    return 1; +  } + +  ret = pan->move_mountain(cur_mountain, m_x - center, m_y - center); +   +  redraw(); +  return ret; +} + +void +GipfelWidget::set_center_angle(double a) { +  pan->set_center_angle(a); +  redraw(); +} + +void +GipfelWidget::set_scale(double s) { +  pan->set_scale(s); +  redraw(); +} + +int +GipfelWidget::handle(int event) { +  int mark_x, mark_y; + +  switch(event) { +  case FL_PUSH:     +    if (Fl::event_button() == 1) { +          +      mark_x = Fl::event_x()-x(); +      mark_y = Fl::event_y()-y(); +      fprintf(stderr, "x %d, y %d\n", mark_x, mark_y); +      set_cur_mountain(mark_x, mark_y); + +      Fl::focus(this); +      return 1; +    } +    break; +  case FL_DRAG: +    move_mountain(Fl::event_x()-x(), Fl::event_y()-y()); +    return 1; +    break; +  case FL_FOCUS: +    return 1; +    break; +  case FL_UNFOCUS: +    return 0; +    break; +  } +  return 0; +} @@ -1,5 +1,5 @@  //  -// "$Id: Hill.H,v 1.2 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: Hill.H,v 1.3 2005/04/13 21:58:31 hofmann Exp $"  //  // X11 header file for the Fast Light Tool Kit (FLTK).  // @@ -35,6 +35,7 @@ class Mountain {    double phi, lam;    double height;    double alph; +  int x, y;    char *name;    Mountain(const char *n, double p, double l, double h); @@ -45,7 +46,7 @@ class Mountain {    void append_visible(Mountain *m); -  void set_first_visible(); +  void clear_next_visible();    Mountain * get_next(); diff --git a/src/Hill.cxx b/src/Hill.cxx index e3d999c..2790712 100644 --- a/src/Hill.cxx +++ b/src/Hill.cxx @@ -1,5 +1,5 @@  //  -// "$Id: Hill.cxx,v 1.2 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: Hill.cxx,v 1.3 2005/04/13 21:58:31 hofmann Exp $"  //  // PSEditWidget routines.  // @@ -32,6 +32,8 @@ Mountain::Mountain(const char *n, double p, double l, double h) {    lam = l;    height = h;    alph = 0.0; +  x = 0; +  y = 0;    next = NULL;    next_visible = NULL;  } @@ -75,6 +77,6 @@ Mountain::get_next_visible() {  }  void -Mountain::set_first_visible() { +Mountain::clear_next_visible() {    next_visible = NULL;  } diff --git a/src/Panorama.H b/src/Panorama.H index 690ed86..30e2635 100644 --- a/src/Panorama.H +++ b/src/Panorama.H @@ -1,5 +1,5 @@  //  -// "$Id: Panorama.H,v 1.2 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: Panorama.H,v 1.3 2005/04/13 21:58:31 hofmann Exp $"  //  // X11 header file for the Fast Light Tool Kit (FLTK).  // @@ -32,8 +32,9 @@ class Panorama {    double height_dist_ratio;    Mountain *mountains;    Mountain *visible_mountains; +  Mountain *m1, *m2;    double pi, deg2rad; -  double center_angle; +  double a_center;    double scale;    int get_pos(const char *name, double *phi, double *lam); @@ -47,6 +48,10 @@ class Panorama {    double cos_alpha(double phi, double c);    double alpha(double phi, double lam); +   +  double center_angle(double alph_a, double alph_b, double d1, double d2); + +  int get_x(Mountain *m);   public:    Panorama(); @@ -61,6 +66,11 @@ class Panorama {    Mountain * get_visible_mountains(); -  int get_x(Mountain *m); +  int move_mountain(Mountain *m, int x, int y); + +  void set_center_angle(double a); + +  void set_scale(double s); +  };  #endif diff --git a/src/Panorama.cxx b/src/Panorama.cxx index e2fce5d..7236d3e 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -1,5 +1,5 @@  //  -// "$Id: Panorama.cxx,v 1.2 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: Panorama.cxx,v 1.3 2005/04/13 21:58:31 hofmann Exp $"  //  // PSEditWidget routines.  // @@ -31,11 +31,13 @@  Panorama::Panorama() {    mountains = NULL;    visible_mountains = NULL; -  height_dist_ratio = 0.1; +  m1 = NULL; +  m2 = NULL; +  height_dist_ratio = 0.10;    pi = asin(1.0) * 2.0;    deg2rad = pi / 180.0; -  center_angle = 0.0; -  scale = 200.0; +  a_center = 0.2*pi; +  scale = 0.2;  }  Panorama::~Panorama() { @@ -109,7 +111,43 @@ Panorama::get_visible_mountains() {  int  Panorama::get_x(Mountain *m) { -  return (int) (tan(m->alph - center_angle) * scale); +  return  (int) (tan(m->alph - a_center) * scale); +} + +int +Panorama::move_mountain(Mountain *m, int x, int y) { +  if (m1 && m2 && m != m1 && m != m2) { +    return 1; +  } + +  m->x = x; + +  if (m1 == NULL) { +    m1 = m; +  } else if (m2 == NULL && m != m1) { +    m2 = m; +  } else if (m1 && m2) { +    a_center = center_angle(m1->alph, m2->alph, m1->x, m2->x); +    scale = (m1->x - m2->x) /  +      (tan(m1->alph - a_center) - tan(m2->alph - a_center)); +    fprintf(stderr, "center = %f, scale = %f\n", a_center /deg2rad, scale); +    update_visible_mountains(); +  } + +  return 0; +} + +void +Panorama::set_center_angle(double a) { +  a_center = a; +  fprintf(stderr, "--> %f\n", a); +  update_visible_mountains(); +} + +void +Panorama::set_scale(double s) { +  scale = s; +  update_visible_mountains();  }  int @@ -144,12 +182,18 @@ Panorama::update_visible_mountains() {    visible_mountains = NULL;    while (m) { - -    if (m->height / (distance(m->phi, m->lam)* 6368000)  -	> height_dist_ratio) { -      m ->alph = alpha(m->phi, m->lam); - -      if (m->alph < pi / 2.0 &&  m->alph > - pi / 2.0) { +    if ((m->phi != view_phi || m->lam != view_lam) && +	(m->height / (distance(m->phi, m->lam)* 6368000)  +	 > height_dist_ratio)) { + +      m->alph = alpha(m->phi, m->lam); + +      if (m->alph - a_center < pi / 2.0 &&  +	  m->alph - a_center > - pi / 2.0) { +      //      fprintf(stderr, "==> %s\n", m->name); +       +	m->x = get_x(m); +	m->clear_next_visible();  	if (visible_mountains) {  	  visible_mountains->append_visible(m);  	} else { @@ -197,3 +241,14 @@ Panorama::alpha(double phi, double lam) {    return alph;  } +double  +Panorama::center_angle(double alph_a, double alph_b, double d1, double d2) { +  double tan_a, tan_b; + +  tan_a = tan(alph_a - alph_b); +  fprintf(stderr, "tan_a %f\n", tan_a); +  tan_b = (d2 - d1 + ((sqrt((d2*(d2 - (2.0*d1*(1.0 + (2.0 * tan_a * tan_a))))) + (d1*d1))))) / (2.0*d2*tan_a); + +  fprintf(stderr, "tan_b=%f\n", tan_b); +  return alph_a + atan(tan_b); +} diff --git a/src/gipfel.cxx b/src/gipfel.cxx index c3436e0..3705986 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -1,5 +1,5 @@  //  -// "$Id: gipfel.cxx,v 1.4 2005/04/13 19:09:19 hofmann Exp $" +// "$Id: gipfel.cxx,v 1.5 2005/04/13 21:58:31 hofmann Exp $"  //  // flpsed program.  // @@ -45,6 +45,7 @@  char *img_file;  char *data_file; +GipfelWidget *gipf;  void open_cb() {    char *file = fl_file_chooser("Open File?", "*.jpeg", img_file); @@ -53,6 +54,18 @@ void open_cb() {    }    } +void scale_cb(Fl_Slider* o, void*) { +  if (gipf) { +    gipf->set_scale((double)(o->value())); +  } +} + +void angle_cb(Fl_Slider* o, void*) { +  if (gipf) { +    gipf->set_center_angle((double)(o->value())); +  } +} +  void about_cb() {    fl_message("flpsed -- a pseudo PostScript editor\n"  	     "(c) Johannes Hofmann 2004, 2005\n\n" @@ -123,9 +136,27 @@ int main(int argc, char** argv) {    win = new Fl_Window(600,700);    m = new Fl_Menu_Bar(0, 0, 600, 30);    m->menu(menuitems); -  scroll = new Fl_Scroll(0, 30, win->w(), win->h()-30); +  Fl_Slider* s = new Fl_Slider(0, 30, 160, 15, "scale"); +  s->type(1); +  s->box(FL_THIN_DOWN_BOX); +  s->labelsize(10); +  s->step(10.0); +  s->bounds(0.0, 800.0); +  s->slider(FL_UP_BOX); +  s->callback((Fl_Callback*)scale_cb); +  Fl_Slider* a = new Fl_Slider(160, 30, 160, 15, "angle"); +  a->type(1); +  a->box(FL_THIN_DOWN_BOX); +  a->labelsize(10); +  a->step(0.01); +  a->bounds(-4.0, 4.0); +  a->slider(FL_UP_BOX); +  a->callback((Fl_Callback*)angle_cb); + + +  scroll = new Fl_Scroll(0, 60, win->w(), win->h()-60); -  GipfelWidget *gipf = new GipfelWidget(0,30,500,500); +  gipf = new GipfelWidget(0,60,500,500);    gipf->load_image(img_file);    gipf->load_data(data_file); | 
