00001 #ifndef GEOM2D_H
00002 #define GEOM2D_H
00003
00004 namespace geom {
00005
00006 struct vector
00007 {
00008 double x;
00009 double y;
00010
00011 vector(double _x = 0.0, double _y = 0.0)
00012 : x(_x), y(_y) {}
00013
00014 const vector& operator+=(const vector &v);
00015 vector operator+(const vector &v) const;
00016 vector operator-() const;
00017 const vector& operator-=(const vector &v);
00018 vector operator-(const vector &v) const;
00019 };
00020
00021 vector operator*(double t, const vector &v);
00022
00023 struct form
00024 {
00025 double a;
00026 double b;
00027
00028 form(double _a = 0.0, double _b = 0.0)
00029 : a(_a), b(_b) {}
00030
00031 double operator()(const vector &v) const;
00032 };
00033
00034
00035
00036
00037 struct grid;
00038 struct ray
00039 {
00040 vector start;
00041 vector dir;
00042
00043 ray() {}
00044 ray(double x0, double y0, double xd, double yd)
00045 : start(x0, y0), dir(xd, yd) {}
00046
00047 vector shoot(double t) const;
00048 void advance(double t);
00049 bool to_grid(const grid& g, bool half);
00050 bool to_next_cell(const grid& g);
00051 };
00052
00053
00054
00055 struct line
00056 {
00057 form f;
00058 double val;
00059
00060 line() {}
00061 line(double a, double b, double v)
00062 : f(a,b), val(v) {}
00063 };
00064
00065
00066
00067
00068 struct lineseq
00069 {
00070 form f;
00071 double offset;
00072 double dist;
00073
00074 lineseq() {}
00075 lineseq(double a, double b, double o, double d)
00076 : f(a,b), offset(o), dist(d) {}
00077
00078 double index(const vector &v) const;
00079 };
00080
00081 struct grid
00082 {
00083 lineseq ls1;
00084 lineseq ls2;
00085
00086 grid(lineseq l1, lineseq l2) : ls1(l1), ls2(l2) {}
00087 };
00088
00089 double intersect(const ray &r, const line &l);
00090 double nextintersect(const ray &r, const lineseq &ls);
00091 bool parallel(const vector& v, const form &f);
00092 vector reflect(const vector& v, const form &f);
00093
00094 vector degree_to_vector(const double d);
00095 double degrees(const vector &v);
00096 }
00097
00098 #endif