MeshLib C++ Docs
Loading...
Searching...
No Matches
MRLine.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRAffineXf.h"
4#include <iosfwd>
5
6namespace MR
7{
10
11
14template <typename V>
15struct Line
16{
17 using T = typename V::ValueType;
18
19 V p, d;
20
21 constexpr Line() noexcept = default;
22 constexpr Line( const V & p, const V & d ) noexcept : p( p ), d( d ) { }
23 template <typename U>
24 constexpr explicit Line( const Line<U> & l ) noexcept : p( l.p ), d( l.d ) { }
25
27 [[nodiscard]] V operator()( T param ) const { return p + param * d; }
28
30 [[nodiscard]] T distanceSq( const V & x ) const
31 { return ( x - project( x ) ).lengthSq(); }
32
34 [[nodiscard]] Line operator -() const { return Line( p, -d ); }
36 [[nodiscard]] const Line & operator +() const { return *this; }
38 [[nodiscard]] Line normalized() const { return { p, d.normalized() }; }
39
41 [[nodiscard]] V project( const V & x ) const { return p + dot( d, x - p ) / d.lengthSq() * d; }
42
43 friend std::ostream& operator<<( std::ostream& s, const Line& l )
44 {
45 return s << l.p << '\n' << l.d;
46 }
47
48 friend std::istream& operator>>( std::istream& s, Line& l )
49 {
50 return s >> l.p >> l.d;
51 }
52};
53
56
60template <typename V>
61[[nodiscard]] inline Line<V> transformed( const Line<V> & l, const AffineXf<V> & xf )
62{
63 return Line<V>{ xf( l.p ), xf.A * l.d };
64}
65
66template <typename V>
67[[nodiscard]] inline bool operator == ( const Line<V> & a, const Line<V> & b )
68{
69 return a.p == b.p && a.d == b.d;
70}
71
73
74}
MRMESH_API bool operator==(const BitSet &a, const BitSet &b)
compare that two bit sets have the same set bits (they can be equal even if sizes are distinct but la...
friend std::istream & operator>>(std::istream &s, Line &l)
Definition MRLine.h:48
typename V::ValueType T
Definition MRLine.h:17
const Line & operator+() const
returns same representation
Definition MRLine.h:36
T distanceSq(const V &x) const
returns squared distance from given point to this line
Definition MRLine.h:30
constexpr Line(const Line< U > &l) noexcept
Definition MRLine.h:24
Line operator-() const
returns same line represented with flipped direction of d-vector
Definition MRLine.h:34
constexpr Line() noexcept=default
friend std::ostream & operator<<(std::ostream &s, const Line &l)
Definition MRLine.h:43
V operator()(T param) const
returns point on the line, where param=0 returns p and param=1 returns p+d
Definition MRLine.h:27
V d
Definition MRLine.h:19
Line< V > transformed(const Line< V > &l, const AffineXf< V > &xf)
Definition MRLine.h:61
M A
Definition MRAffineXf.h:30
Line normalized() const
returns same line represented with unit d-vector
Definition MRLine.h:38
V p
Definition MRLine.h:19
V project(const V &x) const
finds the closest point on line
Definition MRLine.h:41
only for bindings generation
Definition MRCameraOrientationPlugin.h:8
Definition MRAffineXf.h:26
Definition MRLine.h:16