19 using tvec = glm::tvec2<T>;
28 tray from_dir(tvec
const& start, tvec
const& dir)
noexcept {
return { start, glm::normalize(dir) }; }
29 tray from_points(tvec
const& start, tvec
const& second)
noexcept {
return from_dir(start, second - start); }
31 segment& set_position(tvec
const& pos)
noexcept { start = pos;
return *
this; }
32 segment& operator+=(tvec
const& offs)
noexcept { start += offs;
return *
this; }
33 segment& operator-=(tvec
const& offs)
noexcept { start -= offs;
return *
this; }
34 segment& translate(tvec
const& offs)
noexcept {
return this->operator+=(offs); }
36 T edge_length()
const noexcept {
return std::numeric_limits<T>::infinity(); }
38 tvec edge_point(T t)
const {
return start + dir * t; }
39 trec2<T> bounding_box()
const {
return trec2<T>::from_points(edge_point(T{}), edge_point(edge_length())); }
40 tvec closest_point_to(tvec
const& pt)
const
42 const auto a = projected_alpha(pt);
43 if (a < T(0))
return start;
44 return start + dir * a;
46 T projected_alpha(tvec
const& pt)
const
48 const auto d = pt - start;
49 return glm::dot(d, dir);