summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <johannes.hofmann@gmx.de>2005-04-13 16:07:16 +0000
committerJohannes Hofmann <johannes.hofmann@gmx.de>2005-04-13 16:07:16 +0000
commit9002a841a37a4dc4acd1c55e56a5e778156a5622 (patch)
treec62b5e2f429809db43ed26d2d1bab30c1d540496
parent42f03528da65b939579b25cbb8618d190b96dd9c (diff)
initial version
initial version
-rw-r--r--src/GipfelWidget.H8
-rw-r--r--src/GipfelWidget.cxx16
-rw-r--r--src/Hill.H53
-rw-r--r--src/Hill.cxx79
-rw-r--r--src/Makefile2
-rw-r--r--src/Panorama.H53
-rw-r--r--src/Panorama.cxx147
-rw-r--r--src/gipfel.cxx3
8 files changed, 345 insertions, 16 deletions
diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H
index 732329d..f30f9ca 100644
--- a/src/GipfelWidget.H
+++ b/src/GipfelWidget.H
@@ -1,5 +1,5 @@
//
-// "$Id: GipfelWidget.H,v 1.1 2005/04/13 15:36:36 hofmann Exp $"
+// "$Id: GipfelWidget.H,v 1.2 2005/04/13 18:07:16 hofmann Exp $"
//
// X11 header file for the Fast Light Tool Kit (FLTK).
//
@@ -24,9 +24,9 @@
#ifndef GipfelWidget_H
#define GipfelWidget_H
-#include <FL/Fl_Overlay_Window.H>
+#include <FL/Fl_Widget.H>
-class GipfelWidget : public Fl_Overlay_Window {
+class GipfelWidget : public Fl_Widget {
private:
Fl_Image *img;
@@ -35,8 +35,6 @@ class GipfelWidget : public Fl_Overlay_Window {
int load(const char *file);
- void draw_overlay();
-
void draw();
};
#endif
diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx
index 8a3aa7b..10b8c55 100644
--- a/src/GipfelWidget.cxx
+++ b/src/GipfelWidget.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: GipfelWidget.cxx,v 1.1 2005/04/13 15:36:36 hofmann Exp $"
+// "$Id: GipfelWidget.cxx,v 1.2 2005/04/13 18:07:16 hofmann Exp $"
//
// PSEditWidget routines.
//
@@ -40,7 +40,7 @@
#include "GipfelWidget.H"
-GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Overlay_Window(X, Y, W, H) {
+GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) {
img = NULL;
fl_register_images();
@@ -66,14 +66,14 @@ GipfelWidget::draw() {
return;
}
- img->draw(0,0,w(),h(),0,0);
-}
+ fl_push_clip(x(), y(), w(), h());
+ img->draw(x(),y(),w(),h(),0,0);
+
-void
-GipfelWidget::draw_overlay() {
fl_color(FL_RED);
- fl_draw_box(FL_UP_BOX, 10, 10, 25,25, FL_GRAY);
-}
+ fl_draw_box(FL_UP_BOX, x()+20, y()+20, 25,25, FL_GRAY);
+ fl_pop_clip();
+}
diff --git a/src/Hill.H b/src/Hill.H
new file mode 100644
index 0000000..69db8ba
--- /dev/null
+++ b/src/Hill.H
@@ -0,0 +1,53 @@
+//
+// "$Id: Hill.H,v 1.1 2005/04/13 18:07:16 hofmann Exp $"
+//
+// X11 header file for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2004 by Johannes Hofmann
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+#ifndef MOUNTAIN_H
+#define MOUNTAIN_H
+
+class Mountain;
+
+class Mountain {
+ private:
+ Mountain *next;
+ Mountain *next_visible;
+
+ public:
+ double phi, lam;
+ double height;
+ char *name;
+
+ Mountain(const char *n, double p, double l, double h);
+
+ ~Mountain();
+
+ void append(Mountain *m);
+
+ void append_visible(Mountain *m);
+
+ void set_first_visible();
+
+ Mountain * get_next();
+
+ Mountain * get_next_visible();
+};
+#endif
diff --git a/src/Hill.cxx b/src/Hill.cxx
new file mode 100644
index 0000000..18cc353
--- /dev/null
+++ b/src/Hill.cxx
@@ -0,0 +1,79 @@
+//
+// "$Id: Hill.cxx,v 1.1 2005/04/13 18:07:16 hofmann Exp $"
+//
+// PSEditWidget routines.
+//
+// Copyright 2004 by Johannes Hofmann
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "Mountain.H"
+
+Mountain::Mountain(const char *n, double p, double l, double h) {
+ name = strdup(n);
+ phi = p;
+ lam = l;
+ height = h;
+ next = NULL;
+ next_visible = NULL;
+}
+
+Mountain::~Mountain() {
+ if (next) {
+ delete(next);
+ }
+
+ if (name) {
+ free(name);
+ }
+}
+
+void
+Mountain::append(Mountain *m) {
+ if (next) {
+ next->append(m);
+ } else {
+ next = m;
+ }
+}
+
+Mountain *
+Mountain::get_next() {
+ return next;
+}
+
+void
+Mountain::append_visible(Mountain *m) {
+ if (next_visible) {
+ next->append_visible(m);
+ } else {
+ next_visible = m;
+ }
+}
+
+Mountain *
+Mountain::get_next_visible() {
+ return next_visible;
+}
+
+void
+Mountain::set_first_visible() {
+ next_visible = NULL;
+}
diff --git a/src/Makefile b/src/Makefile
index 4e02613..7edcf67 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -4,7 +4,7 @@ CFLAGS=-g -I/usr/X11R6/include
CXXFLAGS=-g -I/usr/X11R6/include
LDFLAGS=-g
-OBJECTS=flmountains.o GipfelWidget.o
+OBJECTS=flmountains.o GipfelWidget.o Mountain.o Panorama.o
#%.o: %.c
# $(CC) -c $(CFLAGS) $*.c
diff --git a/src/Panorama.H b/src/Panorama.H
new file mode 100644
index 0000000..ae6b839
--- /dev/null
+++ b/src/Panorama.H
@@ -0,0 +1,53 @@
+//
+// "$Id: Panorama.H,v 1.1 2005/04/13 18:07:16 hofmann Exp $"
+//
+// X11 header file for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2004 by Johannes Hofmann
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+#ifndef PANORAMA_H
+#define PANORAMA_H
+
+#include "Mountain.H"
+
+class Panorama {
+ private:
+ double view_phi, view_lam;
+ double height_dist_ratio;
+ Mountain *mountains;
+ Mountain *visible_mountains;
+ double pi, deg2rad;
+
+ int get_pos(const char *name, double *phi, double *lam);
+
+ void check_visibility();
+
+ double Panorama::distance(double phi, double lam);
+ public:
+ Panorama();
+
+ ~Panorama();
+
+ int load_file(const char *name);
+
+ int set_viewpoint(const char *pos);
+
+ void set_height_dist_ratio(double r);
+};
+#endif
diff --git a/src/Panorama.cxx b/src/Panorama.cxx
new file mode 100644
index 0000000..6a25ac4
--- /dev/null
+++ b/src/Panorama.cxx
@@ -0,0 +1,147 @@
+//
+// "$Id: Panorama.cxx,v 1.1 2005/04/13 18:07:16 hofmann Exp $"
+//
+// PSEditWidget routines.
+//
+// Copyright 2004 by Johannes Hofmann
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Library General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Library General Public License for more details.
+//
+// You should have received a copy of the GNU Library General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA.
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "Panorama.H"
+
+Panorama::Panorama() {
+ mountains = NULL;
+ visible_mountains = NULL;
+ height_dist_ratio = 0.1;
+ pi = asin(1.0) * 2.0;
+ deg2rad = pi / 180.0;
+}
+
+Panorama::~Panorama() {
+ if (mountains) {
+ delete(mountains);
+ }
+}
+
+int
+Panorama::load_file(const char *name) {
+ FILE *fp;
+ char buf[4000];
+ char *vals[10];
+ char **ap, *bp;
+ double phi, lam, height;
+ Mountain *m;
+
+ fp = fopen(name, "r");
+ if (!fp) {
+ perror("fopen");
+ return 1;
+ }
+
+ while (fgets(buf, sizeof(buf), fp)) {
+ bp = buf;
+ for (ap = vals; (*ap = strsep(&bp, ",")) != NULL;)
+ if (++ap >= &vals[10])
+ break;
+
+ phi = atof(vals[3]) * deg2rad;
+ lam = atof(vals[4]) * deg2rad;
+
+ height = atof(vals[5]);
+
+ m = new Mountain(vals[1], phi, lam, height);
+ if (mountains) {
+ mountains->append(m);
+ } else {
+ mountains = m;
+ }
+ }
+
+ fclose(fp);
+
+ check_visibility();
+ return 0;
+}
+
+int
+Panorama::set_viewpoint(const char *name) {
+ if (get_pos(name, &view_phi, &view_lam) != 1) {
+ fprintf(stderr, "Could not find exactly one entry for %s.\n");
+ return 1;
+ }
+
+ check_visibility();
+ return 0;
+}
+
+int
+Panorama::get_pos(const char *name, double *phi, double *lam) {
+ Mountain *m = mountains;
+ int found = 0;
+ double p, l;
+
+ while (m) {
+ if (strstr(m->name, name)) {
+ p = m->phi;
+ l = m->lam;
+
+ fprintf(stderr, "Found matching entry: %s (%fm)\n", m->name, m->height);
+ found++;
+ }
+
+ m = m->get_next();
+ }
+
+ if (found == 1) {
+ *phi = p;
+ *lam = l;
+ }
+
+ return found;
+}
+
+void
+Panorama::check_visibility() {
+ Mountain *m = mountains;
+ visible_mountains = NULL;
+
+ while (m) {
+
+ if (m->height / (distance(m->phi, m->lam)* 6368000)
+ > height_dist_ratio) {
+
+ if (visible_mountains) {
+ visible_mountains->append_visible(m);
+ } else {
+ visible_mountains = m;
+ }
+ }
+
+ m = m->get_next();
+ }
+}
+
+double
+Panorama::distance(double phi, double lam) {
+ return acos(sin(view_phi) * sin(phi) +
+ cos(view_phi) * cos(phi) * cos(view_lam - lam));
+}
diff --git a/src/gipfel.cxx b/src/gipfel.cxx
index e72703d..e71d34f 100644
--- a/src/gipfel.cxx
+++ b/src/gipfel.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: gipfel.cxx,v 1.2 2005/04/13 15:36:36 hofmann Exp $"
+// "$Id: gipfel.cxx,v 1.3 2005/04/13 18:07:16 hofmann Exp $"
//
// flpsed program.
//
@@ -136,7 +136,6 @@ int main(int argc, char** argv) {
win->end();
win->show(1, argv);
- gipf->redraw_overlay();
return Fl::run();
}