diff options
| -rw-r--r-- | src/GipfelWidget.H | 4 | ||||
| -rw-r--r-- | src/GipfelWidget.cxx | 14 | ||||
| -rw-r--r-- | src/ImageMetaData.H | 5 | ||||
| -rw-r--r-- | src/ImageMetaData.cxx | 14 | ||||
| -rw-r--r-- | src/Panorama.H | 4 | ||||
| -rw-r--r-- | src/Panorama.cxx | 8 | ||||
| -rw-r--r-- | src/gipfel.cxx | 51 | 
7 files changed, 62 insertions, 38 deletions
diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H index 3671a87..a17009a 100644 --- a/src/GipfelWidget.H +++ b/src/GipfelWidget.H @@ -115,9 +115,9 @@ class GipfelWidget : public Fl_Widget {  		void set_projection(ProjectionLSQ::Projection_t p); -		void get_distortion_params(double *k0, double *k1); +		void get_distortion_params(double *k0, double *k1i, double *x0); -		void set_distortion_params(double k0, double k1); +		void set_distortion_params(double k0, double k1, double x0);  		Hills *get_mountains(); diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 53fc25b..eb40590 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -99,7 +99,7 @@ GipfelWidget::load_image(char *file) {  	// 1. gipfel data in JPEG comment  	// 2. matching distortion profile  	// 3. set the to 0.0, 0.0 -	md->get_distortion_params(&pan->parms.k0, &pan->parms.k1); +	md->get_distortion_params(&pan->parms.k0, &pan->parms.k1, &pan->parms.x0);  	if (isnan(pan->parms.k0)) {  		char buf[1024];  		get_distortion_profile_name(buf, sizeof(buf)); @@ -138,7 +138,7 @@ GipfelWidget::save_image(char *file) {  	md->set_tilt(get_tilt_angle());  	md->set_focal_length_35mm(get_focal_length_35mm());  	md->set_projection_type((int) get_projection()); -	md->set_distortion_params(pan->parms.k0, pan->parms.k1); +	md->set_distortion_params(pan->parms.k0, pan->parms.k1, pan->parms.x0);  	ret = md->save_image(img_file, file);  	delete md; @@ -473,13 +473,13 @@ GipfelWidget::set_projection(ProjectionLSQ::Projection_t p) {  }  void -GipfelWidget::get_distortion_params(double *k0, double *k1) { -	pan->get_distortion_params(k0, k1); +GipfelWidget::get_distortion_params(double *k0, double *k1, double *x0) { +	pan->get_distortion_params(k0, k1, x0);  }  void -GipfelWidget::set_distortion_params(double k0, double k1) { -	pan->set_distortion_params(k0, k1); +GipfelWidget::set_distortion_params(double k0, double k1, double x0) { +	pan->set_distortion_params(k0, k1, x0);  	redraw();  } @@ -802,7 +802,7 @@ GipfelWidget::load_distortion_params(const char *prof_name) {  	Fl_Preferences prof(dist_prefs, prof_name);  	ret += prof.get("k0", pan->parms.k0, pan->parms.k0);  	ret += prof.get("k1", pan->parms.k1, pan->parms.k1); -	ret += prof.get("x0", pan->parms.k1, pan->parms.x0); +	ret += prof.get("x0", pan->parms.x0, pan->parms.x0);  	return !ret;  } diff --git a/src/ImageMetaData.H b/src/ImageMetaData.H index 27cbbd8..b7a5959 100644 --- a/src/ImageMetaData.H +++ b/src/ImageMetaData.H @@ -19,6 +19,7 @@ class ImageMetaData {  		double tilt;  		double k0;  		double k1; +		double x0;  		double focal_length;  		double focal_length_35mm;  		double scale; @@ -47,7 +48,7 @@ class ImageMetaData {  		double get_focal_length();  		double get_focal_length_35mm();  		int    get_projection_type(); -		void get_distortion_params(double *_k0, double *_k1); +		void get_distortion_params(double *_k0, double *_k1, double *_x0);  		void set_longitude(double v);  		void set_latitude(double v); @@ -57,6 +58,6 @@ class ImageMetaData {  		void set_tilt(double v);  		void set_focal_length_35mm(double v);  		void set_projection_type(int v); -		void set_distortion_params(double _k0, double _k1); +		void set_distortion_params(double _k0, double _k1, double _x0);  };  #endif diff --git a/src/ImageMetaData.cxx b/src/ImageMetaData.cxx index e9a1241..368a9ba 100644 --- a/src/ImageMetaData.cxx +++ b/src/ImageMetaData.cxx @@ -38,6 +38,7 @@ ImageMetaData::clear() {  	tilt = NAN;  	k0 = NAN;  	k1 = NAN; +	x0 = NAN;  	focal_length = NAN;  	focal_length_35mm = NAN;  	scale = NAN; @@ -159,7 +160,7 @@ ImageMetaData::load_image_exif(char *name) {  #define GIPFEL_FORMAT_1 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, scale %lf, projection type %d" -#define GIPFEL_FORMAT_2 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, focal_length_35mm %lf, projection type %d, k0 %lf, k1 %lf" +#define GIPFEL_FORMAT_2 "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, focal_length_35mm %lf, projection type %d, k0 %lf, k1 %lf, x0 %lf"  int  ImageMetaData::load_image_jpgcom(char *name) { @@ -168,7 +169,7 @@ ImageMetaData::load_image_jpgcom(char *name) {      pid_t pid;      int status;      char buf[1024]; -    double lo, la, he, dir, ni, ti, fr, _k0, _k1; +    double lo, la, he, dir, ni, ti, fr, _k0, _k1, _x0 = 0.0;      int pt = 0;      int n, ret = 1; @@ -181,7 +182,7 @@ ImageMetaData::load_image_jpgcom(char *name) {      if (p) {          while (fgets(buf, sizeof(buf), p) != NULL) {              if ((n = sscanf(buf, GIPFEL_FORMAT_2, -                    &lo, &la, &he, &dir, &ni, &ti, &fr, &pt, &_k0, &_k1)) >= 8) { +                    &lo, &la, &he, &dir, &ni, &ti, &fr, &pt, &_k0, &_k1, &_x0)) >= 8) {                  longitude = lo;                  latitude  = la; @@ -195,6 +196,7 @@ ImageMetaData::load_image_jpgcom(char *name) {  				if (n >= 10) {  					k0 = _k0;  					k1 = _k1; +					x0 = _x0;  				}                  ret = 0; @@ -395,13 +397,15 @@ ImageMetaData::set_projection_type(int v) {  }  void -ImageMetaData::get_distortion_params(double *_k0, double *_k1) { +ImageMetaData::get_distortion_params(double *_k0, double *_k1, double *_x0) {  	*_k0 = k0;	  	*_k1 = k1;	 +	*_x0 = x0;	  }  void -ImageMetaData::set_distortion_params(double _k0, double _k1) { +ImageMetaData::set_distortion_params(double _k0, double _k1, double _x0) {  	k0 = _k0;	  	k1 = _k1;	 +	x0 = _x0;	  } diff --git a/src/Panorama.H b/src/Panorama.H index 3d5b260..d5ebb37 100644 --- a/src/Panorama.H +++ b/src/Panorama.H @@ -124,9 +124,9 @@ class Panorama {  		void set_projection(ProjectionLSQ::Projection_t p); -		void get_distortion_params(double *k0, double *k1); +		void get_distortion_params(double *k0, double *k1, double *x0); -		void set_distortion_params(double k0, double k1); +		void set_distortion_params(double k0, double k1, double x0);  		int get_coordinates(double a_alph, double a_nick, double *x, double *y);  }; diff --git a/src/Panorama.cxx b/src/Panorama.cxx index 839d70c..7b1529b 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -166,15 +166,17 @@ Panorama::set_scale(double s) {  }  void -Panorama::get_distortion_params(double *k0, double *k1) { +Panorama::get_distortion_params(double *k0, double *k1, double *x0) {  	*k0 = parms.k0;  	*k1 = parms.k1; +	*x0 = parms.x0;  }  void -Panorama::set_distortion_params(double k0, double k1) { +Panorama::set_distortion_params(double k0, double k1, double x0) {  	parms.k0 = k0;  	parms.k1 = k1; +	parms.x0 = x0;  	update_coordinates();  } @@ -451,7 +453,7 @@ Panorama::get_earth_radius(double phi) {  	double b = 6356752.315;  	double r;  	double ata = tan(phi); - +return EARTH_RADIUS;  	r = a*pow(pow(ata,2)+1,1.0/2.0)*fabs(b)*pow(pow(b,2)+pow(a,2)*pow(ata,2),-1.0/2.0);  	return r; diff --git a/src/gipfel.cxx b/src/gipfel.cxx index bb58586..5807ae5 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -46,7 +46,7 @@ Fl_Window *control_win, *view_win;  Fl_Dial *s_center = NULL;  Fl_Slider *s_nick, *s_focal_length, *s_tilt, *s_height_dist, *s_track_width;  Fl_Value_Input *i_view_lat, *i_view_long, *i_view_height; -Fl_Value_Input *i_distortion_k0, *i_distortion_k1; +Fl_Value_Input *i_distortion_k0, *i_distortion_k1, *i_distortion_x0;  Fl_Box *b_viewpoint;  Fl_Menu_Bar *mb; @@ -58,7 +58,7 @@ static int stitch(GipfelWidget::sample_mode_t m ,int stitch_w, int stitch_h,  	double from, double to, int type, const char *path, int argc, char **argv);  void set_values() { -	double k0 = 0.0, k1 = 0.0; +	double k0 = 0.0, k1 = 0.0, x0 = 0.0;  	s_center->value(gipf->get_center_angle());  	s_nick->value(gipf->get_nick_angle()); @@ -77,9 +77,10 @@ void set_values() {  		mb->mode(8, FL_MENU_RADIO);  	} -	gipf->get_distortion_params(&k0, &k1); +	gipf->get_distortion_params(&k0, &k1, &x0);  	i_distortion_k0->value(k0);  	i_distortion_k1->value(k1); +	i_distortion_x0->value(x0);  }  void quit_cb() { @@ -174,12 +175,12 @@ void comp_cb(Fl_Widget *, void *) {  void save_distortion_cb(Fl_Widget *, void *) {  	char buf[1024];  	const char * prof_name; -	double k0, k1; +	double k0, k1, x0; -	gipf->get_distortion_params(&k0, &k1); +	gipf->get_distortion_params(&k0, &k1, &x0);  	gipf->get_distortion_profile_name(buf, sizeof(buf)); -	prof_name = fl_input("Save Distortion Profile (k0=%f, k1=%f)", -		buf, k0, k1); +	prof_name = fl_input("Save Distortion Profile (k0=%f, k1=%f, x0=%f)", +		buf, k0, k1, x0);  	if (prof_name == NULL) {  		return; @@ -208,8 +209,10 @@ void load_distortion_cb(Fl_Widget *, void *) {  }  void distortion_cb(Fl_Value_Input*, void*) { -	gipf->set_distortion_params(i_distortion_k0->value(), -		i_distortion_k1->value()); +	gipf->set_distortion_params( +		i_distortion_k0->value(), +		i_distortion_k1->value(), +		i_distortion_x0->value());  }  void about_cb() { @@ -355,23 +358,31 @@ create_control_window() {  	i_view_height->when(FL_WHEN_ENTER_KEY);  	i_view_height->callback((Fl_Callback*)view_height_cb); -	i_distortion_k0 = new Fl_Value_Input(235, 220, 80, 20, "Distortion (k0)"); +	i_distortion_k0 = new Fl_Value_Input(250, 200, 80, 20, "k0");  	i_distortion_k0->labelsize(10);  	i_distortion_k0->textsize(10); -	i_distortion_k0->align(FL_ALIGN_TOP); +	i_distortion_k0->align(FL_ALIGN_LEFT);  	i_distortion_k0->when(FL_WHEN_ENTER_KEY);  	i_distortion_k0->callback((Fl_Callback*)distortion_cb); -	i_distortion_k1 = new Fl_Value_Input(315, 220, 80,  20, "Distortion (k1)"); +	i_distortion_k1 = new Fl_Value_Input(250, 225, 80,  20, "k1");  	i_distortion_k1->labelsize(10);  	i_distortion_k1->textsize(10); -	i_distortion_k1->align(FL_ALIGN_TOP); +	i_distortion_k1->align(FL_ALIGN_LEFT);  	i_distortion_k1->when(FL_WHEN_ENTER_KEY);  	i_distortion_k1->callback((Fl_Callback*)distortion_cb); +	i_distortion_x0 = new Fl_Value_Input(250, 250, 80,  20, "x0"); +	i_distortion_x0->labelsize(10); +	i_distortion_x0->textsize(10); +	i_distortion_x0->align(FL_ALIGN_LEFT); +	i_distortion_x0->when(FL_WHEN_ENTER_KEY); +	i_distortion_x0->callback((Fl_Callback*)distortion_cb); + +  	// Buttons -	Fl_Button *b = new Fl_Button(260, 260, 100, 20, "comp"); +	Fl_Button *b = new Fl_Button(280, 280, 100, 20, "comp");  	b->color(FL_RED);  	b->tooltip("compute view parameter from given mountains");  	b->callback(comp_cb); @@ -388,7 +399,7 @@ int main(int argc, char** argv) {  	int jpeg_flag = 0, tiff_flag = 0, distortion_flag = 0;  	int bilinear_flag = 0;  	double stitch_from = 0.0, stitch_to = 380.0; -	double dist_k0 = 0.0, dist_k1 = 0.0; +	double dist_k0 = 0.0, dist_k1 = 0.0, dist_x0 = 0.0;  	char *outpath = "/tmp";  	Fl_Scroll *scroll; @@ -419,11 +430,17 @@ int main(int argc, char** argv) {  				}  				break;  			case 'u': +				char *c;  				distortion_flag++;  				if (optarg && strcmp(optarg, ":")) {  					dist_k0 = atof(optarg); -					if (strchr(optarg, ',')) { +					c = strchr(optarg, ','); +					if (c) {  						dist_k1 = atof(strchr(optarg, ',') + 1); +						c = strchr(c + 1, ','); +						if (c) { +							dist_x0 = atof(strchr(optarg, ',') + 1); +						}  					}  				}  				break; @@ -501,7 +518,7 @@ int main(int argc, char** argv) {  	}  	if (distortion_flag) { -		gipf->set_distortion_params(dist_k0, dist_k1); +		gipf->set_distortion_params(dist_k0, dist_k1, dist_x0);  	}  	view_win->size(gipf->w(), gipf->h());  | 
