From 7d900b4ede22215413e4a0ddd1675c650ba3225f Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sun, 25 Jun 2006 11:49:32 +0200 Subject: implement various helper methods --- src/Panorama.cxx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'src/Panorama.cxx') diff --git a/src/Panorama.cxx b/src/Panorama.cxx index c8cb1dc..55fb9b8 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -586,3 +586,18 @@ Panorama::get_real_distance(Hill *m) { return c; } +int +Panorama::get_coordinates(double a_view, double a_nick, int *x, int *y) { + Hill *m = new Hill(0,0); + + m->a_view = a_view; + m->a_nick = a_nick; + + proj->set_coordinates(m, &parms); + + *x = m->x; + *y = m->y; + + return 0; +} + -- cgit v1.2.3 From bf376cf0a996b08c39f22d46ba68be4e7957777f Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sun, 25 Jun 2006 13:02:31 +0200 Subject: first working version --- src/DataImage.cxx | 1 + src/GipfelWidget.cxx | 4 +++- src/Panorama.cxx | 25 +++++++++++++++++++------ src/Stitch.H | 3 +-- src/Stitch.cxx | 22 ++++++++++++++++++++-- src/gipfel.cxx | 31 ++++++++++++++++++++++++++++++- 6 files changed, 74 insertions(+), 12 deletions(-) (limited to 'src/Panorama.cxx') diff --git a/src/DataImage.cxx b/src/DataImage.cxx index c230ed1..f7109cd 100644 --- a/src/DataImage.cxx +++ b/src/DataImage.cxx @@ -30,6 +30,7 @@ DataImage::DataImage(int X, int Y, int W, int H): Fl_Widget(X, Y, W, H) { d = 3; data = (uchar*) malloc(W * H * d); + memset(data, 0, W * H * d); } DataImage::~DataImage() { diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index c6a5990..aac0b49 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -757,6 +757,8 @@ GipfelWidget::get_pixel(double a_view, double a_nick, } pan->get_coordinates(a_view, a_nick, &px, &py); - return DataImage::get_pixel(img, px, py, r, g, b); + +//printf("===> %s: %f, %f -> %d %d\n", img_file, a_view, a_nick, px, py); + return DataImage::get_pixel(img, px + img->w() / 2, py + img->h() / 2, r, g, b); } diff --git a/src/Panorama.cxx b/src/Panorama.cxx index 55fb9b8..b33a260 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -588,15 +588,28 @@ Panorama::get_real_distance(Hill *m) { int Panorama::get_coordinates(double a_view, double a_nick, int *x, int *y) { - Hill *m = new Hill(0,0); + Hill m(0,0); - m->a_view = a_view; - m->a_nick = a_nick; - proj->set_coordinates(m, &parms); - *x = m->x; - *y = m->y; + m.a_view = a_view - 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) { + return 1; + } + + m.a_nick = a_nick; + + proj->set_coordinates(&m, &parms); + + *x = m.x; + *y = m.y; return 0; } diff --git a/src/Stitch.H b/src/Stitch.H index 8c126f7..bc8436e 100644 --- a/src/Stitch.H +++ b/src/Stitch.H @@ -38,8 +38,7 @@ class Stitch { int load_image(char *file); int resample(DataImage *img, - double view_start, double view_end, - double nick_start, double nick_end); + double view_start, double view_end); }; #endif diff --git a/src/Stitch.cxx b/src/Stitch.cxx index ca63ed3..9080259 100644 --- a/src/Stitch.cxx +++ b/src/Stitch.cxx @@ -58,8 +58,26 @@ Stitch::load_image(char *file) { int Stitch::resample(DataImage *img, - double view_start, double view_end, - double nick_start, double nick_end) { + double view_start, double view_end) { + double step_view = (view_end - view_start) / img->w(); + char r, g, b; + int y_off = img->h() / 2; + for (int x=0; xw(); x++) { + for (int y=0; yh(); y++) { + double a_view, a_nick; + a_view = x * step_view; + a_nick = (y_off - y) * step_view; + + for (int i=0; iget_pixel(a_view, a_nick, &r, &g, &b)==0) { + img->set_pixel(x, y, r, g, b); + break; + } + } + } + } } diff --git a/src/gipfel.cxx b/src/gipfel.cxx index 4a284aa..8247d7d 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -41,6 +41,8 @@ #include "Fl_Value_Dial.H" #include "Fl_Search_Chooser.H" #include "GipfelWidget.H" +#include "DataImage.H" +#include "Stitch.H" #include "choose_hill.H" #include "../config.h" @@ -60,6 +62,8 @@ Fl_Value_Input *i_view_lat, *i_view_long, *i_view_height; Fl_Box *b_viewpoint; Fl_Menu_Bar *mb; +int stitch(int argc, char **argv); + void set_values() { s_center->value(gipf->get_center_angle()); s_nick->value(gipf->get_nick_angle()); @@ -319,12 +323,13 @@ int main(int argc, char** argv) { char c, *sep, *tmp, **my_argv; char *view_point = NULL; int err, bflag = 0, dflag = 0, my_argc; + int stitch_flag = 0; Fl_Window *control_win, *view_win; Fl_Scroll *scroll; err = 0; - while ((c = getopt(argc, argv, "d:v:")) != EOF) { + while ((c = getopt(argc, argv, "d:v:s")) != EOF) { switch (c) { case 'h': usage(); @@ -336,6 +341,9 @@ int main(int argc, char** argv) { case 'v': view_point = optarg; break; + case 's': + stitch_flag++; + break; default: err++; } @@ -361,6 +369,10 @@ int main(int argc, char** argv) { Fl::scheme("plastic"); } + if (stitch_flag) { + stitch(my_argc, my_argv); + } + control_win = create_control_window(); view_win = new Fl_Window(800, 600); @@ -398,3 +410,20 @@ int main(int argc, char** argv) { return Fl::run(); } + +int stitch(int argc, char **argv) { + Fl_Window *win; + Stitch *st = new Stitch(); + + st->load_image("test1.jpg"); + st->load_image("test2.jpg"); + st->load_image("test3.jpg"); + + win = new Fl_Window(0,0, 1000, 200); + DataImage *img = new DataImage(0, 0, 1000, 200); + st->resample(img, 2.0, 6.0); + + win->show(0, argv); + Fl::run(); + exit(0); +} -- cgit v1.2.3 From 88555db930fc170f97ebbca6c17802392a5b5f25 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sun, 25 Jun 2006 13:51:38 +0200 Subject: show stitching online --- src/DataImage.cxx | 6 +++++- src/Panorama.cxx | 6 +++--- src/Stitch.cxx | 7 +++++-- src/gipfel.cxx | 9 ++++++--- 4 files changed, 19 insertions(+), 9 deletions(-) (limited to 'src/Panorama.cxx') diff --git a/src/DataImage.cxx b/src/DataImage.cxx index f7109cd..680d218 100644 --- a/src/DataImage.cxx +++ b/src/DataImage.cxx @@ -55,7 +55,11 @@ DataImage::set_pixel(int x, int y, char r, char g, char b) { void DataImage::draw() { - fl_draw_image(data, 0, 0, w(), h(), d); + fl_push_clip(x(), y(), w(), h()); + + fl_draw_image(data, x(), y(), w(), h(), d); + + fl_pop_clip(); } int diff --git a/src/Panorama.cxx b/src/Panorama.cxx index b33a260..a644732 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -593,17 +593,17 @@ Panorama::get_coordinates(double a_view, double a_nick, int *x, int *y) { m.a_view = a_view - 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) { + if (m.a_view > view_angle || m.a_view < - view_angle) { return 1; } - + m.a_nick = a_nick; proj->set_coordinates(&m, &parms); diff --git a/src/Stitch.cxx b/src/Stitch.cxx index 9080259..21b0ba7 100644 --- a/src/Stitch.cxx +++ b/src/Stitch.cxx @@ -24,6 +24,8 @@ #include #include +#include + #include "Stitch.H" Stitch::Stitch() { @@ -66,8 +68,7 @@ Stitch::resample(DataImage *img, for (int x=0; xw(); x++) { for (int y=0; yh(); y++) { double a_view, a_nick; - - a_view = x * step_view; + a_view = view_start + x * step_view; a_nick = (y_off - y) * step_view; for (int i=0; iredraw(); + Fl::check(); } } diff --git a/src/gipfel.cxx b/src/gipfel.cxx index 8247d7d..19c21cb 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -413,17 +413,20 @@ int main(int argc, char** argv) { int stitch(int argc, char **argv) { Fl_Window *win; + Fl_Scroll *scroll; Stitch *st = new Stitch(); st->load_image("test1.jpg"); st->load_image("test2.jpg"); st->load_image("test3.jpg"); + st->load_image("test4.jpg"); - win = new Fl_Window(0,0, 1000, 200); - DataImage *img = new DataImage(0, 0, 1000, 200); - st->resample(img, 2.0, 6.0); + win = new Fl_Window(0,0, 1000, 1000); + scroll = new Fl_Scroll(0, 0, win->w(), win->h()); + DataImage *img = new DataImage(0, 0, 2000, 500); win->show(0, argv); + st->resample(img, 0.0, 6.3); Fl::run(); exit(0); } -- cgit v1.2.3 From 70a6e7c52eb8830e7e2c5884247201defdeb6a1c Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 26 Jun 2006 18:05:47 +0200 Subject: switch to double coordinates --- src/DataImage.H | 6 ++++++ src/DataImage.cxx | 19 ++++++++++++++++++- src/GipfelWidget.cxx | 9 ++++++--- src/Panorama.H | 2 +- src/Panorama.cxx | 30 ++++++++++++------------------ src/Projection.H | 3 ++- src/Projection.cxx | 3 ++- src/ProjectionSphaeric.H | 5 ++--- src/ProjectionSphaeric.cxx | 22 ++++++---------------- src/ProjectionTangential.H | 3 ++- src/ProjectionTangential.cxx | 11 ++++++----- 11 files changed, 63 insertions(+), 50 deletions(-) (limited to 'src/Panorama.cxx') diff --git a/src/DataImage.H b/src/DataImage.H index fe6200d..ec3b1ec 100644 --- a/src/DataImage.H +++ b/src/DataImage.H @@ -40,6 +40,12 @@ class DataImage : public Fl_Widget { static int get_pixel(Fl_Image *img, int x, int y, char *r, char *g, char *b); + + static int get_pixel_bilinear(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); }; #endif diff --git a/src/DataImage.cxx b/src/DataImage.cxx index 680d218..efc05e3 100644 --- a/src/DataImage.cxx +++ b/src/DataImage.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -62,6 +63,23 @@ DataImage::draw() { fl_pop_clip(); } +int +DataImage::get_pixel_bilinear(Fl_Image *img, double x, double y, + char *r, char *g, char *b) { + + +} + +int +DataImage::get_pixel_nearest(Fl_Image *img, double x, double y, + char *r, char *g, char *b) { + if (isnan(x) || isnan(y)) { + return 1; + } else { + return get_pixel(img, (int) rint(x), (int) rint(y), r, g, b); + } +} + int DataImage::get_pixel(Fl_Image *img, int x, int y, char *r, char *g, char *b) { @@ -72,7 +90,6 @@ DataImage::get_pixel(Fl_Image *img, int x, int y, 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 diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index aac0b49..67695ad 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -749,16 +749,19 @@ GipfelWidget::handle(int event) { int GipfelWidget::get_pixel(double a_view, double a_nick, char *r, char *g, char *b) { - int px, py; + double px, py; if (img == NULL) { return 1; } - pan->get_coordinates(a_view, a_nick, &px, &py); + if (pan->get_coordinates(a_view, a_nick, &px, &py) != 0) { + return 1; + } //printf("===> %s: %f, %f -> %d %d\n", img_file, a_view, a_nick, px, py); - return DataImage::get_pixel(img, px + img->w() / 2, py + img->h() / 2, r, g, b); + return DataImage::get_pixel_nearest(img, px + ((double) img->w()) / 2.0, + py + ((double) img->h()) / 2.0, r, g, b); } diff --git a/src/Panorama.H b/src/Panorama.H index 740f164..20d3213 100644 --- a/src/Panorama.H +++ b/src/Panorama.H @@ -145,6 +145,6 @@ class Panorama { void set_projection(Projection::Projection_t p); - int get_coordinates(double a_view, double a_nick, int *x, int *y); + 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 a644732..73bc003 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -508,8 +508,11 @@ Panorama::update_coordinates() { for (int i=0; iget_num(); i++) { m = visible_mountains->get(i); + double tmp_x, tmp_y; - proj->set_coordinates(m, &parms); + 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); } } @@ -587,29 +590,20 @@ Panorama::get_real_distance(Hill *m) { } int -Panorama::get_coordinates(double a_view, double a_nick, int *x, int *y) { - Hill m(0,0); +Panorama::get_coordinates(double a_view, double a_nick, double *x, double *y) { + a_view = a_view - parms.a_center; - - - m.a_view = a_view - 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 (a_view > pi_d) { + a_view -= 2.0*pi_d; + } else if (a_view < -pi_d) { + a_view += 2.0*pi_d; } - if (m.a_view > view_angle || m.a_view < - view_angle) { + if (a_view > view_angle || a_view < - view_angle) { return 1; } - m.a_nick = a_nick; - - proj->set_coordinates(&m, &parms); - - *x = m.x; - *y = m.y; + proj->get_coordinates(a_view, a_nick, &parms, x, y); return 0; } diff --git a/src/Projection.H b/src/Projection.H index b81e531..f6de5ae 100644 --- a/src/Projection.H +++ b/src/Projection.H @@ -37,7 +37,8 @@ class Projection { Projection(); - virtual void set_coordinates(Hill *m, const 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); }; diff --git a/src/Projection.cxx b/src/Projection.cxx index 57a210a..1f224e8 100644 --- a/src/Projection.cxx +++ b/src/Projection.cxx @@ -31,7 +31,8 @@ Projection::Projection() { }; void -Projection::set_coordinates(Hill *m, const ViewParams *parms) { +Projection::get_coordinates(double a_view, double a_nick, + const ViewParams *parms, double *x, double *y) { fprintf(stderr, "Error: Projection::set_coordinates()\n"); } diff --git a/src/ProjectionSphaeric.H b/src/ProjectionSphaeric.H index fcaffa8..06396f1 100644 --- a/src/ProjectionSphaeric.H +++ b/src/ProjectionSphaeric.H @@ -30,11 +30,10 @@ class ProjectionSphaeric : public Projection { 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); - void set_coordinates(const Hill *m, const ViewParams *parms, - double *x, double *y); public: - void set_coordinates(Hill *m, const ViewParams *parms); + 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); }; diff --git a/src/ProjectionSphaeric.cxx b/src/ProjectionSphaeric.cxx index 74c9de6..e69882b 100644 --- a/src/ProjectionSphaeric.cxx +++ b/src/ProjectionSphaeric.cxx @@ -66,9 +66,9 @@ ProjectionSphaeric::comp_params(const Hill *m1, const Hill *m2, ViewParams *parm isnan(tmp.a_nick) || isnan(tmp.a_tilt)) { ; } else { - set_coordinates(m1, &tmp, &tmp_x, &tmp_y); + 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)); - set_coordinates(m2, &tmp, &tmp_x, &tmp_y); + 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) { @@ -88,22 +88,12 @@ ProjectionSphaeric::comp_params(const Hill *m1, const Hill *m2, ViewParams *parm } void -ProjectionSphaeric::set_coordinates(Hill *m, const ViewParams *parms) { +ProjectionSphaeric::get_coordinates(double a_view, double a_nick, + const ViewParams *parms, double *x, double *y) { double x_tmp, y_tmp; - set_coordinates(m, parms, &x_tmp, &y_tmp); - - m->x = (int) rint(x_tmp); - m->y = (int) rint(y_tmp); -} - -void -ProjectionSphaeric::set_coordinates(const Hill *m, const ViewParams *parms, - double *x, double *y) { - double x_tmp, y_tmp; - - x_tmp = m->a_view * parms->scale; - y_tmp = - (m->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); diff --git a/src/ProjectionTangential.H b/src/ProjectionTangential.H index 8e7673e..74a4b59 100644 --- a/src/ProjectionTangential.H +++ b/src/ProjectionTangential.H @@ -36,7 +36,8 @@ class ProjectionTangential : public Projection { int optimize(const Hill *m1, const Hill *m2, ViewParams *parms); public: - void set_coordinates(Hill *m, const ViewParams *parms); + 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); }; diff --git a/src/ProjectionTangential.cxx b/src/ProjectionTangential.cxx index 032005d..416d27d 100644 --- a/src/ProjectionTangential.cxx +++ b/src/ProjectionTangential.cxx @@ -160,15 +160,16 @@ ProjectionTangential::optimize(const Hill *m1, const Hill *m2, ViewParams *parms } void -ProjectionTangential::set_coordinates(Hill *m, const ViewParams *parms) { +ProjectionTangential::get_coordinates(double a_view, double a_nick, + const ViewParams *parms, double *x, double *y) { double x_tmp, y_tmp; - x_tmp = tan(m->a_view) * parms->scale; - y_tmp = - (tan(m->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; - m->x = (int) rint(x_tmp * cos(parms->a_tilt) - y_tmp * sin(parms->a_tilt)); - m->y = (int) rint(x_tmp * sin(parms->a_tilt) + y_tmp * cos(parms->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 -- cgit v1.2.3