/* * 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/. * * Copyright 2018 Danny Robson */ #pragma once #include "../point.hpp" namespace util::geom { template struct segment { util::point a; util::point b; }; using segment2f = segment<2,float>; using segment3f = segment<3,float>; template T distance2 (segment s, point p) { const auto dir = s.b - s.a; const auto t1 = dot (p - s.a, dir); if (t1 < 0) return distance2 (p, s.a); const auto t2 = dot (dir, dir); if (t2 < t1) return distance2 (p, s.b); auto t = t1 / t2; return distance2 (p, s.a + t * dir); } template T distance (segment s, point p) { return std::sqrt (distance2 (s, p)); } };