libcruft-util/geom/line.hpp

56 lines
1.3 KiB
C++
Raw Normal View History

2018-04-20 15:04:54 +10:00
/*
2018-08-04 15:14:06 +10:00
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
2018-04-20 15:04:54 +10:00
*
* Copyright 2018 Danny Robson <danny@nerdcruft.net>
*/
#pragma once
#include "../point.hpp"
#include "../vector.hpp"
namespace util::geom {
// an line of infinite extent that passes though 'base'.
//
// direction should be normalised
template <size_t S, typename T>
struct line {
line () = default;
line (util::point<S,T> a, util::point<S,T> b):
line (a, normalised (b - a))
{ ; }
line (util::point<S,T> _base, util::vector<S,T> _direction):
base (_base),
direction (_direction)
{
CHECK (is_normalised (direction));
}
util::point<S,T> base;
util::vector<S,T> direction;
};
using line2f = line<2,float>;
using line3f = line<3,float>;
template <size_t S, typename T>
T
distance2 (line<S,T> l, point<S,T> p)
{
const auto t = dot (p - l.base, l.direction);
return distance2 (p, l.base + l.direction * t);
}
template <size_t S, typename T>
T
distance (line<S,T> l, point<S,T> p)
{
return std::sqrt (distance2 (l, p));
}
};