From ad4173e1c2bb55d2cce827067dfd132e8a6a7ac4 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Thu, 8 Jan 2015 15:27:47 +0100 Subject: Add geometry functions & various modifications. --- geom.hpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) (limited to 'geom.hpp') diff --git a/geom.hpp b/geom.hpp index abb71c0..e9a4512 100644 --- a/geom.hpp +++ b/geom.hpp @@ -17,9 +17,49 @@ struct vec { return (y > 0 ? a : -a); } + vec normalize() const { + double n = norm(); + return vec(x / n, y / n); + } + + bool is_nil() const { + return x == 0 && y == 0; + } + vec operator+ (const vec& o) const { return vec(x + o.x, y + o.y); } + vec operator- (const vec& o) const { + return vec(x - o.x, y - o.y); + } + vec operator* (double m) const { + return vec(m * x, m * y); + } + vec operator/ (double m) const { + return vec(m / x, m / y); + } + + static vec from_polar(double r, double theta) { + return vec(r * cos(theta), r * sin(theta)); + } + + static vec dot(vec a, vec b) { // dot product (produit scalaire) + return a.x * b.x + a.y * b.y; + } + static vec cross(vec a, vec b) { // cross product (déterminant 2x2) + return a.x * b.y - a.y * b.x; + } + static vec angle(vec a, vec b) { // oriented angle between two vectors + if (a.is_nil() || b.is_nil()) return 0; + float cos = dot(a.normalize(), b.normalize()); + if (cos <= -1) return M_PI; + float uangle = acos(cos); + if (cross(a, b) > 0) { + return uangle; + } else { + return -uangle; + } + } }; struct line { @@ -28,11 +68,22 @@ struct line { line(double aa, double bb, double cc) : a(aa), b(bb), c(cc) {} + bool on_line(vec p) const { + return a * p.x + b * p.y + c == 0; + } + double dist(vec p) const { - // TODo + // calculate distance from p to the line + // TODO return 1; } + vec proj(vec p) const { + // calculate orthogonal projection of point p on the line + // TODO + return vec(0, 0); + } + double angle() const { return vec(-b, a).angle(); } @@ -42,7 +93,13 @@ struct line { struct segment { vec a, b; - segment(vec pa, vec pb) : a(pa), b(pb), {} + segment(vec pa, vec pb) : a(pa), b(pb) {} + + bool on_segment(vec p) const { + // TODO + // does point intersect segment? + return false; + } double dist(vec p) const { // TODO @@ -56,6 +113,15 @@ struct circle { circle(double x, double y, double rr) : c(x, y), r(rr) {} circle(vec cc, double rr) : c(cc), r(rr) {} + + bool on_circle(vec.p) const { + return ((p - c).norm() == r); + } + + double dist(vec p) const { + // TODO + return 1; + } }; struct circpoint { @@ -63,6 +129,7 @@ struct circpoint { double theta; circpoint(circle cc, double th) : c(cc), theta(th) {} + circpoint(vec cc, double rr, double th : c(cc, rr), theta(th) {} vec pos() const { return c.c + vec(c.r * cos(theta), c.r * sin(theta)); -- cgit v1.2.3