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