summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/DataImage.H6
-rw-r--r--src/DataImage.cxx19
-rw-r--r--src/GipfelWidget.cxx9
-rw-r--r--src/Panorama.H2
-rw-r--r--src/Panorama.cxx30
-rw-r--r--src/Projection.H3
-rw-r--r--src/Projection.cxx3
-rw-r--r--src/ProjectionSphaeric.H5
-rw-r--r--src/ProjectionSphaeric.cxx22
-rw-r--r--src/ProjectionTangential.H3
-rw-r--r--src/ProjectionTangential.cxx11
11 files changed, 63 insertions, 50 deletions
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 <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <math.h>
#include <Fl/fl_draw.h>
@@ -63,6 +64,23 @@ DataImage::draw() {
}
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) {
if ( img->d() == 0 ) {
@@ -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; i<visible_mountains->get_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