diff options
| -rw-r--r-- | src/Fl_Search_Chooser.H | 30 | ||||
| -rw-r--r-- | src/Fl_Search_Chooser.cxx | 117 | ||||
| -rw-r--r-- | src/Fl_Value_Dial.H | 26 | ||||
| -rw-r--r-- | src/Fl_Value_Dial.cxx | 90 | ||||
| -rw-r--r-- | src/GipfelWidget.H | 122 | ||||
| -rw-r--r-- | src/GipfelWidget.cxx | 916 | ||||
| -rw-r--r-- | src/Hill.H | 96 | ||||
| -rw-r--r-- | src/Hill.cxx | 396 | ||||
| -rw-r--r-- | src/Panorama.H | 140 | ||||
| -rw-r--r-- | src/Panorama.cxx | 698 | ||||
| -rw-r--r-- | src/Projection.H | 24 | ||||
| -rw-r--r-- | src/Projection.cxx | 10 | ||||
| -rw-r--r-- | src/ProjectionSphaeric.H | 18 | ||||
| -rw-r--r-- | src/ProjectionSphaeric.cxx | 198 | ||||
| -rw-r--r-- | src/ProjectionTangential.H | 20 | ||||
| -rw-r--r-- | src/ProjectionTangential.cxx | 410 | ||||
| -rw-r--r-- | src/Stitch.H | 6 | ||||
| -rw-r--r-- | src/Stitch.cxx | 4 | ||||
| -rw-r--r-- | src/ViewParams.H | 10 | ||||
| -rw-r--r-- | src/choose_hill.cxx | 52 | ||||
| -rw-r--r-- | src/util.c | 82 | ||||
| -rw-r--r-- | src/util.h | 4 | 
22 files changed, 1734 insertions, 1735 deletions
| diff --git a/src/Fl_Search_Chooser.H b/src/Fl_Search_Chooser.H index 821ffdd..e968452 100644 --- a/src/Fl_Search_Chooser.H +++ b/src/Fl_Search_Chooser.H @@ -12,27 +12,27 @@  #include <FL/Fl_Input.H>  class Fl_Search_Browser : public Fl_Select_Browser { -  public: -     -   Fl_Search_Browser(int X, int Y, int W, int H, const char *c):Fl_Select_Browser(X,Y,W,H,c){}; +	public: -   int find_prefix(const char *p); -  private: -   int find_prefix(const char *p, int s, int e); +		Fl_Search_Browser(int X, int Y, int W, int H, const char *c):Fl_Select_Browser(X,Y,W,H,c){}; + +		int find_prefix(const char *p); +	private: +		int find_prefix(const char *p, int s, int e);  };  class Fl_Search_Chooser { -  private: -  public: -    Fl_Window *w; -    Fl_Search_Browser *sb; +	private: +	public: +		Fl_Window *w; +		Fl_Search_Browser *sb; -    Fl_Search_Chooser(const char *title); +		Fl_Search_Chooser(const char *title); -    void add(const char *t, void *d); -    void *data(); -    void show(); -    int shown(); +		void add(const char *t, void *d); +		void *data(); +		void show(); +		int shown();  };  #endif diff --git a/src/Fl_Search_Chooser.cxx b/src/Fl_Search_Chooser.cxx index d9bc92c..d4f93b2 100644 --- a/src/Fl_Search_Chooser.cxx +++ b/src/Fl_Search_Chooser.cxx @@ -13,98 +13,97 @@  int  Fl_Search_Browser::find_prefix(const char *p) { -  int i = find_prefix(p, 1, size()); -  if (i == -1) { -    return 1; -  } else { -    deselect(); -    middleline(i); -    select(i); -    return 0; -  } +	int i = find_prefix(p, 1, size()); +	if (i == -1) { +		return 1; +	} else { +		deselect(); +		middleline(i); +		select(i); +		return 0; +	}  };  int  Fl_Search_Browser::find_prefix(const char *p, int s, int e) { -  if (s < 0 || e > size() || s > e) { -    fprintf(stderr, "Invalid search range %d %d\n", s, e); -    return 1; -  } else if (e - s <= 1) { -    if (strncasecmp(p, text(s), strlen(p)) == 0) { -       return s; -    } else if (strncasecmp(p, text(e), strlen(p)) == 0){ -       return e; -    } else { -       return -1; -    } -  } else { -    int med = s + (e - s) / 2; -    if (strncasecmp(p, text(med), strlen(p)) > 0) { -      return find_prefix(p, med, e); -    } else { -      return find_prefix(p, s, med); -    } -  } +	if (s < 0 || e > size() || s > e) { +		fprintf(stderr, "Invalid search range %d %d\n", s, e); +		return 1; +	} else if (e - s <= 1) { +		if (strncasecmp(p, text(s), strlen(p)) == 0) { +			return s; +		} else if (strncasecmp(p, text(e), strlen(p)) == 0){ +			return e; +		} else { +			return -1; +		} +	} else { +		int med = s + (e - s) / 2; +		if (strncasecmp(p, text(med), strlen(p)) > 0) { +			return find_prefix(p, med, e); +		} else { +			return find_prefix(p, s, med); +		} +	}  }   static void input_cb(Fl_Input* in, void*c) { -  Fl_Search_Browser *sb = ((Fl_Search_Chooser *) c)->sb; -  sb->find_prefix(in->value());  +	Fl_Search_Browser *sb = ((Fl_Search_Chooser *) c)->sb; +	sb->find_prefix(in->value());   }      static void ok_cb(Fl_Input* in, void*c) { -  Fl_Search_Chooser *sc = (Fl_Search_Chooser *) c; -  sc->w->hide(); +	Fl_Search_Chooser *sc = (Fl_Search_Chooser *) c; +	sc->w->hide();  }   static void cancel_cb(Fl_Input* in, void*c) { -  Fl_Search_Chooser *sc = (Fl_Search_Chooser *) c; -  sc->sb->deselect(); -  sc->w->hide(); +	Fl_Search_Chooser *sc = (Fl_Search_Chooser *) c; +	sc->sb->deselect(); +	sc->w->hide();  }      Fl_Search_Chooser::Fl_Search_Chooser(const char *title) { -  w = new Fl_Window(320, 320, title?title:"Choose"); -  Fl_Group *g = new Fl_Group(10, 10, w->w() - 10, w->h() - 10); -  sb = new Fl_Search_Browser(g->x(), g->y(), g->w() , g->h() - 100, NULL); -  sb->type(FL_HOLD_BROWSER); -  Fl_Input *in = new Fl_Input(g->x()+50, g->h()-80, g->w()-80, 20, "Search"); -  in->callback((Fl_Callback*) input_cb, this); -  in->when(FL_WHEN_CHANGED); -  Fl_Button *cancel_b = new Fl_Button(g->w()-200, g->h()-30, 80, 25, "Cancel"); -  cancel_b->callback((Fl_Callback*) cancel_cb, this); -  Fl_Button *ok_b = new Fl_Button(g->w()-100, g->h()-30, 80, 25, "Ok"); -  ok_b->callback((Fl_Callback*) ok_cb, this); -  Fl::focus(in); -  g->end(); -  w->end(); +	w = new Fl_Window(320, 320, title?title:"Choose"); +	Fl_Group *g = new Fl_Group(10, 10, w->w() - 10, w->h() - 10); +	sb = new Fl_Search_Browser(g->x(), g->y(), g->w() , g->h() - 100, NULL); +	sb->type(FL_HOLD_BROWSER); +	Fl_Input *in = new Fl_Input(g->x()+50, g->h()-80, g->w()-80, 20, "Search"); +	in->callback((Fl_Callback*) input_cb, this); +	in->when(FL_WHEN_CHANGED); +	Fl_Button *cancel_b = new Fl_Button(g->w()-200, g->h()-30, 80, 25, "Cancel"); +	cancel_b->callback((Fl_Callback*) cancel_cb, this); +	Fl_Button *ok_b = new Fl_Button(g->w()-100, g->h()-30, 80, 25, "Ok"); +	ok_b->callback((Fl_Callback*) ok_cb, this); +	Fl::focus(in); +	g->end(); +	w->end();  }  void  Fl_Search_Chooser::add(const char *t, void *d) { -  sb->add(t, d); +	sb->add(t, d);  }  void *  Fl_Search_Chooser::data() { -  int v = sb->value(); -  if (v) { -    return sb->data(v); -  } else { -    return NULL; -  } +	int v = sb->value(); +	if (v) { +		return sb->data(v); +	} else { +		return NULL; +	}  }  void  Fl_Search_Chooser::show() { -  w->show(); +	w->show();  }  int  Fl_Search_Chooser::shown() { -  return w->shown(); +	return w->shown();  } - diff --git a/src/Fl_Value_Dial.H b/src/Fl_Value_Dial.H index 35a3adf..94fda5a 100644 --- a/src/Fl_Value_Dial.H +++ b/src/Fl_Value_Dial.H @@ -10,19 +10,19 @@  #include <FL/Fl_Dial.H>  class Fl_Value_Dial : public Fl_Dial { -  uchar textfont_, textsize_; -  unsigned textcolor_; - public: -  void draw(); -  int handle(int event); -   -  Fl_Value_Dial(int x,int y,int w,int h, const char *l = 0); -  Fl_Font textfont() const {return (Fl_Font)textfont_;} -  void textfont(uchar s) {textfont_ = s;} -  uchar textsize() const {return textsize_;} -  void textsize(uchar s) {textsize_ = s;} -  Fl_Color textcolor() const {return (Fl_Color)textcolor_;} -  void textcolor(unsigned s) {textcolor_ = s;} +	uchar textfont_, textsize_; +	unsigned textcolor_; +	public: +	void draw(); +	int handle(int event); + +	Fl_Value_Dial(int x,int y,int w,int h, const char *l = 0); +	Fl_Font textfont() const {return (Fl_Font)textfont_;} +	void textfont(uchar s) {textfont_ = s;} +	uchar textsize() const {return textsize_;} +	void textsize(uchar s) {textsize_ = s;} +	Fl_Color textcolor() const {return (Fl_Color)textcolor_;} +	void textcolor(unsigned s) {textcolor_ = s;}  };  #endif diff --git a/src/Fl_Value_Dial.cxx b/src/Fl_Value_Dial.cxx index 773cb58..f210ca3 100644 --- a/src/Fl_Value_Dial.cxx +++ b/src/Fl_Value_Dial.cxx @@ -10,57 +10,57 @@  #include "Fl_Value_Dial.H"  Fl_Value_Dial::Fl_Value_Dial(int X, int Y, int W, int H, const char*l) -: Fl_Dial(X,Y,W,H,l) { -  step(1,100); -  textfont_ = FL_HELVETICA; -  textsize_ = 10; -  textcolor_ = FL_BLACK; -} +	: Fl_Dial(X,Y,W,H,l) { +		step(1,100); +		textfont_ = FL_HELVETICA; +		textsize_ = 10; +		textcolor_ = FL_BLACK; +	}  void Fl_Value_Dial::draw() { -  int sxx = x(), syy = y(), sww = w(), shh = h(); -  int bxx = x(), byy = y(), bww = w(), bhh = h(); +	int sxx = x(), syy = y(), sww = w(), shh = h(); +	int bxx = x(), byy = y(), bww = w(), bhh = h(); -  if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color()); -  Fl_Dial::draw(sxx+Fl::box_dx(box()), -		  syy+Fl::box_dy(box()), -		  sww-Fl::box_dw(box()), -		  shh-Fl::box_dh(box())); +	if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color()); +	Fl_Dial::draw(sxx+Fl::box_dx(box()), +		syy+Fl::box_dy(box()), +		sww-Fl::box_dw(box()), +		shh-Fl::box_dh(box())); -  char buf[128]; -  format(buf); -  fl_font(textfont(), textsize()); +	char buf[128]; +	format(buf); +	fl_font(textfont(), textsize()); -  fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); -  fl_draw(buf, bxx, byy + fl_height() - 2, bww, bhh, FL_ALIGN_TOP); +	fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); +	fl_draw(buf, bxx, byy + fl_height() - 2, bww, bhh, FL_ALIGN_TOP);  }  int Fl_Value_Dial::handle(int event) {   -  switch (event) { -  case FL_KEYBOARD : -    switch (Fl::event_key()) { -    case FL_Left: -      handle_drag(clamp(increment(value(),-1))); -      handle_release(); -      return 1; -    case FL_Right: -      handle_drag(clamp(increment(value(),1))); -      handle_release(); -      return 1; -    default: -      return 0; -    } -    break;  -  case FL_FOCUS : -  case FL_UNFOCUS : -    if (Fl::visible_focus()) { -      redraw(); -      return 1; -    } else return 0; -  case FL_ENTER : -  case FL_LEAVE : -    return 1; -  default: -    return Fl_Dial::handle(event); -  } +	switch (event) { +		case FL_KEYBOARD : +			switch (Fl::event_key()) { +				case FL_Left: +					handle_drag(clamp(increment(value(),-1))); +					handle_release(); +					return 1; +				case FL_Right: +					handle_drag(clamp(increment(value(),1))); +					handle_release(); +					return 1; +				default: +					return 0; +			} +			break;  +		case FL_FOCUS : +		case FL_UNFOCUS : +			if (Fl::visible_focus()) { +				redraw(); +				return 1; +			} else return 0; +		case FL_ENTER : +		case FL_LEAVE : +			return 1; +		default: +			return Fl_Dial::handle(event); +	}  } diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H index 4b3166e..adbb623 100644 --- a/src/GipfelWidget.H +++ b/src/GipfelWidget.H @@ -12,108 +12,108 @@  #include "Panorama.H"  class GipfelWidget : public Fl_Widget { - private: -  Fl_Image *img; -  Hill *cur_mountain; -  Hills *marker; -  Hills *track_points; -  Hill *m1, *m2; -  Panorama *pan; -  Fl_Menu_Button *mb; -  char *img_file; -  double track_width; -  int show_hidden; +	private: +		Fl_Image *img; +		Hill *cur_mountain; +		Hills *marker; +		Hills *track_points; +		Hill *m1, *m2; +		Panorama *pan; +		Fl_Menu_Button *mb; +		char *img_file; +		double track_width; +		int show_hidden; -  int handle(int event); +		int handle(int event); -  int set_cur_mountain(int m_x, int m_y); +		int set_cur_mountain(int m_x, int m_y); -  int set_mountain(int m_x, int m_y); +		int set_mountain(int m_x, int m_y); -  void set_labels(Hills *v); +		void set_labels(Hills *v); -  int get_rel_track_width(Hill *m); +		int get_rel_track_width(Hill *m); -  static int get_pixel_nearest(Fl_Image *img, double x, double y, -                     char *r, char *g, char *b); +		static int get_pixel_nearest(Fl_Image *img, double x, double y, +			char *r, char *g, char *b); -  static int get_pixel(Fl_Image *img, int x, int y, -                     char *r, char *g, char *b); +		static int get_pixel(Fl_Image *img, int x, int y, +			char *r, char *g, char *b); - public: -  GipfelWidget(int X,int Y,int W, int H); +	public: +		GipfelWidget(int X,int Y,int W, int H); -  void center(); +		void center(); -  int load_image(char *file); +		int load_image(char *file); -  int save_image(char *file); -	 -  const char * get_image_filename(); +		int save_image(char *file); -  int load_data(const char *file); +		const char * get_image_filename(); -  int load_track(const char *file); +		int load_data(const char *file); -  int set_viewpoint(const char *pos); +		int load_track(const char *file); -  void set_viewpoint(const Hill *m); +		int set_viewpoint(const char *pos); -  void set_center_angle(double a); +		void set_viewpoint(const Hill *m); -  void set_nick_angle(double a); +		void set_center_angle(double a); -  void set_tilt_angle(double a); +		void set_nick_angle(double a); -  void set_focal_length_35mm(double s); +		void set_tilt_angle(double a); -  void set_height_dist_ratio(double r); +		void set_focal_length_35mm(double s); -  void set_hide_value(double h); +		void set_height_dist_ratio(double r); -  void set_show_hidden(int h); +		void set_hide_value(double h); -  void set_view_lat(double v); +		void set_show_hidden(int h); -  void set_view_long(double v); +		void set_view_lat(double v); -  void set_view_height(double v); -   -  const char * get_viewpoint(); +		void set_view_long(double v); -  double get_center_angle(); +		void set_view_height(double v); -  double get_nick_angle(); +		const char * get_viewpoint(); -  double get_tilt_angle(); +		double get_center_angle(); -  double get_focal_length_35mm(); +		double get_nick_angle(); -  double get_height_dist_ratio(); +		double get_tilt_angle(); -  double get_view_lat(); +		double get_focal_length_35mm(); -  double get_view_long(); +		double get_height_dist_ratio(); -  double get_view_height(); +		double get_view_lat(); -  void set_track_width(double w); +		double get_view_long(); -  Projection::Projection_t get_projection(); +		double get_view_height(); -  void set_projection(Projection::Projection_t p); +		void set_track_width(double w); -  Hills *get_mountains(); +		Projection::Projection_t get_projection(); -  int comp_params(); +		void set_projection(Projection::Projection_t p); -  int guess(); +		Hills *get_mountains(); -  int update(); +		int comp_params(); -  int get_pixel(double a_view, double a_nick, -                    char *r, char *g, char *b); +		int guess(); -  void draw(); +		int update(); + +		int get_pixel(double a_view, double a_nick, +			char *r, char *g, char *b); + +		void draw();  };  #endif diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 2927cde..23cb075 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -37,75 +37,75 @@ static double pi_d, deg2rad;  static void center_cb(Fl_Widget *o, void *f);  GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { -  int i; - -  pi_d = asin(1.0) * 2.0; -  deg2rad = pi_d / 180.0; -  img = NULL; -  pan = new Panorama(); -  cur_mountain = NULL; -  mb = NULL; -  marker = new Hills(); -  m1 = NULL; -  m2 = NULL; -  img_file = NULL; -  track_width = 200.0; -  show_hidden = 0; - -  for (i=0; i<=3; i++) { -    marker->add(new Hill(i * 10, 0)); -  } -  track_points = NULL; -  fl_register_images(); +	int i; + +	pi_d = asin(1.0) * 2.0; +	deg2rad = pi_d / 180.0; +	img = NULL; +	pan = new Panorama(); +	cur_mountain = NULL; +	mb = NULL; +	marker = new Hills(); +	m1 = NULL; +	m2 = NULL; +	img_file = NULL; +	track_width = 200.0; +	show_hidden = 0; + +	for (i=0; i<=3; i++) { +		marker->add(new Hill(i * 10, 0)); +	} +	track_points = NULL; +	fl_register_images();  }  int  GipfelWidget::load_image(char *file) { -  Fl_Image *new_img; -  ImageMetaData *md; -  int ret; +	Fl_Image *new_img; +	ImageMetaData *md; +	int ret; + +	new_img = new Fl_JPEG_Image(file); + +	if (new_img == NULL) { +		return 1; +	} -  new_img = new Fl_JPEG_Image(file); -   -  if (new_img == NULL) { -    return 1; -  } +	if (img) { +		delete img; +	}  -  if (img) { -    delete img; -  }  +	img = new_img; -  img = new_img; -   -  if (img_file) { -    free(img_file); -  } +	if (img_file) { +		free(img_file); +	} -  img_file = strdup(file); +	img_file = strdup(file); -  h(img->h());   -  w(img->w());   +	h(img->h());   +	w(img->w());   -  mb = new Fl_Menu_Button(x(),y(),w()+x(),h()+y(),"&popup"); -  mb->type(Fl_Menu_Button::POPUP3); -  mb->box(FL_NO_BOX); -  mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); +	mb = new Fl_Menu_Button(x(),y(),w()+x(),h()+y(),"&popup"); +	mb->type(Fl_Menu_Button::POPUP3); +	mb->box(FL_NO_BOX); +	mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); -  // try to retrieve gipfel data from JPEG meta data -  md = new ImageMetaData(); -  md->load_image(file, img->w()); -  set_view_long(md->get_longitude()); -  set_view_lat(md->get_latitude()); -  set_view_height(md->get_height()); -  set_center_angle(md->get_direction()); -  set_nick_angle(md->get_nick()); -  set_tilt_angle(md->get_tilt()); -  set_projection((Projection::Projection_t) md->get_projection_type()); -  set_focal_length_35mm(md->get_focal_length_35mm()); +	// try to retrieve gipfel data from JPEG meta data +	md = new ImageMetaData(); +	md->load_image(file, img->w()); +	set_view_long(md->get_longitude()); +	set_view_lat(md->get_latitude()); +	set_view_height(md->get_height()); +	set_center_angle(md->get_direction()); +	set_nick_angle(md->get_nick()); +	set_tilt_angle(md->get_tilt()); +	set_projection((Projection::Projection_t) md->get_projection_type()); +	set_focal_length_35mm(md->get_focal_length_35mm()); -  delete md; +	delete md; -  return 0; +	return 0;  }  const char * @@ -115,557 +115,557 @@ GipfelWidget::get_image_filename() {  int  GipfelWidget::save_image(char *file) { -  ImageMetaData *md; -  int ret; +	ImageMetaData *md; +	int ret; -  if (img_file == NULL) { -    fprintf(stderr, "Nothing to save\n"); -    return 1; -  } +	if (img_file == NULL) { +		fprintf(stderr, "Nothing to save\n"); +		return 1; +	} -  md = new ImageMetaData(); +	md = new ImageMetaData(); -  md->set_longitude(get_view_long()); -  md->set_latitude(get_view_lat()); -  md->set_height(get_view_height()); -  md->set_direction(get_center_angle()); -  md->set_nick(get_nick_angle()); -  md->set_tilt(get_tilt_angle()); -  md->set_focal_length_35mm(get_focal_length_35mm()); -  md->set_projection_type((int) get_projection()); +	md->set_longitude(get_view_long()); +	md->set_latitude(get_view_lat()); +	md->set_height(get_view_height()); +	md->set_direction(get_center_angle()); +	md->set_nick(get_nick_angle()); +	md->set_tilt(get_tilt_angle()); +	md->set_focal_length_35mm(get_focal_length_35mm()); +	md->set_projection_type((int) get_projection()); -  ret = md->save_image(img_file, file); -  delete md; +	ret = md->save_image(img_file, file); +	delete md; -  return ret; +	return ret;  }  int  GipfelWidget::load_data(const char *file) { -  int r; +	int r; -  r = pan->load_data(file); -  set_labels(pan->get_visible_mountains()); +	r = pan->load_data(file); +	set_labels(pan->get_visible_mountains()); -  return r; +	return r;  }  int  GipfelWidget::load_track(const char *file) { -  if (track_points) { -    pan->remove_trackpoints(); -    track_points->clobber(); -    delete track_points; -  } +	if (track_points) { +		pan->remove_trackpoints(); +		track_points->clobber(); +		delete track_points; +	} -  track_points = new Hills(); +	track_points = new Hills(); -  if (track_points->load(file) != 0) { -    delete track_points; -    track_points = NULL; -    return 1; -  } +	if (track_points->load(file) != 0) { +		delete track_points; +		track_points = NULL; +		return 1; +	} + +	for (int i=0; i<track_points->get_num(); i++) { +		track_points->get(i)->flags |= Hill::TRACK_POINT; +	} -  for (int i=0; i<track_points->get_num(); i++) { -    track_points->get(i)->flags |= Hill::TRACK_POINT; -  } +	pan->add_hills(track_points);   +	redraw(); -  pan->add_hills(track_points);   -  redraw(); -   -  return 0; +	return 0;  }  int  GipfelWidget::set_viewpoint(const char *pos) { -  int r; +	int r; -  r = pan->set_viewpoint(pos); -  set_labels(pan->get_visible_mountains()); +	r = pan->set_viewpoint(pos); +	set_labels(pan->get_visible_mountains()); -  return r; +	return r;  }  void  GipfelWidget::set_viewpoint(const Hill *m) { -  pan->set_viewpoint(m); -  set_labels(pan->get_visible_mountains()); +	pan->set_viewpoint(m); +	set_labels(pan->get_visible_mountains());  }  static void  draw_flag(int x, int y, char *s) { -  Fl_Color c = fl_color(); +	Fl_Color c = fl_color(); -  fl_polygon(x, y - 10, x, y - 20, x + 10, y - 15); -  fl_yxline(x, y, y - 10); -   +	fl_polygon(x, y - 10, x, y - 20, x + 10, y - 15); +	fl_yxline(x, y, y - 10); -  if (s) { -    fl_color(FL_WHITE); -    fl_draw(s, x , y - 12); -    fl_color(c); -  }	 + +	if (s) { +		fl_color(FL_WHITE); +		fl_draw(s, x , y - 12); +		fl_color(c); +	}	  }  void   GipfelWidget::draw() { -  Hills *mnts; -  Hill *m; -  int center_x = w() / 2; -  int center_y = h() / 2; -  int i; -   -  if (img == NULL) { -    return; -  } - -  fl_push_clip(x(), y(), w(), h()); -  img->draw(x(),y(),w(),h(),0,0); -   -  /* hills */ -  fl_font(FL_HELVETICA, 10); -  mnts = pan->get_visible_mountains(); -  for (i=0; i<mnts->get_num(); i++) { -    m = mnts->get(i); - -    if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { -      continue; -    } - -    if (!show_hidden && (m->flags & Hill::HIDDEN)) { -      continue; -    } - -    if (m == m1) { -      fl_color(FL_RED); -      draw_flag(center_x + m->x + x(), center_y + m->y + y(), "1"); -    } else if (m == m2) { -      fl_color(FL_RED); -      draw_flag(center_x + m->x + x(), center_y + m->y + y(), "2"); -    } else if (m->flags & Hill::HIDDEN) { -      fl_color(FL_BLUE); -    } else { -      fl_color(FL_BLACK); -    } -     -    fl_xyline(center_x + m->x + x() - CROSS_SIZE, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE); -    fl_yxline(center_x + m->x + x(), center_y + m->y + m->label_y + y() - CROSS_SIZE, center_y + m->y + y() + CROSS_SIZE); - -    fl_draw(m->name,  -	    center_x + m->x + x(),  -	    center_y + m->y + m->label_y + y()); -  } - -  /* markers */ -  for (i=0; i<marker->get_num(); i++) { -    m = marker->get(i); - -    fl_color(FL_GREEN); -    fl_xyline(center_x + m->x + x() - CROSS_SIZE * 2, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE * 2); -    fl_yxline(center_x + m->x + x(), center_y + m->y + y() - CROSS_SIZE * 2, center_y + m->y + y() + CROSS_SIZE * 2); -    draw_flag(center_x + m->x + x(), center_y + m->y + y(), NULL); -  } - -  /* track */ -  if (track_points && track_points->get_num() > 0) { -    int last_x, last_y, last_initialized = 0; -     -    for (i=1; i<track_points->get_num(); i++) { -      if (!(track_points->get(i)->flags & Hill::VISIBLE)) { -        continue; -      } - -      if (track_points->get(i)->flags & Hill::HIDDEN) { -        fl_color(FL_BLUE); -      } else { -        fl_color(FL_RED); -      } - -      fl_line_style(FL_SOLID|FL_CAP_ROUND|FL_JOIN_ROUND, -                    get_rel_track_width(track_points->get(i))); -      if (last_initialized) { -        fl_begin_line(); -        fl_vertex(center_x + x() + last_x, center_y + y() + last_y); -        fl_vertex(center_x + x() + track_points->get(i)->x,  -                  center_y + y() + track_points->get(i)->y); -        fl_end_line(); -      } - -      last_x = track_points->get(i)->x; -      last_y = track_points->get(i)->y; -      last_initialized++; -    } -    fl_line_style(0); -  } - -  fl_pop_clip(); +	Hills *mnts; +	Hill *m; +	int center_x = w() / 2; +	int center_y = h() / 2; +	int i; + +	if (img == NULL) { +		return; +	} + +	fl_push_clip(x(), y(), w(), h()); +	img->draw(x(),y(),w(),h(),0,0); + +	/* hills */ +	fl_font(FL_HELVETICA, 10); +	mnts = pan->get_visible_mountains(); +	for (i=0; i<mnts->get_num(); i++) { +		m = mnts->get(i); + +		if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { +			continue; +		} + +		if (!show_hidden && (m->flags & Hill::HIDDEN)) { +			continue; +		} + +		if (m == m1) { +			fl_color(FL_RED); +			draw_flag(center_x + m->x + x(), center_y + m->y + y(), "1"); +		} else if (m == m2) { +			fl_color(FL_RED); +			draw_flag(center_x + m->x + x(), center_y + m->y + y(), "2"); +		} else if (m->flags & Hill::HIDDEN) { +			fl_color(FL_BLUE); +		} else { +			fl_color(FL_BLACK); +		} + +		fl_xyline(center_x + m->x + x() - CROSS_SIZE, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE); +		fl_yxline(center_x + m->x + x(), center_y + m->y + m->label_y + y() - CROSS_SIZE, center_y + m->y + y() + CROSS_SIZE); + +		fl_draw(m->name,  +			center_x + m->x + x(),  +			center_y + m->y + m->label_y + y()); +	} + +	/* markers */ +	for (i=0; i<marker->get_num(); i++) { +		m = marker->get(i); + +		fl_color(FL_GREEN); +		fl_xyline(center_x + m->x + x() - CROSS_SIZE * 2, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE * 2); +		fl_yxline(center_x + m->x + x(), center_y + m->y + y() - CROSS_SIZE * 2, center_y + m->y + y() + CROSS_SIZE * 2); +		draw_flag(center_x + m->x + x(), center_y + m->y + y(), NULL); +	} + +	/* track */ +	if (track_points && track_points->get_num() > 0) { +		int last_x, last_y, last_initialized = 0; + +		for (i=1; i<track_points->get_num(); i++) { +			if (!(track_points->get(i)->flags & Hill::VISIBLE)) { +				continue; +			} + +			if (track_points->get(i)->flags & Hill::HIDDEN) { +				fl_color(FL_BLUE); +			} else { +				fl_color(FL_RED); +			} + +			fl_line_style(FL_SOLID|FL_CAP_ROUND|FL_JOIN_ROUND, +				get_rel_track_width(track_points->get(i))); +			if (last_initialized) { +				fl_begin_line(); +				fl_vertex(center_x + x() + last_x, center_y + y() + last_y); +				fl_vertex(center_x + x() + track_points->get(i)->x,  +					center_y + y() + track_points->get(i)->y); +				fl_end_line(); +			} + +			last_x = track_points->get(i)->x; +			last_y = track_points->get(i)->y; +			last_initialized++; +		} +		fl_line_style(0); +	} + +	fl_pop_clip();  }  static int   overlap(int m1, int n1, int m2, int n2) { -  return m1 <= n2 && n1 >= m2;  +	return m1 <= n2 && n1 >= m2;   }  void   GipfelWidget::set_labels(Hills *v) { -  int i, j, width, height; -  Hill *m, *n; - -  fl_font(FL_HELVETICA, 10); -  height = fl_height(); - -  for (i=0; i<v->get_num(); i++) { -    m = v->get(i); -     -    if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { -      continue; -    } - -    if (!show_hidden && (m->flags & Hill::HIDDEN)) { -      continue; -    } - -    width = (int) ceilf(fl_width(m->name)); -    m->label_x = width; -    m->label_y = 0; -    for (j=0; j < i; j++) { -      n = v->get(j); -       -      if (n->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { -	continue; -      } - -      if (!show_hidden && (n->flags & Hill::HIDDEN)) { -        continue; -      } - -      // Check for overlapping labels and -      // overlaps between labels and peak markers -      if ((overlap(m->x, m->x + m->label_x, n->x, n->x + n->label_x) && -	   overlap(m->y + m->label_y - height, m->y + m->label_y, n->y + n->label_y - height, n->y + n->label_y)) || -	  (overlap(m->x, m->x + m->label_x, n->x - 2, n->x + 2) && -	   overlap(m->y + m->label_y - height, m->y + m->label_y, n->y - 2, n->y + 2))) { -	m->label_y = n->y + n->label_y - m->y - height - 1; -      } -    } -  } +	int i, j, width, height; +	Hill *m, *n; + +	fl_font(FL_HELVETICA, 10); +	height = fl_height(); + +	for (i=0; i<v->get_num(); i++) { +		m = v->get(i); + +		if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { +			continue; +		} + +		if (!show_hidden && (m->flags & Hill::HIDDEN)) { +			continue; +		} + +		width = (int) ceilf(fl_width(m->name)); +		m->label_x = width; +		m->label_y = 0; +		for (j=0; j < i; j++) { +			n = v->get(j); + +			if (n->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { +				continue; +			} + +			if (!show_hidden && (n->flags & Hill::HIDDEN)) { +				continue; +			} + +			// Check for overlapping labels and +			// overlaps between labels and peak markers +			if ((overlap(m->x, m->x + m->label_x, n->x, n->x + n->label_x) && +					overlap(m->y + m->label_y - height, m->y + m->label_y, n->y + n->label_y - height, n->y + n->label_y)) || +				(overlap(m->x, m->x + m->label_x, n->x - 2, n->x + 2) && +				 overlap(m->y + m->label_y - height, m->y + m->label_y, n->y - 2, n->y + 2))) { +				m->label_y = n->y + n->label_y - m->y - height - 1; +			} +		} +	}  }  int  GipfelWidget::set_cur_mountain(int m_x, int m_y) { -  Hills *mnts = pan->get_visible_mountains(); -  Hill *m; -  int center_x = w() / 2; -  int center_y = h() / 2; -  int i; - -  for (i=0; i<mnts->get_num(); i++) { -    m = mnts->get(i);  -    if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { -      continue; -    } - -    if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && -	m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { -      cur_mountain = m; -      if (m1 != NULL && m2 != NULL) { -	fprintf(stderr, "Resetting m1 and m2\n"); -	m1 = NULL; -	m2 = NULL; -      } - -      if (m1 == NULL) { -	m1 = cur_mountain; -	fprintf(stderr, "m1 = %s\n", m1->name); -      } else if (m2 == NULL) { -	m2 = cur_mountain; -	fprintf(stderr, "m2 = %s\n", m2->name); -      } - -      redraw(); -      return 0; -    } -  } +	Hills *mnts = pan->get_visible_mountains(); +	Hill *m; +	int center_x = w() / 2; +	int center_y = h() / 2; +	int i; + +	for (i=0; i<mnts->get_num(); i++) { +		m = mnts->get(i);  +		if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { +			continue; +		} + +		if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && +			m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { +			cur_mountain = m; +			if (m1 != NULL && m2 != NULL) { +				fprintf(stderr, "Resetting m1 and m2\n"); +				m1 = NULL; +				m2 = NULL; +			} + +			if (m1 == NULL) { +				m1 = cur_mountain; +				fprintf(stderr, "m1 = %s\n", m1->name); +			} else if (m2 == NULL) { +				m2 = cur_mountain; +				fprintf(stderr, "m2 = %s\n", m2->name); +			} + +			redraw(); +			return 0; +		} +	} -  for (i=0; i<marker->get_num(); i++) { -    m = marker->get(i); +	for (i=0; i<marker->get_num(); i++) { +		m = marker->get(i); -    if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && -	m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { -      cur_mountain = m; -      redraw(); -      return 0; -    } -  } +		if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && +			m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { +			cur_mountain = m; +			redraw(); +			return 0; +		} +	} -  cur_mountain = NULL; -  redraw(); -  return 1; +	cur_mountain = NULL; +	redraw(); +	return 1;  }  int  GipfelWidget::set_mountain(int m_x, int m_y) { -  int old_x, old_y, old_label_y; -  int center_x = w() / 2; -  int center_y = h() / 2; - -  if (cur_mountain == NULL) { -    return 1; -  } - -  old_x = cur_mountain->x; -  old_y = cur_mountain->y; -  old_label_y = cur_mountain->label_y; - -  cur_mountain->x = m_x - center_x; -  cur_mountain->y = m_y - center_y; -  cur_mountain->label_y = 0; -  -  damage(4, center_x + x() + old_x - 2*CROSS_SIZE - 1, -            center_y + y() + old_y + old_label_y - 2*CROSS_SIZE - 20, -            MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, -            MAX(20, old_label_y) + 22 );  -  damage(4, center_x + x() + cur_mountain->x - 2*CROSS_SIZE - 1, -            center_y + y() + cur_mountain->y + cur_mountain->label_y - 2*CROSS_SIZE - 20, -            MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, -            MAX(20, cur_mountain->label_y) + 22 );  -  -  return 0; +	int old_x, old_y, old_label_y; +	int center_x = w() / 2; +	int center_y = h() / 2; + +	if (cur_mountain == NULL) { +		return 1; +	} + +	old_x = cur_mountain->x; +	old_y = cur_mountain->y; +	old_label_y = cur_mountain->label_y; + +	cur_mountain->x = m_x - center_x; +	cur_mountain->y = m_y - center_y; +	cur_mountain->label_y = 0; + +	damage(4, center_x + x() + old_x - 2*CROSS_SIZE - 1, +		center_y + y() + old_y + old_label_y - 2*CROSS_SIZE - 20, +		MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, +		MAX(20, old_label_y) + 22 );  +	damage(4, center_x + x() + cur_mountain->x - 2*CROSS_SIZE - 1, +		center_y + y() + cur_mountain->y + cur_mountain->label_y - 2*CROSS_SIZE - 20, +		MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, +		MAX(20, cur_mountain->label_y) + 22 );  + +	return 0;  }  void  GipfelWidget::set_center_angle(double a) { -  pan->set_center_angle(a); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_center_angle(a); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  void  GipfelWidget::set_nick_angle(double a) { -  pan->set_nick_angle(a); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_nick_angle(a); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  void  GipfelWidget::set_tilt_angle(double a) { -  pan->set_tilt_angle(a); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_tilt_angle(a); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  void  GipfelWidget::set_focal_length_35mm(double s) { -  pan->set_scale(s * (double) img->w() / 35.0); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_scale(s * (double) img->w() / 35.0); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  void  GipfelWidget::set_projection(Projection::Projection_t p) { -  pan->set_projection(p); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_projection(p); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  Projection::Projection_t  GipfelWidget::get_projection() { -  return pan->get_projection(); +	return pan->get_projection();  }  double  GipfelWidget::get_center_angle() { -  return pan->get_center_angle(); +	return pan->get_center_angle();  }  double  GipfelWidget::get_nick_angle() { -  return pan->get_nick_angle(); +	return pan->get_nick_angle();  }  double  GipfelWidget::get_tilt_angle() { -  return pan->get_tilt_angle(); +	return pan->get_tilt_angle();  }  double  GipfelWidget::get_focal_length_35mm() { -  return pan->get_scale() * 35.0 / (double) img->w(); +	return pan->get_scale() * 35.0 / (double) img->w();  }  double  GipfelWidget::get_height_dist_ratio() { -  return pan->get_height_dist_ratio(); +	return pan->get_height_dist_ratio();  }  const char *  GipfelWidget::get_viewpoint() { -  return pan->get_viewpoint(); +	return pan->get_viewpoint();  }  double  GipfelWidget::get_view_lat() { -  return pan->get_view_lat(); +	return pan->get_view_lat();  }  double  GipfelWidget::get_view_long() { -  return pan->get_view_long(); +	return pan->get_view_long();  }  double  GipfelWidget::get_view_height() { -  return pan->get_view_height(); +	return pan->get_view_height();  }  void   GipfelWidget::center() { -  Hill *m = choose_hill(pan->get_close_mountains(), "Center Peak"); -  if (m) { -    set_center_angle(m->alph / deg2rad); -    if (!m1 || (m1 && m2)) { -      m1 = m; -    } else { -      m2 = m; -    } -  } +	Hill *m = choose_hill(pan->get_close_mountains(), "Center Peak"); +	if (m) { +		set_center_angle(m->alph / deg2rad); +		if (!m1 || (m1 && m2)) { +			m1 = m; +		} else { +			m2 = m; +		} +	}  }  static void  center_cb(Fl_Widget *o, void *f) { -  ((GipfelWidget*)f)->center(); +	((GipfelWidget*)f)->center();  }  void  GipfelWidget::set_height_dist_ratio(double r) { -  pan->set_height_dist_ratio(r); -  set_labels(pan->get_visible_mountains()); -   -  redraw(); +	pan->set_height_dist_ratio(r); +	set_labels(pan->get_visible_mountains()); + +	redraw();  }  void  GipfelWidget::set_hide_value(double h) { -  pan->set_hide_value(h); -  set_labels(pan->get_visible_mountains()); -   -  redraw(); +	pan->set_hide_value(h); +	set_labels(pan->get_visible_mountains()); + +	redraw();  }  void  GipfelWidget::set_show_hidden(int h) { -  show_hidden = h; -  set_labels(pan->get_visible_mountains()); -   -  redraw(); +	show_hidden = h; +	set_labels(pan->get_visible_mountains()); + +	redraw();  }  void  GipfelWidget::set_view_lat(double v) { -  pan->set_view_lat(v); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_view_lat(v); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  void  GipfelWidget::set_view_long(double v) { -  pan->set_view_long(v); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_view_long(v); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  void  GipfelWidget::set_view_height(double v) { -  pan->set_view_height(v); -  set_labels(pan->get_visible_mountains()); -  redraw(); +	pan->set_view_height(v); +	set_labels(pan->get_visible_mountains()); +	redraw();  }  Hills*  GipfelWidget::get_mountains() { -  return pan->get_mountains(); +	return pan->get_mountains();  }  int  GipfelWidget::comp_params() { -  if (m1 == NULL || m2 == NULL) { -    fprintf(stderr, "Position m1 and m2 first.\n"); -    return 1; -  } -  fl_cursor(FL_CURSOR_WAIT); -  pan->comp_params(m1, m2); -  set_labels(pan->get_visible_mountains()); -  redraw(); -  fl_cursor(FL_CURSOR_DEFAULT); +	if (m1 == NULL || m2 == NULL) { +		fprintf(stderr, "Position m1 and m2 first.\n"); +		return 1; +	} +	fl_cursor(FL_CURSOR_WAIT); +	pan->comp_params(m1, m2); +	set_labels(pan->get_visible_mountains()); +	redraw(); +	fl_cursor(FL_CURSOR_DEFAULT);  }  int  GipfelWidget::guess() { -  if (m1 == NULL) { -    fprintf(stderr, "Position m1 first.\n"); -    return 1; -  } -  fl_cursor(FL_CURSOR_WAIT); -  pan->guess(marker, m1); -  set_labels(pan->get_visible_mountains()); -  redraw(); -  fl_cursor(FL_CURSOR_DEFAULT); +	if (m1 == NULL) { +		fprintf(stderr, "Position m1 first.\n"); +		return 1; +	} +	fl_cursor(FL_CURSOR_WAIT); +	pan->guess(marker, m1); +	set_labels(pan->get_visible_mountains()); +	redraw(); +	fl_cursor(FL_CURSOR_DEFAULT);  }  int  GipfelWidget::update() { -  redraw(); -  Fl::wait(1.0); +	redraw(); +	Fl::wait(1.0);  }  int  GipfelWidget::get_rel_track_width(Hill *m) { -  double dist = pan->get_real_distance(m); +	double dist = pan->get_real_distance(m); -  return MAX((pan->get_scale() * track_width) / (dist * 10.0), 1.0); +	return MAX((pan->get_scale() * track_width) / (dist * 10.0), 1.0);  }  void  GipfelWidget::set_track_width(double w) { -  track_width = w; -  redraw(); +	track_width = w; +	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(); -      set_cur_mountain(mark_x, mark_y); - -      Fl::focus(this); -      return 1; -    } -    break; -  case FL_DRAG: -    set_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; +	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(); +				set_cur_mountain(mark_x, mark_y); + +				Fl::focus(this); +				return 1; +			} +			break; +		case FL_DRAG: +			set_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;  }  int  GipfelWidget::get_pixel(double a_view, double a_nick, -                        char *r, char *g, char *b) { +	char *r, char *g, char *b) {  	double px, py; @@ -678,7 +678,7 @@ GipfelWidget::get_pixel(double a_view, double a_nick,  	}  	return get_pixel_nearest(img, px + ((double) img->w()) / 2.0, -				py + ((double) img->h()) / 2.0, r, g, b); +		py + ((double) img->h()) / 2.0, r, g, b);  }  int @@ -694,40 +694,40 @@ GipfelWidget::get_pixel_nearest(Fl_Image *img, double x, double y,  int  GipfelWidget::get_pixel(Fl_Image *img, int x, int y, -                     char *r, char *g, char *b) { -    if ( img->d() == 0 ) { -        return 1; -    } - -    if (x < 0 || x >=img->w() || y < 0 || y >= img->h()) { -        return 1; -    } -    long index = (y * img->w() * img->d()) + (x * img->d()); // X/Y -> buf index   -    switch ( img->count() ) { -        case 1: {                                            // bitmap -                const char *buf = img->data()[0]; -                switch ( img->d() ) { -                    case 1: {                                    // 8bit -                            *r = *g = *b = *(buf+index); -                            break; -                        } -                    case 3:                                      // 24bit -                        *r = *(buf+index+0); -                        *g = *(buf+index+1); -                        *b = *(buf+index+2); -                        break; -                    default:                                     // ?? -                        printf("Not supported: chans=%d\n", img->d()); -                        return 1; -                    } -                break; -            } -        default:                                             // ?? pixmap, bit vals -            printf("Not supported: count=%d\n", img->count()); -            return 1; -    } - -    return 0; +	char *r, char *g, char *b) { +	if ( img->d() == 0 ) { +		return 1; +	} -} +	if (x < 0 || x >=img->w() || y < 0 || y >= img->h()) { +		return 1; +	} +	long index = (y * img->w() * img->d()) + (x * img->d()); // X/Y -> buf index   +	switch (img->count()) { +		case 1: +		{                                            // bitmap +			const char *buf = img->data()[0]; +			switch (img->d()) +			{ +				case 1: +					*r = *g = *b = *(buf+index); +					break; +				case 3:                              // 24bit +					*r = *(buf+index+0); +					*g = *(buf+index+1); +					*b = *(buf+index+2); +					break; +				default:                             // ?? +					printf("Not supported: chans=%d\n", img->d()); +					return 1; +			} +			break; +		} +		default:                                             // ?? pixmap, bit vals +		printf("Not supported: count=%d\n", img->count()); +		return 1; +	} + +	return 0; +} @@ -11,69 +11,69 @@  class Hill;  class Hill { - private: - - public: -  typedef enum { -    DUPLICATE   = 0x01, -    TRACK_POINT = 0x02, -    VISIBLE     = 0x04, -    HIDDEN      = 0x08 -  } flags_t; - -  double phi, lam; -  double height; -  double alph; -  double a_view; -  double a_nick; -  double dist; -  int x, y; -  int label_x, label_y; -  char *name; -  int flags; -  -  Hill(const char *n, double p, double l, double h); - -  Hill(const Hill& h); - -  Hill(int x_tmp, int y_tmp); - -  ~Hill();   +	private: + +	public: +		typedef enum { +			DUPLICATE   = 0x01, +			TRACK_POINT = 0x02, +			VISIBLE     = 0x04, +			HIDDEN      = 0x08 +		} flags_t; + +		double phi, lam; +		double height; +		double alph; +		double a_view; +		double a_nick; +		double dist; +		int x, y; +		int label_x, label_y; +		char *name; +		int flags; + +		Hill(const char *n, double p, double l, double h); + +		Hill(const Hill& h); + +		Hill(int x_tmp, int y_tmp); + +		~Hill();    };  class Hills { - private: -  int num, cap; -  Hill **m; +	private: +		int num, cap; +		Hill **m; - public: -  Hills(); +	public: +		Hills(); -  Hills(const Hills *h); +		Hills(const Hills *h); -  ~Hills(); +		~Hills(); -  int load(const char *file); +		int load(const char *file); -  void mark_duplicates(double dist); +		void mark_duplicates(double dist); -  void add(Hill *m); +		void add(Hill *m); -  void add(Hills *h); +		void add(Hills *h); -  void sort_phi(); +		void sort_phi(); -  void sort_name(); +		void sort_name(); -  void sort(); -   -  void clear(); +		void sort(); -  void clobber(); +		void clear(); -  int get_num(); -   -  Hill *get(int n); +		void clobber(); + +		int get_num(); + +		Hill *get(int n);  };  #endif diff --git a/src/Hill.cxx b/src/Hill.cxx index 14b8f81..d5ce1f6 100644 --- a/src/Hill.cxx +++ b/src/Hill.cxx @@ -14,284 +14,284 @@  static double pi_d, deg2rad;  Hill::Hill(const char *n, double p, double l, double h) { -  name = strdup(n); -  phi = p; -  lam = l; -  height = h; -  alph = 0.0; -  x = 0; -  y = 0; -  flags = 0; +	name = strdup(n); +	phi = p; +	lam = l; +	height = h; +	alph = 0.0; +	x = 0; +	y = 0; +	flags = 0;  }  Hill::Hill(const Hill& h) { -  name = strdup(h.name); -  phi = h.phi; -  lam = h.lam; -  height = h.height; -  alph = h.alph; -  a_view = h.a_view; -  a_view = h.a_view; -  dist = h.dist; -  x = h.x; -  y = h.y; -  label_x = h.label_x; -  label_y = h.label_y; -  flags = h.flags; +	name = strdup(h.name); +	phi = h.phi; +	lam = h.lam; +	height = h.height; +	alph = h.alph; +	a_view = h.a_view; +	a_view = h.a_view; +	dist = h.dist; +	x = h.x; +	y = h.y; +	label_x = h.label_x; +	label_y = h.label_y; +	flags = h.flags;  }  Hill::Hill(int x_tmp, int y_tmp) { -  name = NULL; -  phi = 0.0; -  lam = 0.0; -  height = 0.0; -  alph = 0.0; -  x = x_tmp; -  y = y_tmp; +	name = NULL; +	phi = 0.0; +	lam = 0.0; +	height = 0.0; +	alph = 0.0; +	x = x_tmp; +	y = y_tmp;  }  Hill::~Hill() { -  if (name) { -    free(name); -  } +	if (name) { +		free(name); +	}  }  Hills::Hills() { -  num = 0; -  cap = 100; -  m = (Hill **) malloc(cap * sizeof(Hill *)); +	num = 0; +	cap = 100; +	m = (Hill **) malloc(cap * sizeof(Hill *)); -  pi_d = asin(1.0) * 2.0; -  deg2rad = pi_d / 180.0; +	pi_d = asin(1.0) * 2.0; +	deg2rad = pi_d / 180.0;  }  Hills::Hills(const Hills *h) { -  num = h->num; -  cap = h->cap; -  m = (Hill **) malloc(cap * sizeof(Hill *)); -  memcpy(m, h->m, cap * sizeof(Hill *)); +	num = h->num; +	cap = h->cap; +	m = (Hill **) malloc(cap * sizeof(Hill *)); +	memcpy(m, h->m, cap * sizeof(Hill *)); -  pi_d = asin(1.0) * 2.0; -  deg2rad = pi_d / 180.0; +	pi_d = asin(1.0) * 2.0; +	deg2rad = pi_d / 180.0;  }  int  Hills::load(const char *file) { -  FILE *fp; -  char buf[4000]; -  char *vals[10]; -  char **ap, *bp; -  double phi, lam, height; -  Hill *m; -  int n; - -  fp = fopen(file, "r"); -  if (!fp) { -    perror("fopen"); -    return 1; -  } -   -  while (fgets(buf, sizeof(buf), fp)) { -    bp = buf; -    memset(vals, 0, sizeof(vals)); -    n = 0; -    for (ap = vals; (*ap = strsep(&bp, ",")) != NULL;) { -      n++; -      if (++ap >= &vals[10]) { -	break; -      } -    } - -    // standard format including name and description -    if (n == 6 && vals[1] && vals [3] && vals[4] && vals[5]) { -      phi = atof(vals[3]) * deg2rad; -      lam = atof(vals[4]) * deg2rad; -      height = atof(vals[5]); - -      m = new Hill(vals[1], phi, lam, height); - -      add(m); -    // track point format -    } else if (n == 3 && vals[0] && vals[1] && vals[2]) { -      phi = atof(vals[0]) * deg2rad; -      lam = atof(vals[1]) * deg2rad; -      height = atof(vals[2]); - -      m = new Hill("", phi, lam, height); - -      add(m); -    } -  } - -  fclose(fp); - -  return 0; +	FILE *fp; +	char buf[4000]; +	char *vals[10]; +	char **ap, *bp; +	double phi, lam, height; +	Hill *m; +	int n; + +	fp = fopen(file, "r"); +	if (!fp) { +		perror("fopen"); +		return 1; +	} + +	while (fgets(buf, sizeof(buf), fp)) { +		bp = buf; +		memset(vals, 0, sizeof(vals)); +		n = 0; +		for (ap = vals; (*ap = strsep(&bp, ",")) != NULL;) { +			n++; +			if (++ap >= &vals[10]) { +				break; +			} +		} + +		// standard format including name and description +		if (n == 6 && vals[1] && vals [3] && vals[4] && vals[5]) { +			phi = atof(vals[3]) * deg2rad; +			lam = atof(vals[4]) * deg2rad; +			height = atof(vals[5]); + +			m = new Hill(vals[1], phi, lam, height); + +			add(m); +			// track point format +		} else if (n == 3 && vals[0] && vals[1] && vals[2]) { +			phi = atof(vals[0]) * deg2rad; +			lam = atof(vals[1]) * deg2rad; +			height = atof(vals[2]); + +			m = new Hill("", phi, lam, height); + +			add(m); +		} +	} + +	fclose(fp); + +	return 0;  }  void Hills::mark_duplicates(double dist) { -  Hill *m, *n; -  int i, j; -   -  sort_phi(); - -  for(i=0; i<get_num();i++) { -    m = get(i); -     -    if (m->flags & Hill::TRACK_POINT) { -      continue; -    } - -    if (m) { -      j = i + 1; -      n = get(j); -      while (n && fabs(n->phi - m->phi) <= dist) { -        if (! n->flags & Hill::DUPLICATE) { -	  if (fabs(n->lam - m->lam) <= dist &&  -              fabs(n->height - m->height) <= 50.0 ) { -	    n->flags |= Hill::DUPLICATE; -	  } -        } -	j = j + 1; -	n = get(j); -      } -    } -  } +	Hill *m, *n; +	int i, j; + +	sort_phi(); + +	for(i=0; i<get_num();i++) { +		m = get(i); + +		if (m->flags & Hill::TRACK_POINT) { +			continue; +		} + +		if (m) { +			j = i + 1; +			n = get(j); +			while (n && fabs(n->phi - m->phi) <= dist) { +				if (! n->flags & Hill::DUPLICATE) { +					if (fabs(n->lam - m->lam) <= dist &&  +						fabs(n->height - m->height) <= 50.0 ) { +						n->flags |= Hill::DUPLICATE; +					} +				} +				j = j + 1; +				n = get(j); +			} +		} +	}  }  Hills::~Hills() { -  if (m) { -    free(m); -  } +	if (m) { +		free(m); +	}  }  void  Hills::add(Hill *m1) { -  if (num >= cap) { -    cap = cap?cap * 2:100; -    m = (Hill **) realloc(m, cap * sizeof(Hill *)); -  } +	if (num >= cap) { +		cap = cap?cap * 2:100; +		m = (Hill **) realloc(m, cap * sizeof(Hill *)); +	} -  m[num++] = m1; +	m[num++] = m1;  }  void  Hills::add(Hills *h) { -  for(int i=0; i<h->get_num(); i++) { -    add(h->get(i)); -  } +	for(int i=0; i<h->get_num(); i++) { +		add(h->get(i)); +	}  }  static int  comp_mountains(const void *n1, const void *n2) { -  Hill *m1 = *(Hill **)n1; -  Hill *m2 = *(Hill **)n2; -   -  if (m1 && m2) { -    if (m1->alph < m2->alph) { -      return 1; -    } else if (m1->alph > m2->alph) { -      return -1; -    } else { -      return 0; -    } -  } else { -    return 0; -  }   +	Hill *m1 = *(Hill **)n1; +	Hill *m2 = *(Hill **)n2; + +	if (m1 && m2) { +		if (m1->alph < m2->alph) { +			return 1; +		} else if (m1->alph > m2->alph) { +			return -1; +		} else { +			return 0; +		} +	} else { +		return 0; +	}    }  static int  comp_mountains_phi(const void *n1, const void *n2) { -  Hill *m1 = *(Hill **)n1; -  Hill *m2 = *(Hill **)n2; -   -  if (m1 && m2) { -    if (m1->phi < m2->phi) { -      return 1; -    } else if (m1->phi > m2->phi) { -      return -1; -    } else { -      return 0; -    } -  } else { -    return 0; -  }   +	Hill *m1 = *(Hill **)n1; +	Hill *m2 = *(Hill **)n2; + +	if (m1 && m2) { +		if (m1->phi < m2->phi) { +			return 1; +		} else if (m1->phi > m2->phi) { +			return -1; +		} else { +			return 0; +		} +	} else { +		return 0; +	}    }  static int  comp_mountains_name(const void *n1, const void *n2) { -  Hill *m1 = *(Hill **)n1; -  Hill *m2 = *(Hill **)n2; -   -  if (m1 && m2) { -    return strcasecmp(m1->name, m2->name); -  } else { -    return 0; -  }   +	Hill *m1 = *(Hill **)n1; +	Hill *m2 = *(Hill **)n2; + +	if (m1 && m2) { +		return strcasecmp(m1->name, m2->name); +	} else { +		return 0; +	}    }  void  Hills::sort() { -  if (!m) { -    return; -  } +	if (!m) { +		return; +	} -  qsort(m, num, sizeof(Hill *), comp_mountains); +	qsort(m, num, sizeof(Hill *), comp_mountains);  }  void  Hills::sort_phi() { -  if (!m) { -    return; -  } +	if (!m) { +		return; +	} -  qsort(m, num, sizeof(Hill *), comp_mountains_phi); +	qsort(m, num, sizeof(Hill *), comp_mountains_phi);  }  void  Hills::sort_name() { -  if (!m) { -    return; -  } +	if (!m) { +		return; +	} -  qsort(m, num, sizeof(Hill *), comp_mountains_name); +	qsort(m, num, sizeof(Hill *), comp_mountains_name);  }  void  Hills::clear() { -  if (m) { -    free(m); -    m = NULL; -  } -  cap = 0; -  num = 0; +	if (m) { +		free(m); +		m = NULL; +	} +	cap = 0; +	num = 0;  }  void  Hills::clobber() { -  int i; -   -  for(i=0; i<get_num();i++) { -    if (get(i)) { -      delete(get(i)); -    } -  } - -  clear(); +	int i; + +	for(i=0; i<get_num();i++) { +		if (get(i)) { +			delete(get(i)); +		} +	} + +	clear();  }  int  Hills::get_num() { -  return num; +	return num;  }  Hill *  Hills::get(int n) { -  if (n < 0 || n >= num) { -    return NULL; -  } else { -    return m[n]; -  } +	if (n < 0 || n >= num) { +		return NULL; +	} else { +		return m[n]; +	}  } diff --git a/src/Panorama.H b/src/Panorama.H index 80a8f69..81cdf8e 100644 --- a/src/Panorama.H +++ b/src/Panorama.H @@ -14,122 +14,122 @@  class Panorama { - private: -  double view_phi, view_lam, view_height; -  char *view_name; -  double height_dist_ratio; -  double view_angle; -  double hide_value; -  Hills *mountains; -  Hills *close_mountains; -  Hills *visible_mountains; -  ViewParams parms; -  Projection::Projection *proj; -  Projection::Projection_t projection_type; -  -  Hill * get_pos(const char *name); +	private: +		double view_phi, view_lam, view_height; +		char *view_name; +		double height_dist_ratio; +		double view_angle; +		double hide_value; +		Hills *mountains; +		Hills *close_mountains; +		Hills *visible_mountains; +		ViewParams parms; +		Projection::Projection *proj; +		Projection::Projection_t projection_type; -  void update_angles(); +		Hill * get_pos(const char *name); -  void update_coordinates(); +		void update_angles(); -  void update_close_mountains(); +		void update_coordinates(); -  void update_visible_mountains(); -  -  void mark_hidden(Hills *hills); +		void update_close_mountains(); -  double distance(double phi, double lam); +		void update_visible_mountains(); -  double sin_alpha(double lam, double phi, double c); +		void mark_hidden(Hills *hills); -  double cos_alpha(double phi, double c); +		double distance(double phi, double lam); -  double alpha(double phi, double lam); +		double sin_alpha(double lam, double phi, double c); -  double nick(double dist, double height); -   -  double comp_center_angle(double alph_a, double alph_b, double d1, double d2); +		double cos_alpha(double phi, double c); -  double comp_scale(double alph_a, double alph_b, double d1, double d2); +		double alpha(double phi, double lam); -  int get_matrix(double m[]); +		double nick(double dist, double height); -  int optimize(Hill *m1, Hill *m2); +		double comp_center_angle(double alph_a, double alph_b, double d1, double d2); -  double get_value(Hills *p); +		double comp_scale(double alph_a, double alph_b, double d1, double d2); -  double pi_d, deg2rad; +		int get_matrix(double m[]); - public: -  Panorama(); +		int optimize(Hill *m1, Hill *m2); -  ~Panorama(); -   -  int load_data(const char *name); +		double get_value(Hills *p); -  void add_hills(Hills *h); +		double pi_d, deg2rad; -  void remove_trackpoints(); +	public: +		Panorama(); -  int set_viewpoint(const char *pos);   +		~Panorama(); -  void set_viewpoint(const Hill *m);   +		int load_data(const char *name); -  void set_height_dist_ratio(double r); +		void add_hills(Hills *h); -  void set_hide_value(double h); +		void remove_trackpoints(); -  Hills * get_mountains(); +		int set_viewpoint(const char *pos);   -  Hills * get_close_mountains(); +		void set_viewpoint(const Hill *m);   -  Hills * get_visible_mountains(); +		void set_height_dist_ratio(double r); -  void set_center_angle(double a); +		void set_hide_value(double h); -  void set_nick_angle(double a); +		Hills * get_mountains(); -  void set_tilt_angle(double a); +		Hills * get_close_mountains(); -  void set_scale(double s); +		Hills * get_visible_mountains(); -  void set_view_lat(double v); +		void set_center_angle(double a); -  void set_view_long(double v); +		void set_nick_angle(double a); -  void set_view_height(double v); +		void set_tilt_angle(double a); -  const char * get_viewpoint();   +		void set_scale(double s); -  double get_center_angle(); +		void set_view_lat(double v); -  double get_nick_angle(); +		void set_view_long(double v); -  double get_tilt_angle(); +		void set_view_height(double v); -  double get_scale(); +		const char * get_viewpoint();   -  double get_height_dist_ratio(); -   -  double get_view_lat(); +		double get_center_angle(); -  double get_view_long(); +		double get_nick_angle(); -  double get_view_height(); +		double get_tilt_angle(); -  double get_earth_radius(Hill *m); +		double get_scale(); -  double get_real_distance(Hill *m); +		double get_height_dist_ratio(); -  int comp_params(Hill *m1, Hill *m2); +		double get_view_lat(); -  int guess(Hills *p1, Hill *m1); +		double get_view_long(); -  Projection::Projection_t get_projection(); +		double get_view_height(); -  void set_projection(Projection::Projection_t p); +		double get_earth_radius(Hill *m); -  int get_coordinates(double a_view, double a_nick, double *x, double *y); +		double get_real_distance(Hill *m); + +		int comp_params(Hill *m1, Hill *m2); + +		int guess(Hills *p1, Hill *m1); + +		Projection::Projection_t get_projection(); + +		void set_projection(Projection::Projection_t p); + +		int get_coordinates(double a_view, double a_nick, double *x, double *y);  };  #endif diff --git a/src/Panorama.cxx b/src/Panorama.cxx index 4674c47..4ecf2f4 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -16,580 +16,580 @@  #define EARTH_RADIUS 6371010.0  Panorama::Panorama() { -  mountains = new Hills(); -  close_mountains = new Hills(); -  visible_mountains = new Hills(); -  height_dist_ratio = 0.07; -  hide_value = 1.2; -  pi_d = asin(1.0) * 2.0; -  deg2rad = pi_d / 180.0; -  parms.a_center = 0.0; -  parms.a_nick = 0.0; -  parms.a_tilt = 0.0; -  parms.scale = 3500.0; -  view_name = NULL; -  view_phi = 0.0; -  view_lam = 0.0; -  view_height = 0.0; -  proj = NULL; -  set_projection(Projection::TANGENTIAL); +	mountains = new Hills(); +	close_mountains = new Hills(); +	visible_mountains = new Hills(); +	height_dist_ratio = 0.07; +	hide_value = 1.2; +	pi_d = asin(1.0) * 2.0; +	deg2rad = pi_d / 180.0; +	parms.a_center = 0.0; +	parms.a_nick = 0.0; +	parms.a_tilt = 0.0; +	parms.scale = 3500.0; +	view_name = NULL; +	view_phi = 0.0; +	view_lam = 0.0; +	view_height = 0.0; +	proj = NULL; +	set_projection(Projection::TANGENTIAL);  }  Panorama::~Panorama() { -  visible_mountains->clear(); -  mountains->clobber(); -  delete(visible_mountains); -  delete(mountains); +	visible_mountains->clear(); +	mountains->clobber(); +	delete(visible_mountains); +	delete(mountains);  }  int  Panorama::load_data(const char *name) { -  if (mountains->load(name) != 0) { -    fprintf(stderr, "Could not load datafile %s\n", name); -    return 1; -  } +	if (mountains->load(name) != 0) { +		fprintf(stderr, "Could not load datafile %s\n", name); +		return 1; +	} -  mountains->mark_duplicates(0.00001); -  update_angles(); +	mountains->mark_duplicates(0.00001); +	update_angles(); -  return 0; +	return 0;  }  void  Panorama::add_hills(Hills *h) { -  mountains->add(h); +	mountains->add(h); -  mountains->mark_duplicates(0.00001); -  update_angles(); +	mountains->mark_duplicates(0.00001); +	update_angles();  }  void  Panorama::remove_trackpoints() { -  Hills *h_new = new Hills(); -  Hill *m; +	Hills *h_new = new Hills(); +	Hill *m; + +	for(int i=0; i<mountains->get_num(); i++) { +		m = mountains->get(i); +		if (! (m->flags & Hill::TRACK_POINT)) { +			h_new->add(m); +		} +	} -  for(int i=0; i<mountains->get_num(); i++) { -    m = mountains->get(i); -    if (! (m->flags & Hill::TRACK_POINT)) { -      h_new->add(m); -    } -  } -  -  delete mountains; -  mountains = h_new; +	delete mountains; +	mountains = h_new;  } -  +  int  Panorama::set_viewpoint(const char *name) { -  Hill *m = get_pos(name); -  if (m == NULL) { -    fprintf(stderr, "Could not find exactly one entry for %s.\n"); -    return 1; -  } +	Hill *m = get_pos(name); +	if (m == NULL) { +		fprintf(stderr, "Could not find exactly one entry for %s.\n"); +		return 1; +	} -  set_viewpoint(m); -  return 0; +	set_viewpoint(m); +	return 0;  }  void  Panorama::set_viewpoint(const Hill *m) { -  if (m == NULL) { -    return; -  } -  -  view_phi = m->phi; -  view_lam = m->lam; -  view_height = m->height; +	if (m == NULL) { +		return; +	} -  if (view_name) { -    free(view_name); -  } +	view_phi = m->phi; +	view_lam = m->lam; +	view_height = m->height; + +	if (view_name) { +		free(view_name); +	} -  view_name = strdup(m->name); +	view_name = strdup(m->name); -  update_angles(); +	update_angles();  }  Hills *   Panorama::get_mountains() { -  return mountains; +	return mountains;  }  Hills *   Panorama::get_close_mountains() { -  return close_mountains; +	return close_mountains;  }  Hills *   Panorama::get_visible_mountains() { -  return visible_mountains; +	return visible_mountains;  }  double  Panorama::get_value(Hills *p) { -  int i, j; -  Hill *m; -  double v = 0.0, d_min, d; - -  if (isnan(parms.scale) || isnan(parms.a_center) || isnan(parms.a_tilt) || isnan(parms.a_nick) || -      parms.scale < 500.0 || parms.scale > 100000.0 ||  -      parms.a_nick > pi_d/4.0 || parms.a_nick < - pi_d/4.0 ||  -      parms.a_tilt > pi_d/16.0 || parms.a_tilt < - pi_d/16.0) { -    return 10000000.0; -  } - - -  for (i=0; i<p->get_num(); i++) { -    d_min = 1000.0; -    for (j=0; j<visible_mountains->get_num(); j++) { -      d = pow(p->get(i)->x - visible_mountains->get(j)->x, 2.0) +  -	pow(p->get(i)->y - visible_mountains->get(j)->y, 2.0); -      if (d < d_min) { -	d_min = d; -      } -    } -    v = v + d_min; -  } -       -  return v; +	int i, j; +	Hill *m; +	double v = 0.0, d_min, d; + +	if (isnan(parms.scale) || isnan(parms.a_center) || isnan(parms.a_tilt) || isnan(parms.a_nick) || +		parms.scale < 500.0 || parms.scale > 100000.0 ||  +		parms.a_nick > pi_d/4.0 || parms.a_nick < - pi_d/4.0 ||  +		parms.a_tilt > pi_d/16.0 || parms.a_tilt < - pi_d/16.0) { +		return 10000000.0; +	} + + +	for (i=0; i<p->get_num(); i++) { +		d_min = 1000.0; +		for (j=0; j<visible_mountains->get_num(); j++) { +			d = pow(p->get(i)->x - visible_mountains->get(j)->x, 2.0) +  +				pow(p->get(i)->y - visible_mountains->get(j)->y, 2.0); +			if (d < d_min) { +				d_min = d; +			} +		} +		v = v + d_min; +	} + +	return v;  }  int   Panorama::guess(Hills *p, Hill *m1) { -  Hill *p2, *m_tmp1, *m_tmp2; -  Hill *m2; -  double best = 100000000.0, v; -  double a_center_best, a_nick_best, a_tilt_best, scale_best; -  int x1_sav, y1_sav; -  int i, j; - -  if (m1 == NULL) { -    fprintf(stderr, "Position one mountain first.\n"); -    return 1; -  } -   -  m_tmp1 = m1; -  x1_sav = m1->x; -  y1_sav = m1->y; -     -  for (i=0; i<p->get_num(); i++) { -    p2 = p->get(i); -    for (j=0; j<close_mountains->get_num(); j++) { -      m_tmp2 = close_mountains->get(j); - -      m1 = m_tmp1; -      m1->x = x1_sav; -      m1->y = y1_sav; - -      if (m_tmp2->flags & Hill::TRACK_POINT ||  -          m1 == m_tmp2 || fabs(m1->alph - m_tmp2->alph) > pi_d *0.7) { -	continue; -      } - -      m2 = m_tmp2; -      m2->x = p2->x; -      m2->y = p2->y; - -      comp_params(m1, m2); -       -      v = get_value(p); -	 -      if (v < best) { -	best = v; -	a_center_best = parms.a_center; -	a_nick_best = parms.a_nick; -	a_tilt_best = parms.a_tilt; -	scale_best = parms.scale; -      } -    }      -  } - -  if (best < 4000.0) { -    parms.a_center = a_center_best; -    parms.a_nick = a_nick_best; -    parms.a_tilt = a_tilt_best; -    parms.scale = scale_best; -  } else { -    fprintf(stderr, "No solution found.\n"); -  } -  update_visible_mountains(); -  return 0; +	Hill *p2, *m_tmp1, *m_tmp2; +	Hill *m2; +	double best = 100000000.0, v; +	double a_center_best, a_nick_best, a_tilt_best, scale_best; +	int x1_sav, y1_sav; +	int i, j; + +	if (m1 == NULL) { +		fprintf(stderr, "Position one mountain first.\n"); +		return 1; +	} + +	m_tmp1 = m1; +	x1_sav = m1->x; +	y1_sav = m1->y; + +	for (i=0; i<p->get_num(); i++) { +		p2 = p->get(i); +		for (j=0; j<close_mountains->get_num(); j++) { +			m_tmp2 = close_mountains->get(j); + +			m1 = m_tmp1; +			m1->x = x1_sav; +			m1->y = y1_sav; + +			if (m_tmp2->flags & Hill::TRACK_POINT ||  +				m1 == m_tmp2 || fabs(m1->alph - m_tmp2->alph) > pi_d *0.7) { +				continue; +			} + +			m2 = m_tmp2; +			m2->x = p2->x; +			m2->y = p2->y; + +			comp_params(m1, m2); + +			v = get_value(p); + +			if (v < best) { +				best = v; +				a_center_best = parms.a_center; +				a_nick_best = parms.a_nick; +				a_tilt_best = parms.a_tilt; +				scale_best = parms.scale; +			} +		}      +	} + +	if (best < 4000.0) { +		parms.a_center = a_center_best; +		parms.a_nick = a_nick_best; +		parms.a_tilt = a_tilt_best; +		parms.scale = scale_best; +	} else { +		fprintf(stderr, "No solution found.\n"); +	} +	update_visible_mountains(); +	return 0;  }  int  Panorama::comp_params(Hill *m1, Hill *m2) { -  int ret; +	int ret; -  ret = proj->comp_params(m1, m2, &parms); -  update_visible_mountains(); -  return ret; +	ret = proj->comp_params(m1, m2, &parms); +	update_visible_mountains(); +	return ret;  }  void  Panorama::set_center_angle(double a) { -  parms.a_center = a * deg2rad; -  update_visible_mountains(); +	parms.a_center = a * deg2rad; +	update_visible_mountains();  }  void  Panorama::set_nick_angle(double a) { -  parms.a_nick = a * deg2rad; -  update_coordinates(); +	parms.a_nick = a * deg2rad; +	update_coordinates();  }  void  Panorama::set_tilt_angle(double a) { -  parms.a_tilt = a * deg2rad; -  update_coordinates(); +	parms.a_tilt = a * deg2rad; +	update_coordinates();  }  void  Panorama::set_scale(double s) { -  parms.scale = s; -  update_coordinates(); +	parms.scale = s; +	update_coordinates();  }  void  Panorama::set_height_dist_ratio(double r) { -  height_dist_ratio = r; -  update_close_mountains(); +	height_dist_ratio = r; +	update_close_mountains();  }  void  Panorama::set_view_long(double v) { -  view_lam = v * deg2rad; -  update_angles(); +	view_lam = v * deg2rad; +	update_angles();  }  void  Panorama::set_view_lat(double v) { -  view_phi = v * deg2rad; -  update_angles(); +	view_phi = v * deg2rad; +	update_angles();  }  void  Panorama::set_view_height(double v) { -  view_height = v; -  update_angles(); +	view_height = v; +	update_angles();  }  void  Panorama::set_projection(Projection::Projection_t p) { -  projection_type = p; -    -  if (proj) { -    delete proj; -  } - -  switch(projection_type) { -    case Projection::TANGENTIAL: -      proj = new ProjectionTangential(); -      view_angle = pi_d / 3.0; -      break; -    case Projection::SPHAERIC: -      proj = new ProjectionSphaeric(); -      view_angle = pi_d * 2.0; -      break; -  } -  update_angles(); +	projection_type = p; + +	if (proj) { +		delete proj; +	} + +	switch(projection_type) { +		case Projection::TANGENTIAL: +			proj = new ProjectionTangential(); +			view_angle = pi_d / 3.0; +			break; +		case Projection::SPHAERIC: +			proj = new ProjectionSphaeric(); +			view_angle = pi_d * 2.0; +			break; +	} +	update_angles();  }  const char *  Panorama::get_viewpoint() { -  return view_name; +	return view_name;  }  double  Panorama::get_center_angle() { -  return parms.a_center / deg2rad; +	return parms.a_center / deg2rad;  }  double  Panorama::get_nick_angle() { -  return parms.a_nick / deg2rad; +	return parms.a_nick / deg2rad;  }  double  Panorama::get_tilt_angle() { -  return parms.a_tilt / deg2rad; +	return parms.a_tilt / deg2rad;  }  double  Panorama::get_scale() { -  return parms.scale; +	return parms.scale;  }  double  Panorama::get_height_dist_ratio() { -  return height_dist_ratio; +	return height_dist_ratio;  }  double  Panorama::get_view_long() { -  return view_lam / deg2rad; +	return view_lam / deg2rad;  }  double  Panorama::get_view_lat() { -  return view_phi / deg2rad; +	return view_phi / deg2rad;  }  double  Panorama::get_view_height() { -  return view_height; +	return view_height;  }  Projection::Projection_t  Panorama::get_projection() { -  return projection_type; +	return projection_type;  }  Hill *  Panorama::get_pos(const char *name) { -  int i; -  int found = 0; -  double p, l, h; -  Hill *m, *ret; - -  for (i=0; i<mountains->get_num(); i++) { -    m = mountains->get(i); - -    if (strcmp(m->name, name) == 0) { -      ret = m; -      fprintf(stderr, "Found matching entry: %s (%fm)\n", m->name, m->height); -      found++; -    } -  } +	int i; +	int found = 0; +	double p, l, h; +	Hill *m, *ret; + +	for (i=0; i<mountains->get_num(); i++) { +		m = mountains->get(i); + +		if (strcmp(m->name, name) == 0) { +			ret = m; +			fprintf(stderr, "Found matching entry: %s (%fm)\n", m->name, m->height); +			found++; +		} +	} -  if (found == 1) { -    return ret; -  } +	if (found == 1) { +		return ret; +	} -  return NULL; +	return NULL;  }  void   Panorama::update_angles() { -  int i; -  Hill *m; +	int i; +	Hill *m; -  for (i=0; i<mountains->get_num(); i++) { -    m = mountains->get(i); -  -    m->dist = distance(m->phi, m->lam); -    if (m->phi != view_phi || m->lam != view_lam) { -       -      m->alph = alpha(m->phi, m->lam); -      m->a_nick = nick(m->dist, m->height); -    } -  } +	for (i=0; i<mountains->get_num(); i++) { +		m = mountains->get(i); +		m->dist = distance(m->phi, m->lam); +		if (m->phi != view_phi || m->lam != view_lam) { -  mountains->sort(); +			m->alph = alpha(m->phi, m->lam); +			m->a_nick = nick(m->dist, m->height); +		} +	} -  update_close_mountains(); + +	mountains->sort(); + +	update_close_mountains();  }  void  Panorama::set_hide_value(double h) { -  hide_value = h; -  update_visible_mountains(); +	hide_value = h; +	update_visible_mountains();  }  void  Panorama::mark_hidden(Hills *hills) { -  int i, j; -  Hill *m, *n; -  double h; -    -  for (i=0; i<hills->get_num(); i++) { -    m = hills->get(i); - -    m->flags &= ~Hill::HIDDEN; - -    if (m->flags & Hill::DUPLICATE) { -      continue; -    } - -    for (j=0; j<hills->get_num(); j++) { -      n = hills->get(j); -       -      if (n->flags & Hill::DUPLICATE || n->flags & Hill::TRACK_POINT) { -        continue; -      } -      if (m == n || fabs(m->alph - n->alph > pi_d / 2.0)) { -        continue; -      } -      if (m->dist < n->dist || m->a_nick > n->a_nick) { -        continue; -      } - -      h = (n->a_nick - m->a_nick) / fabs(m->alph - n->alph); -      if (isinf(h) || h > hide_value) { -        m->flags |= Hill::HIDDEN; -      } -    } - -  } +	int i, j; +	Hill *m, *n; +	double h; + +	for (i=0; i<hills->get_num(); i++) { +		m = hills->get(i); + +		m->flags &= ~Hill::HIDDEN; + +		if (m->flags & Hill::DUPLICATE) { +			continue; +		} + +		for (j=0; j<hills->get_num(); j++) { +			n = hills->get(j); + +			if (n->flags & Hill::DUPLICATE || n->flags & Hill::TRACK_POINT) { +				continue; +			} +			if (m == n || fabs(m->alph - n->alph > pi_d / 2.0)) { +				continue; +			} +			if (m->dist < n->dist || m->a_nick > n->a_nick) { +				continue; +			} + +			h = (n->a_nick - m->a_nick) / fabs(m->alph - n->alph); +			if (isinf(h) || h > hide_value) { +				m->flags |= Hill::HIDDEN; +			} +		} + +	}  }  void   Panorama::update_close_mountains() { -  int i; -  Hill *m; +	int i; +	Hill *m; + +	close_mountains->clear(); -  close_mountains->clear(); +	for (i=0; i<mountains->get_num(); i++) { +		m = mountains->get(i); -  for (i=0; i<mountains->get_num(); i++) { -    m = mountains->get(i); -  -    if (m->flags & Hill::TRACK_POINT || -        ((m->phi != view_phi || m->lam != view_lam) && -	 (m->height / (m->dist * get_earth_radius(m))  -	 > height_dist_ratio))) { +		if (m->flags & Hill::TRACK_POINT || +			((m->phi != view_phi || m->lam != view_lam) && +			 (m->height / (m->dist * get_earth_radius(m))  +			  > height_dist_ratio))) { -      close_mountains->add(m); -    } -  } +			close_mountains->add(m); +		} +	} -  mark_hidden(close_mountains); -  update_visible_mountains(); +	mark_hidden(close_mountains); +	update_visible_mountains();  }  void   Panorama::update_visible_mountains() { -  int i; -  Hill *m; +	int i; +	Hill *m; -  visible_mountains->clear(); +	visible_mountains->clear(); -  for (i=0; i<close_mountains->get_num(); i++) { -    m = close_mountains->get(i); +	for (i=0; i<close_mountains->get_num(); i++) { +		m = close_mountains->get(i); -    m->a_view = m->alph - parms.a_center; +		m->a_view = m->alph - parms.a_center; -    if (m->a_view > pi_d) { -      m->a_view -= 2.0*pi_d; -    } else if (m->a_view < -pi_d) { -      m->a_view += 2.0*pi_d; -    } -  -    if (m->a_view < view_angle && m->a_view > - view_angle) { -      visible_mountains->add(m); -      m->flags |= Hill::VISIBLE; -    } else { -      m->flags &= ~Hill::VISIBLE; -    } -  } +		if (m->a_view > pi_d) { +			m->a_view -= 2.0*pi_d; +		} else if (m->a_view < -pi_d) { +			m->a_view += 2.0*pi_d; +		} -  update_coordinates(); +		if (m->a_view < view_angle && m->a_view > - view_angle) { +			visible_mountains->add(m); +			m->flags |= Hill::VISIBLE; +		} else { +			m->flags &= ~Hill::VISIBLE; +		} +	} + +	update_coordinates();  }  void  Panorama::update_coordinates() { -  Hill *m; +	Hill *m; + +	for (int i=0; i<visible_mountains->get_num(); i++) { +		m = visible_mountains->get(i); +		double tmp_x, tmp_y; -  for (int i=0; i<visible_mountains->get_num(); i++) { -    m = visible_mountains->get(i); -	double tmp_x, tmp_y; -     -    proj->get_coordinates(m->a_view, m->a_nick, &parms, &tmp_x, &tmp_y); -	m->x = (int) rint(tmp_x); -	m->y = (int) rint(tmp_y); -  } +		proj->get_coordinates(m->a_view, m->a_nick, &parms, &tmp_x, &tmp_y); +		m->x = (int) rint(tmp_x); +		m->y = (int) rint(tmp_y); +	}  }  double   Panorama::distance(double phi, double lam) { -  return acos(sin(view_phi) * sin(phi) +  -	      cos(view_phi) * cos(phi) * cos(view_lam - lam)); +	return acos(sin(view_phi) * sin(phi) +  +		cos(view_phi) * cos(phi) * cos(view_lam - lam));  }  double   Panorama::sin_alpha(double lam, double phi, double c) { -  return sin(lam - view_lam) * cos(phi) / sin(c); +	return sin(lam - view_lam) * cos(phi) / sin(c);  }  double  Panorama::cos_alpha(double phi, double c) { -  return (sin(phi) - sin(view_phi) * cos(c)) / (cos(view_phi) * sin(c)); +	return (sin(phi) - sin(view_phi) * cos(c)) / (cos(view_phi) * sin(c));  }  double   Panorama::alpha(double phi, double lam) { -  double dist, sin_alph, cos_alph, alph; -   -  dist = distance(phi, lam); -  sin_alph = sin_alpha(lam, phi, dist); -  cos_alph = cos_alpha(phi, dist); +	double dist, sin_alph, cos_alph, alph; -  if (sin_alph > 0) { -    alph = acos(cos_alph); -  } else { -    alph = 2.0 * pi_d - acos(cos_alph); -  } +	dist = distance(phi, lam); +	sin_alph = sin_alpha(lam, phi, dist); +	cos_alph = cos_alpha(phi, dist); + +	if (sin_alph > 0) { +		alph = acos(cos_alph); +	} else { +		alph = 2.0 * pi_d - acos(cos_alph); +	} -  if (alph > 2.0 * pi_d) { -    alph = alph - 2.0 *  pi_d; -  } else if (alph < 0.0) { -    alph = alph + 2.0 * pi_d; -  } -  return alph; +	if (alph > 2.0 * pi_d) { +		alph = alph - 2.0 *  pi_d; +	} else if (alph < 0.0) { +		alph = alph + 2.0 * pi_d; +	} +	return alph;  }  double  Panorama::nick(double dist, double height) { -  double a, b, c; -  double beta; +	double a, b, c; +	double beta; -  b = height + EARTH_RADIUS; -  c = view_height + EARTH_RADIUS; +	b = height + EARTH_RADIUS; +	c = view_height + EARTH_RADIUS; -  a = pow(((b * (b - (2.0 * c * cos(dist)))) + (c * c)), (1.0 / 2.0)); -  beta = acos((-(b*b) + (a*a) + (c*c))/(2 * a * c)); -   -  return beta - pi_d / 2.0; +	a = pow(((b * (b - (2.0 * c * cos(dist)))) + (c * c)), (1.0 / 2.0)); +	beta = acos((-(b*b) + (a*a) + (c*c))/(2 * a * c)); + +	return beta - pi_d / 2.0;  }  double  Panorama::get_earth_radius(Hill *m) { -  return EARTH_RADIUS; +	return EARTH_RADIUS;  }  double  Panorama::get_real_distance(Hill *m) { -  double a, b, c, gam; +	double a, b, c, gam; -  a = view_height + get_earth_radius(m); // using m here is not quite right -  b = m->height + get_earth_radius(m);  -  gam = m->dist; +	a = view_height + get_earth_radius(m); // using m here is not quite right +	b = m->height + get_earth_radius(m);  +	gam = m->dist; -  c = sqrt(pow(a, 2.0) + pow(b, 2.0) - 2.0 * a * b * cos(gam)); -  return c; +	c = sqrt(pow(a, 2.0) + pow(b, 2.0) - 2.0 * a * b * cos(gam)); +	return c;  }  int  Panorama::get_coordinates(double a_view, double a_nick, double *x, double *y) {  	a_view = a_view - parms.a_center; -    if (a_view > pi_d) { -      a_view -= 2.0*pi_d; -    } else if (a_view < -pi_d) { -      a_view += 2.0*pi_d; -    } -   -    if (a_view > view_angle || a_view < - view_angle) { +	if (a_view > pi_d) { +		a_view -= 2.0*pi_d; +	} else if (a_view < -pi_d) { +		a_view += 2.0*pi_d; +	} + +	if (a_view > view_angle || a_view < - view_angle) {  		return 1;  	} -    proj->get_coordinates(a_view, a_nick, &parms, x, y); +	proj->get_coordinates(a_view, a_nick, &parms, x, y);  	return 0;  } diff --git a/src/Projection.H b/src/Projection.H index 6db0e97..3bc816e 100644 --- a/src/Projection.H +++ b/src/Projection.H @@ -11,20 +11,20 @@  #include "ViewParams.H"  class Projection { - protected: -  double pi_d; +	protected: +		double pi_d; - public: -  typedef enum { -    TANGENTIAL = 0, -    SPHAERIC   = 1 -  } Projection_t; +	public: +		typedef enum { +			TANGENTIAL = 0, +			SPHAERIC   = 1 +		} Projection_t; -  Projection(); +		Projection(); -  virtual void get_coordinates(double a_view, double a_nick, -	const ViewParams *parms, double *x, double *y); -   -  virtual int comp_params(const Hill *m1, const Hill *m2, ViewParams *parms); +		virtual void get_coordinates(double a_view, double a_nick, +			const ViewParams *parms, double *x, double *y); + +		virtual int comp_params(const Hill *m1, const Hill *m2, ViewParams *parms);  };  #endif diff --git a/src/Projection.cxx b/src/Projection.cxx index 88ec5bf..02674a7 100644 --- a/src/Projection.cxx +++ b/src/Projection.cxx @@ -10,17 +10,17 @@  #include "Projection.H"  Projection::Projection() { -  pi_d = asin(1.0) * 2.0; +	pi_d = asin(1.0) * 2.0;  };  void  Projection::get_coordinates(double a_view, double a_nick, -		const ViewParams *parms, double *x, double *y) { -  fprintf(stderr, "Error: Projection::set_coordinates()\n"); +	const ViewParams *parms, double *x, double *y) { +	fprintf(stderr, "Error: Projection::set_coordinates()\n");  }  int   Projection::comp_params(const Hill *m1, const Hill *m2, ViewParams *parms) { -  fprintf(stderr, "Error: Projection::comp_params()\n"); -  return 1; +	fprintf(stderr, "Error: Projection::comp_params()\n"); +	return 1;  } diff --git a/src/ProjectionSphaeric.H b/src/ProjectionSphaeric.H index f80940a..c6ce5f4 100644 --- a/src/ProjectionSphaeric.H +++ b/src/ProjectionSphaeric.H @@ -11,17 +11,17 @@  #include "Projection.H"  class ProjectionSphaeric : public Projection { - private: +	private: -  double comp_scale(const Hill *m1, const Hill *m2, double d_m1_m2_2); -  double comp_dir_view(const Hill *m1, const Hill *m2, double d_m1_2, double d_m2_2, double scale, double sign3); -  double comp_nick_view(const Hill *m1, const Hill *m2, double d_m1_2, double scale, double dir_view, double sign1); -  double comp_tilt_view(const Hill *m, double scale, double dir_view, double nick_view); +		double comp_scale(const Hill *m1, const Hill *m2, double d_m1_m2_2); +		double comp_dir_view(const Hill *m1, const Hill *m2, double d_m1_2, double d_m2_2, double scale, double sign3); +		double comp_nick_view(const Hill *m1, const Hill *m2, double d_m1_2, double scale, double dir_view, double sign1); +		double comp_tilt_view(const Hill *m, double scale, double dir_view, double nick_view); - public: -  void get_coordinates(double a_view, double a_nick, const ViewParams *parms, -		double *x, double *y); +	public: +		void get_coordinates(double a_view, double a_nick, const ViewParams *parms, +			double *x, double *y); -  int comp_params(const Hill *m1, const Hill *m2, ViewParams *parms); +		int comp_params(const Hill *m1, const Hill *m2, ViewParams *parms);  };  #endif diff --git a/src/ProjectionSphaeric.cxx b/src/ProjectionSphaeric.cxx index d4e7e43..96af4e0 100644 --- a/src/ProjectionSphaeric.cxx +++ b/src/ProjectionSphaeric.cxx @@ -14,142 +14,142 @@  int  ProjectionSphaeric::comp_params(const Hill *m1, const Hill *m2, ViewParams *parms) { -  const Hill *m_tmp; -  double tmp_x, tmp_y; -  double val; -  ViewParams best, tmp; -  double best_val = BEST_UNDEF; -  double d_m1_2, d_m2_2, d_m1_m2_2; -  int i, j; - -  if (m1->x < m2->x) { -    m_tmp = m1; -    m1 = m2; -    m2 = m_tmp; -  } - -  d_m1_2 = pow(m1->x, 2.0) + pow(m1->y, 2.0); -  d_m2_2 = pow(m2->x, 2.0) + pow(m2->y, 2.0); -  d_m1_m2_2 = pow(m1->x - m2->x, 2.0) + pow(m1->y - m2->y, 2.0); - -  tmp.scale = comp_scale(m1, m2, d_m1_m2_2); - -  for(i=0; i<2; i++) { // we need to try four possible solutions ... -    for(j=0; j<2; j++) {  -      tmp.a_center = comp_dir_view(m1, m2, d_m1_2, d_m2_2,  -                                   tmp.scale, i==0?1.0:-1.0); -      tmp.a_nick = comp_nick_view(m1, m2, d_m1_2, tmp.scale, tmp.a_center, -                                  j==0?1.0:-1.0); - -      // use the point with greater distance from center for tilt computation  -      if (d_m1_2 > d_m2_2) { -        tmp.a_tilt = comp_tilt_view(m1, tmp.scale, tmp.a_center, tmp.a_nick); -      } else { -        tmp.a_tilt = comp_tilt_view(m2, tmp.scale, tmp.a_center, tmp.a_nick); -      } - -      if (isnan(tmp.a_center) || isnan(tmp.scale) ||  -          isnan(tmp.a_nick) || isnan(tmp.a_tilt)) { -        ; -      } else { -        get_coordinates(m1->a_view, m1->a_nick, &tmp, &tmp_x, &tmp_y); -        val = sqrt(pow(tmp_x - m1->x, 2.0) + pow(tmp_y - m1->y, 2.0));  -        get_coordinates(m2->a_view, m2->a_nick, &tmp, &tmp_x, &tmp_y); -        val += sqrt(pow(tmp_x - m2->x, 2.0) + pow(tmp_y - m2->y, 2.0));  - -        if (val < best_val) {	 -          best_val = val; -          best = tmp; -        } -      } -    } -  } - -  if (best_val < BEST_UNDEF) { -    *parms = best; -    return 0; -  } else { -    return 1; -  } +	const Hill *m_tmp; +	double tmp_x, tmp_y; +	double val; +	ViewParams best, tmp; +	double best_val = BEST_UNDEF; +	double d_m1_2, d_m2_2, d_m1_m2_2; +	int i, j; + +	if (m1->x < m2->x) { +		m_tmp = m1; +		m1 = m2; +		m2 = m_tmp; +	} + +	d_m1_2 = pow(m1->x, 2.0) + pow(m1->y, 2.0); +	d_m2_2 = pow(m2->x, 2.0) + pow(m2->y, 2.0); +	d_m1_m2_2 = pow(m1->x - m2->x, 2.0) + pow(m1->y - m2->y, 2.0); + +	tmp.scale = comp_scale(m1, m2, d_m1_m2_2); + +	for(i=0; i<2; i++) { // we need to try four possible solutions ... +		for(j=0; j<2; j++) {  +			tmp.a_center = comp_dir_view(m1, m2, d_m1_2, d_m2_2,  +				tmp.scale, i==0?1.0:-1.0); +			tmp.a_nick = comp_nick_view(m1, m2, d_m1_2, tmp.scale, tmp.a_center, +				j==0?1.0:-1.0); + +			// use the point with greater distance from center for tilt computation  +			if (d_m1_2 > d_m2_2) { +				tmp.a_tilt = comp_tilt_view(m1, tmp.scale, tmp.a_center, tmp.a_nick); +			} else { +				tmp.a_tilt = comp_tilt_view(m2, tmp.scale, tmp.a_center, tmp.a_nick); +			} + +			if (isnan(tmp.a_center) || isnan(tmp.scale) ||  +				isnan(tmp.a_nick) || isnan(tmp.a_tilt)) { +				; +			} else { +				get_coordinates(m1->a_view, m1->a_nick, &tmp, &tmp_x, &tmp_y); +				val = sqrt(pow(tmp_x - m1->x, 2.0) + pow(tmp_y - m1->y, 2.0));  +				get_coordinates(m2->a_view, m2->a_nick, &tmp, &tmp_x, &tmp_y); +				val += sqrt(pow(tmp_x - m2->x, 2.0) + pow(tmp_y - m2->y, 2.0));  + +				if (val < best_val) {	 +					best_val = val; +					best = tmp; +				} +			} +		} +	} + +	if (best_val < BEST_UNDEF) { +		*parms = best; +		return 0; +	} else { +		return 1; +	}  }  void   ProjectionSphaeric::get_coordinates(double a_view, double a_nick,  	const ViewParams *parms, double *x, double *y) { -  double x_tmp, y_tmp; +	double x_tmp, y_tmp; -  x_tmp = a_view * parms->scale; -  y_tmp = - (a_nick - parms->a_nick) * parms->scale; +	x_tmp = a_view * parms->scale; +	y_tmp = - (a_nick - parms->a_nick) * parms->scale; -  // rotate by a_tilt; -  *x = x_tmp * cos(parms->a_tilt) - y_tmp * sin(parms->a_tilt); -  *y = x_tmp * sin(parms->a_tilt) + y_tmp * cos(parms->a_tilt); +	// rotate by a_tilt; +	*x = x_tmp * cos(parms->a_tilt) - y_tmp * sin(parms->a_tilt); +	*y = x_tmp * sin(parms->a_tilt) + y_tmp * cos(parms->a_tilt);  }  double  ProjectionSphaeric::comp_scale(const Hill *m1, const Hill *m2, double d_m1_m2_2) { -  double sign1 = 1.0; -  double nick_m1 = m1->a_nick; -  double nick_m2 = m2->a_nick; -  double dir_m1 = m1->alph; -  double dir_m2 = m2->alph; +	double sign1 = 1.0; +	double nick_m1 = m1->a_nick; +	double nick_m2 = m2->a_nick; +	double dir_m1 = m1->alph; +	double dir_m2 = m2->alph; -  return  (pow((d_m1_m2_2 / ((dir_m2 * dir_m2) - (2.0 * ((dir_m2 * dir_m1) + (nick_m2 * nick_m1))) + (nick_m2 * nick_m2) + (dir_m1 * dir_m1) + (nick_m1 * nick_m1))), (1.0 / 2.0)) * sign1);  +	return  (pow((d_m1_m2_2 / ((dir_m2 * dir_m2) - (2.0 * ((dir_m2 * dir_m1) + (nick_m2 * nick_m1))) + (nick_m2 * nick_m2) + (dir_m1 * dir_m1) + (nick_m1 * nick_m1))), (1.0 / 2.0)) * sign1);   }  // using the sign3 parameter one can choose between the two possible solutions  // sign3 must be 1.0 or -1.0  double  ProjectionSphaeric::comp_dir_view(const Hill *m1, const Hill *m2, double d_m1_2, double d_m2_2, double scale, double sign3) { -  double dir_view; -  double nick_m1 = m1->a_nick; -  double nick_m2 = m2->a_nick; -  double dir_m1 = m1->alph; -  double dir_m2 = m2->alph; +	double dir_view; +	double nick_m1 = m1->a_nick; +	double nick_m2 = m2->a_nick; +	double dir_m1 = m1->alph; +	double dir_m2 = m2->alph; -  dir_view = (((pow((16.0 * pow(scale, 4.0) * (((scale * scale) * ((2.0 * (((scale * scale) * ((dir_m1 * ((dir_m1 * ((nick_m1 * ((nick_m1 * ((nick_m2 * ((4.0 * nick_m1) - (6.0 * nick_m2))) - (nick_m1 * nick_m1))) + (nick_m2 * ((4.0 * (nick_m2 * nick_m2)) + (6.0 * (dir_m2 * dir_m2)) + (dir_m1 * dir_m1))))) - pow(nick_m2, 4.0))) + (nick_m1 * nick_m2 * dir_m2 * ((nick_m1 * ((12.0 * nick_m2) - (8.0 * nick_m1))) - (8.0 * (nick_m2 * nick_m2)))))) + ((dir_m2 * dir_m2) * ((nick_m1 * ((nick_m2 * (dir_m2 * dir_m2)) - pow(nick_m1, 3.0))) - pow(nick_m2, 4.0))))) + ((d_m1_2 + d_m2_2) * ((((nick_m1 * nick_m1) + (nick_m2 * nick_m2)) * ((dir_m1 * dir_m1) + (dir_m2 * dir_m2))) + pow(nick_m1, 4.0) + pow(nick_m2, 4.0))))) + (4.0 * ((dir_m1 * ((nick_m1 * ((nick_m1 * dir_m2 * (((scale * scale) * ((nick_m1 * nick_m1) + (dir_m1 * dir_m1) + (dir_m2 * dir_m2))) - d_m1_2 - d_m2_2)) - (dir_m1 * nick_m2 * (d_m2_2 + d_m1_2)))) + ((nick_m2 * nick_m2) * dir_m2 * (((scale * scale) * ((nick_m2 * nick_m2) + (dir_m1 * dir_m1) + (dir_m2 * dir_m2))) - d_m1_2 - d_m2_2)))) - (nick_m1 * nick_m2 * (dir_m2 * dir_m2) * (d_m1_2 + d_m2_2)))) + ((scale * scale) * ((nick_m1 * ((nick_m1 * ((nick_m2 * (((dir_m2 * dir_m2) * ((8.0 * nick_m1) - (12.0 * nick_m2))) + (nick_m1 * ((nick_m1 * ((6.0 * nick_m1) - (15.0 * nick_m2))) + (20.0 * (nick_m2 * nick_m2)))) - (15.0 * pow(nick_m2, 3.0)))) - ((dir_m1 * dir_m1) * ((dir_m1 * dir_m1) + (6.0 * (dir_m2 * dir_m2)))) - pow(dir_m2, 4.0) - pow(nick_m1, 4.0))) + (nick_m2 * ((8.0 * dir_m2 * ((dir_m2 * ((nick_m2 * nick_m2) - (dir_m1 * dir_m2))) - pow(dir_m1, 3.0))) + (6.0 * pow(nick_m2, 4.0)))))) - ((nick_m2 * nick_m2) * (((dir_m1 * dir_m1) * ((6.0 * (dir_m2 * dir_m2)) + (dir_m1 * dir_m1))) + pow(dir_m2, 4.0) + pow(nick_m2, 4.0))))) + (nick_m1 * nick_m2 * (d_m1_2 + d_m2_2) * ((8.0 * ((dir_m1 * dir_m2) - (nick_m1 * nick_m1) - (nick_m2 * nick_m2))) + (12.0 * nick_m1 * nick_m2))))) + (((d_m1_2 * ((2.0 * d_m2_2) - d_m1_2)) - (d_m2_2 * d_m2_2)) * ((nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2))))), (1.0 / 2.0)) * sign3 / 2.0) + (2.0 * (scale * scale) * (((scale * scale) * ((dir_m1 * ((nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2) - (dir_m2 * (dir_m2 + dir_m1)) + (dir_m1 * dir_m1))) + (dir_m2 * ((dir_m2 * dir_m2) + (nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2))))) + ((dir_m2 - dir_m1) * (d_m1_2 - d_m2_2))))) / (4.0 * pow(scale, 4.0) * ((dir_m1 * (dir_m1 - (2.0 * dir_m2))) + (dir_m2 * dir_m2) + (nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2)))); +	dir_view = (((pow((16.0 * pow(scale, 4.0) * (((scale * scale) * ((2.0 * (((scale * scale) * ((dir_m1 * ((dir_m1 * ((nick_m1 * ((nick_m1 * ((nick_m2 * ((4.0 * nick_m1) - (6.0 * nick_m2))) - (nick_m1 * nick_m1))) + (nick_m2 * ((4.0 * (nick_m2 * nick_m2)) + (6.0 * (dir_m2 * dir_m2)) + (dir_m1 * dir_m1))))) - pow(nick_m2, 4.0))) + (nick_m1 * nick_m2 * dir_m2 * ((nick_m1 * ((12.0 * nick_m2) - (8.0 * nick_m1))) - (8.0 * (nick_m2 * nick_m2)))))) + ((dir_m2 * dir_m2) * ((nick_m1 * ((nick_m2 * (dir_m2 * dir_m2)) - pow(nick_m1, 3.0))) - pow(nick_m2, 4.0))))) + ((d_m1_2 + d_m2_2) * ((((nick_m1 * nick_m1) + (nick_m2 * nick_m2)) * ((dir_m1 * dir_m1) + (dir_m2 * dir_m2))) + pow(nick_m1, 4.0) + pow(nick_m2, 4.0))))) + (4.0 * ((dir_m1 * ((nick_m1 * ((nick_m1 * dir_m2 * (((scale * scale) * ((nick_m1 * nick_m1) + (dir_m1 * dir_m1) + (dir_m2 * dir_m2))) - d_m1_2 - d_m2_2)) - (dir_m1 * nick_m2 * (d_m2_2 + d_m1_2)))) + ((nick_m2 * nick_m2) * dir_m2 * (((scale * scale) * ((nick_m2 * nick_m2) + (dir_m1 * dir_m1) + (dir_m2 * dir_m2))) - d_m1_2 - d_m2_2)))) - (nick_m1 * nick_m2 * (dir_m2 * dir_m2) * (d_m1_2 + d_m2_2)))) + ((scale * scale) * ((nick_m1 * ((nick_m1 * ((nick_m2 * (((dir_m2 * dir_m2) * ((8.0 * nick_m1) - (12.0 * nick_m2))) + (nick_m1 * ((nick_m1 * ((6.0 * nick_m1) - (15.0 * nick_m2))) + (20.0 * (nick_m2 * nick_m2)))) - (15.0 * pow(nick_m2, 3.0)))) - ((dir_m1 * dir_m1) * ((dir_m1 * dir_m1) + (6.0 * (dir_m2 * dir_m2)))) - pow(dir_m2, 4.0) - pow(nick_m1, 4.0))) + (nick_m2 * ((8.0 * dir_m2 * ((dir_m2 * ((nick_m2 * nick_m2) - (dir_m1 * dir_m2))) - pow(dir_m1, 3.0))) + (6.0 * pow(nick_m2, 4.0)))))) - ((nick_m2 * nick_m2) * (((dir_m1 * dir_m1) * ((6.0 * (dir_m2 * dir_m2)) + (dir_m1 * dir_m1))) + pow(dir_m2, 4.0) + pow(nick_m2, 4.0))))) + (nick_m1 * nick_m2 * (d_m1_2 + d_m2_2) * ((8.0 * ((dir_m1 * dir_m2) - (nick_m1 * nick_m1) - (nick_m2 * nick_m2))) + (12.0 * nick_m1 * nick_m2))))) + (((d_m1_2 * ((2.0 * d_m2_2) - d_m1_2)) - (d_m2_2 * d_m2_2)) * ((nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2))))), (1.0 / 2.0)) * sign3 / 2.0) + (2.0 * (scale * scale) * (((scale * scale) * ((dir_m1 * ((nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2) - (dir_m2 * (dir_m2 + dir_m1)) + (dir_m1 * dir_m1))) + (dir_m2 * ((dir_m2 * dir_m2) + (nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2))))) + ((dir_m2 - dir_m1) * (d_m1_2 - d_m2_2))))) / (4.0 * pow(scale, 4.0) * ((dir_m1 * (dir_m1 - (2.0 * dir_m2))) + (dir_m2 * dir_m2) + (nick_m1 * (nick_m1 - (2.0 * nick_m2))) + (nick_m2 * nick_m2)))); -  return dir_view; +	return dir_view;  }  double  ProjectionSphaeric::comp_nick_view(const Hill *m1, const Hill *m2, double d_m1_2, double scale, double dir_view, double sign1) { -  double nick_view; -  double nick_m1 = m1->a_nick; -  double dir_m1 = m1->alph; +	double nick_view; +	double nick_m1 = m1->a_nick; +	double dir_m1 = m1->alph; -  nick_view = ((pow(((d_m1_2 / (scale * scale)) - pow((dir_view - dir_m1), 2.0)), (1.0 / 2.0)) * sign1) + nick_m1); +	nick_view = ((pow(((d_m1_2 / (scale * scale)) - pow((dir_view - dir_m1), 2.0)), (1.0 / 2.0)) * sign1) + nick_m1); -  return nick_view; +	return nick_view;  }  double  ProjectionSphaeric::comp_tilt_view(const Hill *m, double scale, double dir_view, double nick_view) { -  double sin_a_tilt1, sin_a_tilt2, sin_a_tilt, res; -  double x_tmp = (m->alph - dir_view) * scale; -  double y_tmp = (m->a_nick - nick_view) * scale; -  double x = m->x; -  double y = m->y; +	double sin_a_tilt1, sin_a_tilt2, sin_a_tilt, res; +	double x_tmp = (m->alph - dir_view) * scale; +	double y_tmp = (m->a_nick - nick_view) * scale; +	double x = m->x; +	double y = m->y; -  sin_a_tilt1 = - (y * - pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) / -    (x*x + y*y); +	sin_a_tilt1 = - (y * - pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) / +		(x*x + y*y); -  sin_a_tilt2 = - (y * pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) /  -    (x*x + y*y); +	sin_a_tilt2 = - (y * pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) /  +		(x*x + y*y); -  sin_a_tilt = fabs(sin_a_tilt1) < fabs(sin_a_tilt2)?sin_a_tilt1:sin_a_tilt2; +	sin_a_tilt = fabs(sin_a_tilt1) < fabs(sin_a_tilt2)?sin_a_tilt1:sin_a_tilt2; -  res = asin(sin_a_tilt); +	res = asin(sin_a_tilt); -  if (res > pi_d / 4.0) { -    res = res - pi_d / 2.0; -  } else if (res < -pi_d / 4.0) { -    res = res + pi_d / 2.0; -  } +	if (res > pi_d / 4.0) { +		res = res - pi_d / 2.0; +	} else if (res < -pi_d / 4.0) { +		res = res + pi_d / 2.0; +	} + +	return res; -  return res; -    } diff --git a/src/ProjectionTangential.H b/src/ProjectionTangential.H index 07ddaf9..13e354a 100644 --- a/src/ProjectionTangential.H +++ b/src/ProjectionTangential.H @@ -11,19 +11,19 @@  #include "Projection.H"  class ProjectionTangential : public Projection { - private: -  double comp_center_angle(double alph_a, double alph_b, double d1, double d2); +	private: +		double comp_center_angle(double alph_a, double alph_b, double d1, double d2); -  double comp_scale(double alph_a, double alph_b, double d1, double d2); +		double comp_scale(double alph_a, double alph_b, double d1, double d2); -  double angle_dist(double a1, double a2); +		double angle_dist(double a1, double a2); -  int optimize(const Hill *m1, const Hill *m2, ViewParams *parms); +		int optimize(const Hill *m1, const Hill *m2, ViewParams *parms); - public: -  void get_coordinates(double a_view, double a_nick, const ViewParams *parms, -		double *x, double *y); -   -  int comp_params(const Hill *m1, const Hill *m2, ViewParams *parms); +	public: +		void get_coordinates(double a_view, double a_nick, const ViewParams *parms, +			double *x, double *y); + +		int comp_params(const Hill *m1, const Hill *m2, ViewParams *parms);  };  #endif diff --git a/src/ProjectionTangential.cxx b/src/ProjectionTangential.cxx index 230767c..8eed552 100644 --- a/src/ProjectionTangential.cxx +++ b/src/ProjectionTangential.cxx @@ -15,284 +15,284 @@ extern "C" {  #include "ProjectionTangential.H"  static int opt_step(double *tan_nick_view,  -		    double *tan_dir_view, -		    double *n_scale, -		    double tan_dir_m1, -		    double tan_nick_m1, -		    double tan_dir_m2, -		    double tan_nick_m2, -		    double d_m1_2, double d_m2_2, double d_m1_m2_2); +	double *tan_dir_view, +	double *n_scale, +	double tan_dir_m1, +	double tan_nick_m1, +	double tan_dir_m2, +	double tan_nick_m2, +	double d_m1_2, double d_m2_2, double d_m1_m2_2);  static double  comp_tilt(double tan_nick_view, double tan_dir_view, double n_scale, -	  double tan_nick_m, double tan_dir_m, -	  double x, double y, double pi_d); +	double tan_nick_m, double tan_dir_m, +	double x, double y, double pi_d);  int  ProjectionTangential::comp_params(const Hill *m1, const Hill *m2, ViewParams *parms) { -  const Hill *tmp; -  double a_center_tmp, scale_tmp, a_nick_tmp; - -  scale_tmp = comp_scale(m1->alph, m2->alph, m1->x, m2->x); -  if (isnan(scale_tmp) || scale_tmp < 100.0) { -    // try again with mountains swapped -    tmp = m1; -    m1 = m2; -    m2 = tmp; -    scale_tmp = comp_scale(m1->alph, m2->alph, m1->x, m2->x); -  } - -  a_center_tmp = comp_center_angle(m1->alph, m2->alph, m1->x, m2->x); -  a_nick_tmp   = atan ((m1->y + tan(m1->a_nick) * parms->scale) /  -		       (parms->scale - m1->y * tan(m1->a_nick))); - -  if (isnan(a_center_tmp) || isnan(scale_tmp) || -      scale_tmp < 100.0 || isnan(a_nick_tmp)) { -    return 1; -  } else { -     -    parms->a_center = a_center_tmp; -    parms->scale    = scale_tmp; -    parms->a_nick   = a_nick_tmp; - -    optimize(m1, m2, parms); - -    return 0; -  } +	const Hill *tmp; +	double a_center_tmp, scale_tmp, a_nick_tmp; + +	scale_tmp = comp_scale(m1->alph, m2->alph, m1->x, m2->x); +	if (isnan(scale_tmp) || scale_tmp < 100.0) { +		// try again with mountains swapped +		tmp = m1; +		m1 = m2; +		m2 = tmp; +		scale_tmp = comp_scale(m1->alph, m2->alph, m1->x, m2->x); +	} + +	a_center_tmp = comp_center_angle(m1->alph, m2->alph, m1->x, m2->x); +	a_nick_tmp   = atan ((m1->y + tan(m1->a_nick) * parms->scale) /  +		(parms->scale - m1->y * tan(m1->a_nick))); + +	if (isnan(a_center_tmp) || isnan(scale_tmp) || +		scale_tmp < 100.0 || isnan(a_nick_tmp)) { +		return 1; +	} else { + +		parms->a_center = a_center_tmp; +		parms->scale    = scale_tmp; +		parms->a_nick   = a_nick_tmp; + +		optimize(m1, m2, parms); + +		return 0; +	}  }  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; +	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; -  double tan_nick_view, tan_dir_view, n_scale; -  double tan_nick_m1, tan_dir_m1; -  double tan_nick_m2, tan_dir_m2; -  double d_m1_2, d_m2_2, d_m1_m2_2; - -  d_m1_2 = pow(m1->x, 2.0) + pow(m1->y, 2.0); -  d_m2_2 = pow(m2->x, 2.0) + pow(m2->y, 2.0); -  d_m1_m2_2 = pow(m1->x - m2->x, 2.0) + pow(m1->y - m2->y, 2.0); - -  tan_nick_view = tan(parms->a_nick); -  tan_dir_view = tan(parms->a_center); -  n_scale = parms->scale; -  tan_dir_m1 = tan(m1->alph); -  tan_nick_m1 = tan(m1->a_nick); -  tan_dir_m2 = tan(m2->alph); -  tan_nick_m2 = tan(m2->a_nick); - -  for (i=0; i<5; i++) { -    opt_step(&tan_nick_view, &tan_dir_view, &n_scale,  -             tan_dir_m1, tan_nick_m1, tan_dir_m2, tan_nick_m2, -	     d_m1_2, d_m2_2, d_m1_m2_2); -  } - -  if (isnan(tan_dir_view) || isnan(tan_nick_view) || isnan(n_scale)) { -    fprintf(stderr, "No solution found.\n"); -    return 1; -  } - -  parms->a_center = atan(tan_dir_view); -  parms->a_nick = atan(tan_nick_view); - -  if (parms->a_center > 2.0 * pi_d) { -    parms->a_center = parms->a_center - 2.0 * pi_d; -  } else if (parms->a_center < 0.0) { -    parms->a_center = parms->a_center + 2.0 * pi_d; -  } - -  // atan(tan_dir_view) is not the only possible solution. -  // Choose the one which is close to m1->alph. -  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  -  if (d_m1_2 > d_m2_2) { -    parms->a_tilt = comp_tilt(tan_nick_view, tan_dir_view, n_scale,  -                       tan_nick_m1, tan_dir_m1, -		       (double) m1->x, (double) m1->y, pi_d); -  } else { -    parms->a_tilt = comp_tilt(tan_nick_view, tan_dir_view, n_scale,  -	 tan_nick_m2, tan_dir_m2, -	 (double) m2->x, (double) m2->y, pi_d); -  } - -  return 0; +	int i; +	double tan_nick_view, tan_dir_view, n_scale; +	double tan_nick_m1, tan_dir_m1; +	double tan_nick_m2, tan_dir_m2; +	double d_m1_2, d_m2_2, d_m1_m2_2; + +	d_m1_2 = pow(m1->x, 2.0) + pow(m1->y, 2.0); +	d_m2_2 = pow(m2->x, 2.0) + pow(m2->y, 2.0); +	d_m1_m2_2 = pow(m1->x - m2->x, 2.0) + pow(m1->y - m2->y, 2.0); + +	tan_nick_view = tan(parms->a_nick); +	tan_dir_view = tan(parms->a_center); +	n_scale = parms->scale; +	tan_dir_m1 = tan(m1->alph); +	tan_nick_m1 = tan(m1->a_nick); +	tan_dir_m2 = tan(m2->alph); +	tan_nick_m2 = tan(m2->a_nick); + +	for (i=0; i<5; i++) { +		opt_step(&tan_nick_view, &tan_dir_view, &n_scale,  +			tan_dir_m1, tan_nick_m1, tan_dir_m2, tan_nick_m2, +			d_m1_2, d_m2_2, d_m1_m2_2); +	} + +	if (isnan(tan_dir_view) || isnan(tan_nick_view) || isnan(n_scale)) { +		fprintf(stderr, "No solution found.\n"); +		return 1; +	} + +	parms->a_center = atan(tan_dir_view); +	parms->a_nick = atan(tan_nick_view); + +	if (parms->a_center > 2.0 * pi_d) { +		parms->a_center = parms->a_center - 2.0 * pi_d; +	} else if (parms->a_center < 0.0) { +		parms->a_center = parms->a_center + 2.0 * pi_d; +	} + +	// atan(tan_dir_view) is not the only possible solution. +	// Choose the one which is close to m1->alph. +	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  +	if (d_m1_2 > d_m2_2) { +		parms->a_tilt = comp_tilt(tan_nick_view, tan_dir_view, n_scale,  +			tan_nick_m1, tan_dir_m1, +			(double) m1->x, (double) m1->y, pi_d); +	} else { +		parms->a_tilt = comp_tilt(tan_nick_view, tan_dir_view, n_scale,  +			tan_nick_m2, tan_dir_m2, +			(double) m2->x, (double) m2->y, pi_d); +	} + +	return 0;  }  void   ProjectionTangential::get_coordinates(double a_view, double a_nick,  	const ViewParams *parms, double *x, double *y) { -  double x_tmp, y_tmp; +	double x_tmp, y_tmp; -  x_tmp = tan(a_view) * parms->scale; -  y_tmp = - (tan(a_nick - parms->a_nick) * parms->scale); +	x_tmp = tan(a_view) * parms->scale; +	y_tmp = - (tan(a_nick - parms->a_nick) * parms->scale); -  // rotate by a_tilt; -  *x = x_tmp * cos(parms->a_tilt) - y_tmp * sin(parms->a_tilt); -  *y = x_tmp * sin(parms->a_tilt) + y_tmp * cos(parms->a_tilt); +	// rotate by a_tilt; +	*x = x_tmp * cos(parms->a_tilt) - y_tmp * sin(parms->a_tilt); +	*y = x_tmp * sin(parms->a_tilt) + y_tmp * cos(parms->a_tilt);  }  double  ProjectionTangential::comp_center_angle(double a1, double a2, double d1, double d2) { -  double sign1 = 1.0; -  double tan_acenter, tan_a1, tan_a2, a_center; +	double sign1 = 1.0; +	double tan_acenter, tan_a1, tan_a2, a_center; -  tan_a1 = tan(a1); -  tan_a2 = tan(a2); +	tan_a1 = tan(a1); +	tan_a2 = tan(a2); -  tan_acenter = (((pow(((pow((1.0 + (tan_a1 * tan_a2)), 2.0) * ((d1 * d1) + (d2 * d2))) + (2.0 * d1 * d2 * ((2.0 * ((tan_a2 * tan_a1) - (tan_a2 * tan_a2))) - ((tan_a1 * tan_a1) * (2.0 + (tan_a2 * tan_a2))) - 1.0))), (1.0 / 2.0)) * sign1) + ((1.0 - (tan_a1 * tan_a2)) * (d1 - d2))) / (2.0 * ((d2 * tan_a2) - (d1 * tan_a1)))); +	tan_acenter = (((pow(((pow((1.0 + (tan_a1 * tan_a2)), 2.0) * ((d1 * d1) + (d2 * d2))) + (2.0 * d1 * d2 * ((2.0 * ((tan_a2 * tan_a1) - (tan_a2 * tan_a2))) - ((tan_a1 * tan_a1) * (2.0 + (tan_a2 * tan_a2))) - 1.0))), (1.0 / 2.0)) * sign1) + ((1.0 - (tan_a1 * tan_a2)) * (d1 - d2))) / (2.0 * ((d2 * tan_a2) - (d1 * tan_a1)))); -  a_center = atan(tan_acenter); +	a_center = atan(tan_acenter); -  if (a_center > 2.0 * pi_d) { -     a_center = a_center - 2.0 * pi_d; -  } else if (a_center < 0.0) { -     a_center = a_center + 2.0 * pi_d; -  } +	if (a_center > 2.0 * pi_d) { +		a_center = a_center - 2.0 * pi_d; +	} else if (a_center < 0.0) { +		a_center = a_center + 2.0 * pi_d; +	} -  // atan(tan_dir_view) is not the only possible solution. -  // Choose the one which is close to m1->alph. -  if (fabs(a_center - a1) > pi_d/2.0) { -    a_center = a_center + pi_d; -  } +	// atan(tan_dir_view) is not the only possible solution. +	// Choose the one which is close to m1->alph. +	if (fabs(a_center - a1) > pi_d/2.0) { +		a_center = a_center + pi_d; +	} -  return a_center;  +	return a_center;   }  double  ProjectionTangential::comp_scale(double a1, double a2, double d1, double d2) { -  double sign1 = 1.0; -  double sc, tan_a1, tan_a2; +	double sign1 = 1.0; +	double sc, tan_a1, tan_a2; -  tan_a1 = tan(a1); -  tan_a2 = tan(a2); -   -  sc = ((((1.0 + (tan_a1 * tan_a2)) * (d1 - d2)) - (sign1 * pow((((1.0 + pow((tan_a1 * tan_a2), 2.0)) * ((d1 * d1) + (d2 * d2))) + (2.0 * ((tan_a1 * tan_a2 * pow((d1 + d2), 2.0)) - (d1 * d2 * (((tan_a1 * tan_a1) * (2.0 + (tan_a2 * tan_a2))) + 1.0 + (2.0 * (tan_a2 * tan_a2))))))), (1.0 / 2.0)))) / (2.0 * (tan_a1 - tan_a2))); +	tan_a1 = tan(a1); +	tan_a2 = tan(a2); -  return sc; +	sc = ((((1.0 + (tan_a1 * tan_a2)) * (d1 - d2)) - (sign1 * pow((((1.0 + pow((tan_a1 * tan_a2), 2.0)) * ((d1 * d1) + (d2 * d2))) + (2.0 * ((tan_a1 * tan_a2 * pow((d1 + d2), 2.0)) - (d1 * d2 * (((tan_a1 * tan_a1) * (2.0 + (tan_a2 * tan_a2))) + 1.0 + (2.0 * (tan_a2 * tan_a2))))))), (1.0 / 2.0)))) / (2.0 * (tan_a1 - tan_a2))); + +	return sc;  }  static int  get_matrix(double m[],  -	   double tan_nick_view, double tan_dir_view, double n_scale, -	   double tan_dir_m1, double tan_nick_m1, -	   double tan_dir_m2, double tan_nick_m2) { -   -  m[0] = pow(n_scale,2.0)*(1.0/pow((tan_nick_m1*tan_nick_view + 1.0),2.0)*(2.0*tan_nick_m1 - 2.0 * tan_nick_view) + 2.0*tan_nick_m1*pow((tan_nick_m1 - tan_nick_view), 2.0)/pow((tan_nick_m1*tan_nick_view + 1.0), 3.0)); +	double tan_nick_view, double tan_dir_view, double n_scale, +	double tan_dir_m1, double tan_nick_m1, +	double tan_dir_m2, double tan_nick_m2) { + +	m[0] = pow(n_scale,2.0)*(1.0/pow((tan_nick_m1*tan_nick_view + 1.0),2.0)*(2.0*tan_nick_m1 - 2.0 * tan_nick_view) + 2.0*tan_nick_m1*pow((tan_nick_m1 - tan_nick_view), 2.0)/pow((tan_nick_m1*tan_nick_view + 1.0), 3.0)); -  m[1] = pow(n_scale, 2.0) *(1.0/pow((tan_dir_m1*tan_dir_view + 1.0), 2.0) * (2.0*tan_dir_m1 - 2.0*tan_dir_view) + 2.0*tan_dir_m1*pow((tan_dir_m1 - tan_dir_view),2.0) / pow((tan_dir_m1*tan_dir_view + 1.0), 3.0)); +	m[1] = pow(n_scale, 2.0) *(1.0/pow((tan_dir_m1*tan_dir_view + 1.0), 2.0) * (2.0*tan_dir_m1 - 2.0*tan_dir_view) + 2.0*tan_dir_m1*pow((tan_dir_m1 - tan_dir_view),2.0) / pow((tan_dir_m1*tan_dir_view + 1.0), 3.0)); -  m[2] = -2.0*n_scale*(pow((tan_dir_m1 - tan_dir_view), 2.0)/pow((tan_dir_m1*tan_dir_view + 1.0), 2.0) + pow((tan_nick_m1 - tan_nick_view), 2.0)/pow((tan_nick_m1*tan_nick_view + 1.0), 2.0)); +	m[2] = -2.0*n_scale*(pow((tan_dir_m1 - tan_dir_view), 2.0)/pow((tan_dir_m1*tan_dir_view + 1.0), 2.0) + pow((tan_nick_m1 - tan_nick_view), 2.0)/pow((tan_nick_m1*tan_nick_view + 1.0), 2.0)); -  m[3] = pow(n_scale, 2.0)*(1.0/pow((tan_nick_m2*tan_nick_view + 1.0), 2.0)*(2.0*tan_nick_m2 - 2.0*tan_nick_view) + 2.0*tan_nick_m2*pow((tan_nick_m2 - tan_nick_view), 2.0)/pow((tan_nick_m2*tan_nick_view + 1.0), 3.0)); +	m[3] = pow(n_scale, 2.0)*(1.0/pow((tan_nick_m2*tan_nick_view + 1.0), 2.0)*(2.0*tan_nick_m2 - 2.0*tan_nick_view) + 2.0*tan_nick_m2*pow((tan_nick_m2 - tan_nick_view), 2.0)/pow((tan_nick_m2*tan_nick_view + 1.0), 3.0)); -  m[4] = pow(n_scale, 2.0)*(1.0/pow((tan_dir_m2*tan_dir_view + 1.0), 2.0)*(2.0*tan_dir_m2 - 2.0*tan_dir_view) + 2.0*tan_dir_m2*pow((tan_dir_m2 - tan_dir_view), 2.0)/pow((tan_dir_m2*tan_dir_view + 1.0), 3.0)); +	m[4] = pow(n_scale, 2.0)*(1.0/pow((tan_dir_m2*tan_dir_view + 1.0), 2.0)*(2.0*tan_dir_m2 - 2.0*tan_dir_view) + 2.0*tan_dir_m2*pow((tan_dir_m2 - tan_dir_view), 2.0)/pow((tan_dir_m2*tan_dir_view + 1.0), 3.0)); -  m[5] = -2.0*n_scale*(pow((tan_dir_m2 - tan_dir_view), 2.0)/pow((tan_dir_m2*tan_dir_view + 1.0), 2.0) + pow((tan_nick_m2 - tan_nick_view), 2.0)/pow((tan_nick_m2*tan_nick_view + 1.0), 2.0)); +	m[5] = -2.0*n_scale*(pow((tan_dir_m2 - tan_dir_view), 2.0)/pow((tan_dir_m2*tan_dir_view + 1.0), 2.0) + pow((tan_nick_m2 - tan_nick_view), 2.0)/pow((tan_nick_m2*tan_nick_view + 1.0), 2.0)); -  m[6] = 2.0*(n_scale*(tan_nick_m1 - tan_nick_view)/(tan_nick_m1*tan_nick_view + 1.0) - n_scale*(tan_nick_m2 - tan_nick_view)/(tan_nick_m2*tan_nick_view + 1.0))*(n_scale/(tan_nick_m1*tan_nick_view + 1.0) - n_scale/(tan_nick_m2*tan_nick_view + 1.0) + tan_nick_m1*n_scale*(tan_nick_m1 - tan_nick_view)/pow((tan_nick_m1*tan_nick_view + 1.0), 2.0) - tan_nick_m2*n_scale*(tan_nick_m2 - tan_nick_view)/pow((tan_nick_m2*tan_nick_view + 1.0),2.0)); +	m[6] = 2.0*(n_scale*(tan_nick_m1 - tan_nick_view)/(tan_nick_m1*tan_nick_view + 1.0) - n_scale*(tan_nick_m2 - tan_nick_view)/(tan_nick_m2*tan_nick_view + 1.0))*(n_scale/(tan_nick_m1*tan_nick_view + 1.0) - n_scale/(tan_nick_m2*tan_nick_view + 1.0) + tan_nick_m1*n_scale*(tan_nick_m1 - tan_nick_view)/pow((tan_nick_m1*tan_nick_view + 1.0), 2.0) - tan_nick_m2*n_scale*(tan_nick_m2 - tan_nick_view)/pow((tan_nick_m2*tan_nick_view + 1.0),2.0)); -  m[7] = 2.0*(n_scale*(tan_dir_m1 - tan_dir_view)/(tan_dir_m1*tan_dir_view + 1.0) - n_scale*(tan_dir_m2 - tan_dir_view)/(tan_dir_m2*tan_dir_view + 1.0))*(n_scale/(tan_dir_m1*tan_dir_view + 1.0) - n_scale/(tan_dir_m2*tan_dir_view + 1.0) + tan_dir_m1*n_scale*(tan_dir_m1 - tan_dir_view)/pow((tan_dir_m1*tan_dir_view + 1.0), 2.0) - tan_dir_m2*n_scale*(tan_dir_m2 - tan_dir_view)/pow((tan_dir_m2*tan_dir_view + 1.0), 2.0)); +	m[7] = 2.0*(n_scale*(tan_dir_m1 - tan_dir_view)/(tan_dir_m1*tan_dir_view + 1.0) - n_scale*(tan_dir_m2 - tan_dir_view)/(tan_dir_m2*tan_dir_view + 1.0))*(n_scale/(tan_dir_m1*tan_dir_view + 1.0) - n_scale/(tan_dir_m2*tan_dir_view + 1.0) + tan_dir_m1*n_scale*(tan_dir_m1 - tan_dir_view)/pow((tan_dir_m1*tan_dir_view + 1.0), 2.0) - tan_dir_m2*n_scale*(tan_dir_m2 - tan_dir_view)/pow((tan_dir_m2*tan_dir_view + 1.0), 2.0)); -  m[8] = - 2.0*(n_scale*(tan_dir_m1 - tan_dir_view)/(tan_dir_m1*tan_dir_view + 1.0) - n_scale*(tan_dir_m2 - tan_dir_view)/(tan_dir_m2*tan_dir_view + 1.0))*((tan_dir_m1 - tan_dir_view)/(tan_dir_m1*tan_dir_view + 1.0) - (tan_dir_m2 - tan_dir_view)/(tan_dir_m2*tan_dir_view + 1.0)) - 2.0*(n_scale*(tan_nick_m1 - tan_nick_view)/(tan_nick_m1*tan_nick_view + 1.0) - n_scale*(tan_nick_m2 - tan_nick_view)/(tan_nick_m2*tan_nick_view + 1.0))*((tan_nick_m1 - tan_nick_view)/(tan_nick_m1*tan_nick_view + 1.0) - (tan_nick_m2 - tan_nick_view)/(tan_nick_m2*tan_nick_view + 1.0)); +	m[8] = - 2.0*(n_scale*(tan_dir_m1 - tan_dir_view)/(tan_dir_m1*tan_dir_view + 1.0) - n_scale*(tan_dir_m2 - tan_dir_view)/(tan_dir_m2*tan_dir_view + 1.0))*((tan_dir_m1 - tan_dir_view)/(tan_dir_m1*tan_dir_view + 1.0) - (tan_dir_m2 - tan_dir_view)/(tan_dir_m2*tan_dir_view + 1.0)) - 2.0*(n_scale*(tan_nick_m1 - tan_nick_view)/(tan_nick_m1*tan_nick_view + 1.0) - n_scale*(tan_nick_m2 - tan_nick_view)/(tan_nick_m2*tan_nick_view + 1.0))*((tan_nick_m1 - tan_nick_view)/(tan_nick_m1*tan_nick_view + 1.0) - (tan_nick_m2 - tan_nick_view)/(tan_nick_m2*tan_nick_view + 1.0)); -  return 0; +	return 0;  }  static int opt_step(double *tan_nick_view,  -		    double *tan_dir_view, -		    double *n_scale, -		    double tan_dir_m1, -		    double tan_nick_m1, -		    double tan_dir_m2, -		    double tan_nick_m2, -		    double d_m1_2, double d_m2_2, double d_m1_m2_2) { -  double a[9]; -  double b[3]; -  double a_x0[3], f_x0 [3], x0[3]; -  int ret; +	double *tan_dir_view, +	double *n_scale, +	double tan_dir_m1, +	double tan_nick_m1, +	double tan_dir_m2, +	double tan_nick_m2, +	double d_m1_2, double d_m2_2, double d_m1_m2_2) { +	double a[9]; +	double b[3]; +	double a_x0[3], f_x0 [3], x0[3]; +	int ret; + +	get_matrix(a, *tan_nick_view, *tan_dir_view, *n_scale,  +		tan_dir_m1, tan_nick_m1, tan_dir_m2, tan_nick_m2); -  get_matrix(a, *tan_nick_view, *tan_dir_view, *n_scale,  -	     tan_dir_m1, tan_nick_m1, tan_dir_m2, tan_nick_m2); +	f_x0[0] = d_m1_2 - (pow((*tan_nick_view-tan_nick_m1),2.0)/pow((tan_nick_m1**tan_nick_view+1), 2.0)+pow((*tan_dir_view-tan_dir_m1),2.0)/pow((tan_dir_m1**tan_dir_view+1),2.0))*pow(*n_scale, 2.0); -  f_x0[0] = d_m1_2 - (pow((*tan_nick_view-tan_nick_m1),2.0)/pow((tan_nick_m1**tan_nick_view+1), 2.0)+pow((*tan_dir_view-tan_dir_m1),2.0)/pow((tan_dir_m1**tan_dir_view+1),2.0))*pow(*n_scale, 2.0); +	f_x0[1] = d_m2_2 - (pow((*tan_nick_view-tan_nick_m2),2.0)/pow((tan_nick_m2**tan_nick_view+1),2.0)+pow((*tan_dir_view-tan_dir_m2),2.0)/pow((tan_dir_m2**tan_dir_view+1),2.0))*pow(*n_scale, 2.0); -  f_x0[1] = d_m2_2 - (pow((*tan_nick_view-tan_nick_m2),2.0)/pow((tan_nick_m2**tan_nick_view+1),2.0)+pow((*tan_dir_view-tan_dir_m2),2.0)/pow((tan_dir_m2**tan_dir_view+1),2.0))*pow(*n_scale, 2.0); +	f_x0[2] = d_m1_m2_2 - (pow((- (((*tan_dir_view - tan_dir_m1) * *n_scale) / (tan_dir_m1 * *tan_dir_view + 1.0)) + (((*tan_dir_view - tan_dir_m2) * *n_scale) / (tan_dir_m2 * *tan_dir_view + 1))), 2.0) + pow((- (((*tan_nick_view - tan_nick_m1) * *n_scale) / (tan_nick_m1 * *tan_nick_view + 1)) + ((*tan_nick_view - tan_nick_m2) * *n_scale) / (tan_nick_m2 * *tan_nick_view + 1)), 2.0)); -  f_x0[2] = d_m1_m2_2 - (pow((- (((*tan_dir_view - tan_dir_m1) * *n_scale) / (tan_dir_m1 * *tan_dir_view + 1.0)) + (((*tan_dir_view - tan_dir_m2) * *n_scale) / (tan_dir_m2 * *tan_dir_view + 1))), 2.0) + pow((- (((*tan_nick_view - tan_nick_m1) * *n_scale) / (tan_nick_m1 * *tan_nick_view + 1)) + ((*tan_nick_view - tan_nick_m2) * *n_scale) / (tan_nick_m2 * *tan_nick_view + 1)), 2.0)); +	x0[0] = *tan_nick_view; +	x0[1] = *tan_dir_view; +	x0[2] = *n_scale; -  x0[0] = *tan_nick_view; -  x0[1] = *tan_dir_view; -  x0[2] = *n_scale; +	rmmult(a_x0, a, x0, 3, 3, 1); -  rmmult(a_x0, a, x0, 3, 3, 1); -     -  b[0] = a_x0[0] - f_x0[0]; -  b[1] = a_x0[1] - f_x0[1]; -  b[2] = a_x0[2] - f_x0[2]; +	b[0] = a_x0[0] - f_x0[0]; +	b[1] = a_x0[1] - f_x0[1]; +	b[2] = a_x0[2] - f_x0[2]; -  ret = solv(a, b, 3); +	ret = solv(a, b, 3); -  *tan_nick_view = b[0]; -  *tan_dir_view  = b[1]; -  *n_scale       = b[2]; +	*tan_nick_view = b[0]; +	*tan_dir_view  = b[1]; +	*n_scale       = b[2]; -  return 0; +	return 0;  }  static double  comp_tilt(double tan_nick_view, double tan_dir_view, double n_scale, -	  double tan_nick_m, double tan_dir_m, -	  double x, double y, double pi_d) { -  double y_tmp, x_tmp, sin_a_tilt1, sin_a_tilt2, sin_a_tilt, res; +	double tan_nick_m, double tan_dir_m, +	double x, double y, double pi_d) { +	double y_tmp, x_tmp, sin_a_tilt1, sin_a_tilt2, sin_a_tilt, res; -  y_tmp = - (((tan_nick_view - tan_nick_m) * n_scale) /  -	     (tan_nick_m * tan_nick_view + 1)); -  x_tmp = - (((tan_dir_view - tan_dir_m) * n_scale) /  -	     (tan_dir_m * tan_dir_view + 1)); +	y_tmp = - (((tan_nick_view - tan_nick_m) * n_scale) /  +		(tan_nick_m * tan_nick_view + 1)); +	x_tmp = - (((tan_dir_view - tan_dir_m) * n_scale) /  +		(tan_dir_m * tan_dir_view + 1)); -  sin_a_tilt1 = - (y * - pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) / -    (x*x + y*y); +	sin_a_tilt1 = - (y * - pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) / +		(x*x + y*y); -  sin_a_tilt2 = - (y * pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) /  -    (x*x + y*y); +	sin_a_tilt2 = - (y * pow(x*x + y*y - y_tmp*y_tmp, 0.5) - x * y_tmp) /  +		(x*x + y*y); -  sin_a_tilt = fabs(sin_a_tilt1) < fabs(sin_a_tilt2)?sin_a_tilt1:sin_a_tilt2; +	sin_a_tilt = fabs(sin_a_tilt1) < fabs(sin_a_tilt2)?sin_a_tilt1:sin_a_tilt2; -  res = asin(sin_a_tilt); +	res = asin(sin_a_tilt); -  if (res > pi_d / 4.0) { -    res = res - pi_d / 2.0; -  } else if (res < -pi_d / 4.0) { -    res = res + pi_d / 2.0; -  } +	if (res > pi_d / 4.0) { +		res = res - pi_d / 2.0; +	} else if (res < -pi_d / 4.0) { +		res = res + pi_d / 2.0; +	} -  return res; +	return res;  } diff --git a/src/Stitch.H b/src/Stitch.H index d29c2e9..49dd6b8 100644 --- a/src/Stitch.H +++ b/src/Stitch.H @@ -12,19 +12,19 @@  #define MAX_PICS 256 -		 +  class Stitch {  	private:  		GipfelWidget *gipf[MAX_PICS];  		OutputImage *single_images[MAX_PICS];  		OutputImage *merged_image; -		 +  	public:  		Stitch();  		~Stitch(); -		 +  		int load_image(char *file);  		OutputImage * set_output(OutputImage *img); diff --git a/src/Stitch.cxx b/src/Stitch.cxx index f378747..7e8f909 100644 --- a/src/Stitch.cxx +++ b/src/Stitch.cxx @@ -78,12 +78,12 @@ Stitch::set_output(const char *file, OutputImage *img) {  int  Stitch::resample(int w, int h, -            double view_start, double view_end) { +	double view_start, double view_end) {  	double step_view = (view_end - view_start) / w;  	char r, g, b;  	int y_off = h / 2;  	int merged_pixel_set; - 	double radius = (double) w / (view_end -view_start); +	double radius = (double) w / (view_end -view_start);  	if (merged_image) {  		merged_image->init(w, h); diff --git a/src/ViewParams.H b/src/ViewParams.H index b6f34a2..d321253 100644 --- a/src/ViewParams.H +++ b/src/ViewParams.H @@ -8,11 +8,11 @@  #define VIEWPARAMS_H  class ViewParams { - public: -  double a_center; -  double scale; -  double a_nick; -  double a_tilt; +	public: +		double a_center; +		double scale; +		double a_nick; +		double a_tilt;  };  #endif diff --git a/src/choose_hill.cxx b/src/choose_hill.cxx index d3477f3..879e18a 100644 --- a/src/choose_hill.cxx +++ b/src/choose_hill.cxx @@ -11,30 +11,30 @@  Hill*  choose_hill(const Hills *hills, const char *l) { -  Fl_Search_Chooser *sc = new Fl_Search_Chooser(l?l:"Choose Hill"); -  Hills *h_sort = new Hills(hills); -  Hill *ret; - -  h_sort->sort_name(); -   -  for (int i=0; i<h_sort->get_num(); i++) { -    Hill *m = h_sort->get(i); -    if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { -      continue; -    }  -    sc->add(m->name, m); -  }  -   -  delete h_sort; -   -  sc->show(); -  while (sc->shown()) { -    Fl::wait(); -  }  -   -  ret = (Hill*) sc->data(); - -  delete(sc); - -  return ret; +	Fl_Search_Chooser *sc = new Fl_Search_Chooser(l?l:"Choose Hill"); +	Hills *h_sort = new Hills(hills); +	Hill *ret; + +	h_sort->sort_name(); + +	for (int i=0; i<h_sort->get_num(); i++) { +		Hill *m = h_sort->get(i); +		if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { +			continue; +		}  +		sc->add(m->name, m); +	}  + +	delete h_sort; + +	sc->show(); +	while (sc->shown()) { +		Fl::wait(); +	}  + +	ret = (Hill*) sc->data(); + +	delete(sc); + +	return ret;  } @@ -12,48 +12,48 @@  FILE *  pexecvp(const char *file, char *const argv[], pid_t *pid, char *type) { -  FILE *iop; -  int   pdes[2]; +	FILE *iop; +	int   pdes[2]; -  if (pipe(pdes) < 0) { -    return NULL; -  } -	 -  *pid = vfork(); +	if (pipe(pdes) < 0) { +		return NULL; +	} -  if (*pid == -1) { -    perror("vfork"); -    close(pdes[0]); -    close(pdes[1]); -    return NULL; -  } else if (*pid == 0) { -    /* child */ -     -    if (*type == 'r') { -      close(pdes[0]); -      if (pdes[1] != STDOUT_FILENO) { -	dup2(pdes[1], STDOUT_FILENO); -	close(pdes[1]); -      } -    } else { -      close(pdes[1]); -      if (pdes[0] != STDIN_FILENO) { -	dup2(pdes[0], STDIN_FILENO); -	close(pdes[0]); -      } -    } +	*pid = vfork(); -    execvp(file, argv); -    exit(127); -  } else { -    /* parent */  -    if (*type == 'r') { -      iop = fdopen(pdes[0], "r"); -      close(pdes[1]); -    } else { -      iop = fdopen(pdes[1], "w"); -      close(pdes[0]); -    } -    return iop; -  } +	if (*pid == -1) { +		perror("vfork"); +		close(pdes[0]); +		close(pdes[1]); +		return NULL; +	} else if (*pid == 0) { +		/* child */ + +		if (*type == 'r') { +			close(pdes[0]); +			if (pdes[1] != STDOUT_FILENO) { +				dup2(pdes[1], STDOUT_FILENO); +				close(pdes[1]); +			} +		} else { +			close(pdes[1]); +			if (pdes[0] != STDIN_FILENO) { +				dup2(pdes[0], STDIN_FILENO); +				close(pdes[0]); +			} +		} + +		execvp(file, argv); +		exit(127); +	} else { +		/* parent */  +		if (*type == 'r') { +			iop = fdopen(pdes[0], "r"); +			close(pdes[1]); +		} else { +			iop = fdopen(pdes[1], "w"); +			close(pdes[0]); +		} +		return iop; +	}  } @@ -13,8 +13,8 @@  extern "C" {  #endif -FILE * -pexecvp(const char *file, char *const argv[], pid_t *pid, char *type); +	FILE * +		pexecvp(const char *file, char *const argv[], pid_t *pid, char *type);  #ifdef __cplusplus  } | 
