Forward compatibility: flex
[foam-extend-3.2.git] / src / foam / meshes / primitiveShapes / line / line.H
blob77c2ce5bc14750d9532f8b9258ff2a196e855fd0
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::line
27 Description
28     A line primitive.
30 SourceFiles
31     lineI.H
33 \*---------------------------------------------------------------------------*/
35 #ifndef line_H
36 #define line_H
38 #include "vector.H"
39 #include "PointHitTemplate.H"
40 #include "point2D.H"
42 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
44 namespace Foam
47 // Forward declaration of classes
49 class Istream;
50 class Ostream;
53 // Forward declaration of friend functions and operators
55 template<class Point, class PointRef> class line;
57 template<class Point, class PointRef>
58 inline Istream& operator>>(Istream&, line<Point, PointRef>&);
60 template<class Point, class PointRef>
61 inline Ostream& operator<<(Ostream&, const line<Point, PointRef>&);
64 /*---------------------------------------------------------------------------*\
65                            Class line Declaration
66 \*---------------------------------------------------------------------------*/
68 template<class Point, class PointRef>
69 class line
71     // Private data
73         PointRef a_, b_;
76 public:
78     // Constructors
80         //- Construct from two points
81         inline line(const Point& start, const Point& end);
83         //- Construct from Istream
84         inline line(Istream&);
87     // Member functions
89         // Access
91             //- Return first vertex
92             inline PointRef start() const;
94             //- Return second vertex
95             inline PointRef end() const;
98         // Properties
100             //- Return centre (centroid)
101             inline Point centre() const;
103             //- Return scalar magnitude
104             inline scalar mag() const;
106             //- Return start-end vector
107             inline Point vec() const;
109             //- Return nearest distance to line from a given point
110             //  If the nearest point is on the line, return a hit
111             PointHit<Point> nearestDist(const Point& p) const;
113             //- Return nearest distance from line to line. Returns distance
114             //  and sets both points (one on *this, one on the provided
115             //  linePointRef.
116             scalar nearestDist
117             (
118                 const line<Point, const Point&>& edge,
119                 Point& thisPoint,
120                 Point& edgePoint
121             ) const;
124     // Ostream operator
126         friend Istream& operator>> <Point, PointRef>
127         (
128             Istream&,
129             line&
130         );
132         friend Ostream& operator<< <Point, PointRef>
133         (
134             Ostream&,
135             const line&
136         );
140 //- 2D specialisation
141 template<>
142 scalar line<point2D, const point2D&>::nearestDist
144     const line<point2D, const point2D&>& edge,
145     point2D& thisPoint,
146     point2D& edgePoint
147 ) const;
150 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
152 } // End namespace Foam
154 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
156 #include "lineI.H"
158 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
160 #endif
162 // ************************************************************************* //