Blame c++/contourgl/geometry.h

Ivan Mahonin 93cbac
/*
Ivan Mahonin 93cbac
    ......... 2015 Ivan Mahonin
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
    This program is free software: you can redistribute it and/or modify
Ivan Mahonin 93cbac
    it under the terms of the GNU General Public License as published by
Ivan Mahonin 93cbac
    the Free Software Foundation, either version 3 of the License, or
Ivan Mahonin 93cbac
    (at your option) any later version.
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
    This program is distributed in the hope that it will be useful,
Ivan Mahonin 93cbac
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Ivan Mahonin 93cbac
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Ivan Mahonin 93cbac
    GNU General Public License for more details.
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
    You should have received a copy of the GNU General Public License
Ivan Mahonin 93cbac
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
Ivan Mahonin 93cbac
*/
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#ifndef _GEOMETRY_H_
Ivan Mahonin 93cbac
#define _GEOMETRY_H_
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include <cmath>
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#include <algorithm>
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
typedef double Real;
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
template<typename T>
Ivan Mahonin 93cbac
bool intersects(const T &a0, const T &a1, const T &b0, const T &b1) {
Ivan Mahonin 93cbac
	return !(std::max(b0, b1) < std::min(a0, a1))
Ivan Mahonin 93cbac
	    && !(std::max(a0, a1) < std::min(b0, b1));
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
inline Real wrap_angle(Real a, Real round) {
Ivan Mahonin 93cbac
	Real rounds = a/round + 0.5;
Ivan Mahonin 93cbac
	return (rounds - floor(rounds) - 0.5)*round;
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
inline bool angle_between(Real a0, Real a1, Real a, Real round) {
Ivan Mahonin 93cbac
	if (a1 < a0) std::swap(a0, a1);
Ivan Mahonin 93cbac
	a0 = wrap_angle(a0, round);
Ivan Mahonin 93cbac
	a1 = wrap_angle(a1, round);
Ivan Mahonin 93cbac
	a = wrap_angle(a, round);
Ivan Mahonin 93cbac
	if (a < a0) a += round;
Ivan Mahonin 93cbac
	if (a1 < a0) a1 += round;
Ivan Mahonin 93cbac
	return a0 < a && a < a1;
Ivan Mahonin 93cbac
}
Ivan Mahonin 93cbac
Ivan Mahonin a80036
template<typename T>
Ivan Mahonin a80036
class vec2 {
Ivan Mahonin 93cbac
public:
Ivan Mahonin a80036
	typedef T type;
Ivan Mahonin a80036
Ivan Mahonin 93cbac
	union {
Ivan Mahonin a80036
		struct { type x, y; };
Ivan Mahonin 7c6b57
		struct { type coords[2]; };
Ivan Mahonin 93cbac
	};
Ivan Mahonin 93cbac
Ivan Mahonin a80036
	vec2():
Ivan Mahonin 93cbac
		x(), y() { }
Ivan Mahonin f83e6b
	vec2(const type &x, const type &y):
Ivan Mahonin 93cbac
		x(x), y(y) { }
Ivan Mahonin 93cbac
Ivan Mahonin a80036
	template<typename TT>
Ivan Mahonin a80036
	explicit vec2(const vec2<TT> &other):
Ivan Mahonin a80036
		x((type)other.x), y((type)other.y) { }
Ivan Mahonin a80036
Ivan Mahonin a80036
	type& operator[] (int index)
Ivan Mahonin 93cbac
		{ return coords[index]; }
Ivan Mahonin a80036
	const type& operator[] (int index) const
Ivan Mahonin 93cbac
		{ return coords[index]; }
Ivan Mahonin a80036
	bool is_equal_to(const vec2 &other) const
Ivan Mahonin 93cbac
		{ return fabs(x - other.x) < 1e-6 && fabs(y - other.y) < 1e-6; }
Ivan Mahonin 93cbac
Ivan Mahonin a80036
	vec2 operator+(const vec2 &a) const
Ivan Mahonin a80036
		{ return vec2(x + a.x, y + a.y); }
Ivan Mahonin a80036
	vec2 operator-(const vec2 &a) const
Ivan Mahonin a80036
		{ return vec2(x - a.x, y - a.y); }
Ivan Mahonin a80036
	vec2 operator*(const vec2 &a) const
Ivan Mahonin a80036
		{ return vec2(x*a.x, y*a.y); }
Ivan Mahonin a80036
	vec2 operator/(const vec2 &a) const
Ivan Mahonin a80036
		{ return vec2(x/a.x, y/a.y); }
Ivan Mahonin a80036
Ivan Mahonin f83e6b
	vec2 operator*(const type &a) const
Ivan Mahonin a80036
		{ return vec2(x*a, y*a); }
Ivan Mahonin f83e6b
	vec2 operator/(const type &a) const
Ivan Mahonin a80036
		{ return vec2(x/a, y/a); }
Ivan Mahonin a80036
Ivan Mahonin 8cd87e
	type dot(const vec2 &a) const
Ivan Mahonin 8cd87e
		{ return x*a.x + y*a.y; }
Ivan Mahonin 8cd87e
Ivan Mahonin a80036
	static vec2 zero() { return vec2(); }
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin f83e6b
template<typename T>
Ivan Mahonin f83e6b
class line2 {
Ivan Mahonin f83e6b
public:
Ivan Mahonin f83e6b
	typedef T type;
Ivan Mahonin f83e6b
	vec2<type> p0, p1;
Ivan Mahonin f83e6b
	line2() { }
Ivan Mahonin f83e6b
	line2(const vec2<type> &p0, const vec2<type> &p1): p0(p0), p1(p1) { }
Ivan Mahonin f83e6b
	line2(const type &x0, const type &y0, const type &x1, const type &y1): p0(x0, y0), p1(x1, y1) { }
Ivan Mahonin f83e6b
};
Ivan Mahonin a80036
Ivan Mahonin f83e6b
template<typename T>
Ivan Mahonin f83e6b
class rect {
Ivan Mahonin 93cbac
public:
Ivan Mahonin f83e6b
	typedef T type;
Ivan Mahonin f83e6b
	vec2<type> p0, p1;
Ivan Mahonin 93cbac
Ivan Mahonin f83e6b
    bool intersects(const rect &other) const
Ivan Mahonin 93cbac
        { return ::intersects(p0.x, p1.x, other.p0.x, other.p1.x)
Ivan Mahonin 93cbac
              && ::intersects(p0.y, p1.y, other.p0.y, other.p1.y); }
Ivan Mahonin 93cbac
Ivan Mahonin f83e6b
    rect expand(const vec2<type> &p) const {
Ivan Mahonin f83e6b
    	rect r;
Ivan Mahonin 93cbac
    	r.p0.x = std::min(std::min(p0.x, p1.x), p.x);
Ivan Mahonin 93cbac
    	r.p0.y = std::min(std::min(p0.y, p1.y), p.y);
Ivan Mahonin 93cbac
    	r.p1.x = std::max(std::max(p0.x, p1.x), p.x);
Ivan Mahonin 93cbac
    	r.p1.y = std::max(std::max(p0.y, p1.y), p.y);
Ivan Mahonin 93cbac
    	return r;
Ivan Mahonin 93cbac
    }
Ivan Mahonin f83e6b
Ivan Mahonin f83e6b
    rect() { }
Ivan Mahonin f83e6b
    rect(const vec2<type> &p0, const vec2<type> &p1): p0(p0), p1(p1) { }
Ivan Mahonin f83e6b
    rect(const type &x0, const type &y0, const type &x1, const type &y1): p0(x0, y0), p1(x1, y1) { }
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin f83e6b
typedef vec2<Real> Vector;
Ivan Mahonin f83e6b
typedef line2<Real> Line;
Ivan Mahonin f83e6b
typedef rect<Real> Rect;
Ivan Mahonin f83e6b
Ivan Mahonin f83e6b
typedef vec2<float> vec2f;
Ivan Mahonin f83e6b
typedef line2<float> line2f;
Ivan Mahonin f83e6b
typedef rect<float> rectf;
Ivan Mahonin f83e6b
Ivan Mahonin 93cbac
class ContextRect {
Ivan Mahonin 93cbac
public:
Ivan Mahonin 93cbac
	int minx, miny, maxx, maxy;
Ivan Mahonin 93cbac
	ContextRect(): minx(), miny(), maxx(), maxy() { }
Ivan Mahonin 93cbac
};
Ivan Mahonin 93cbac
Ivan Mahonin 93cbac
#endif