/* * 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 cruft::geom { template struct segment { cruft::point a; cruft::point b; // Return a copy of this object with the underlying type casted to // the specified type. template segment cast (void) const { return { .a = a.template cast (), .b = b.template cast () }; } }; using segment2i = segment<2,int>; using segment3i = segment<3,int>; 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)); } }