diff --git a/Makefile.am b/Makefile.am index ce581deb..00df58f3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -77,6 +77,8 @@ UTIL_FILES = \ json/tree.hpp \ lerp.cpp \ lerp.hpp \ + line.cpp \ + line.hpp \ log.cpp \ log.hpp \ log.ipp \ @@ -239,6 +241,7 @@ TEST_BIN = \ test/hton \ test/ip \ test/json_types \ + test/line \ test/maths \ test/maths_matrix \ test/matrix \ diff --git a/line.cpp b/line.cpp new file mode 100644 index 00000000..90e66883 --- /dev/null +++ b/line.cpp @@ -0,0 +1,60 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim 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 General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2015 Danny Robson + */ + +#include "line.hpp" + +#include "debug.hpp" + + +//----------------------------------------------------------------------------- +template +util::line::line (util::point _p, + util::vector _d): + p (_p), + d (_d) +{ + CHECK_EQ (d.magnitude2 (), 1); +} + + +///---------------------------------------------------------------------------- +/// returns the distance alone the line in a line-plane intersection +/// +/// returns inf if parallel +/// returns 0 if colinear +template +T +util::line::intersect (plane rhs) const +{ + return dot (rhs.p - p, rhs.n) / dot (d, rhs.n); +} + + +//----------------------------------------------------------------------------- +template +util::point +util::line::at (T t) const +{ + return p + d * t; +} + + +//----------------------------------------------------------------------------- +template struct util::line<2,float>; +template struct util::line<3,float>; diff --git a/line.hpp b/line.hpp new file mode 100644 index 00000000..3a13b94a --- /dev/null +++ b/line.hpp @@ -0,0 +1,46 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim 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 General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2015 Danny Robson + */ + +#ifndef __UTIL_LINE_HPP +#define __UTIL_LINE_HPP + +#include "point.hpp" +#include "vector.hpp" +#include "plane.hpp" + +namespace util { + template + struct line { + line (util::point place, + util::vector direction); + + T intersect (plane) const; + + util::point at (T) const; + + util::point p; + util::vector d; + }; + + + typedef line<2,float> line2f; + typedef line<3,float> line3f; +} + +#endif diff --git a/test/line.cpp b/test/line.cpp new file mode 100644 index 00000000..4527e5e1 --- /dev/null +++ b/test/line.cpp @@ -0,0 +1,13 @@ +#include "line.hpp" +#include "plane.hpp" +#include "debug.hpp" + +int +main (void) +{ + // trivial case: origin line facing z, plane at unit z facing -z. + util::line3f l ({0,0,0}, {0,0, 1}); + util::plane3f p ({0,0,1}, {0,0,-1}); + + CHECK_EQ (l.intersect (p), 1); +}