Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / algorithms / polygon / clipping / SutherlandHodgmanI.H
bloba3568bd531649a9ddf65a1c15766f9531151f42c
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 Author
25     Martin Beaudoin, Hydro-Quebec, (2008)
27 \*---------------------------------------------------------------------------*/
29 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
31 inline bool Foam::SutherlandHodgman::isPointVisibleFromCuttingSegment
33     const point2D& p
34 ) const
36     // We assume a right-hand rule system
37     //
38     //                      / P3
39     //                     /
40     //                    /
41     //                   /
42     //                  /
43     //                 /
44     //             P1 ---------------- P2
45     //
46     // if CrossProduct = (x2 − x1)(y3 − y1) − (y2 − y1)(x3 − x1) >= 0 ,
47     // so sin(teta) >= 0, we consider the point p3 visible
48     //
49     // Ref: http://en.wikipedia.org/wiki/Cross_product, Section Applications,
50     // Computational geometry
51     //
52     //  P1 (x1, y1)
53     //  P2 (x2, y2)
54     //  P3 (x3, y3)
55     //
56     //  x1 = clippingPolygon_[currentClipEdgeP1_][0]
57     //  y1 = clippingPolygon_[currentClipEdgeP1_][1]
58     //  x2 = clippingPolygon_[currentClipEdgeP2_][0]
59     //  y2 = clippingPolygon_[currentClipEdgeP2_][1]
60     //  x3 = p[0]
61     //  y3 = p[1]
63     // return ((x2 - x1)*(y3 - y1) - (y2 - y1)*(x3 - x1) >= 0);
64     return
65     (
66         (
67             clippingPolygon_[currentClipEdgeP2_][0]
68           - clippingPolygon_[currentClipEdgeP1_][0]
69         )*(p[1] - clippingPolygon_[currentClipEdgeP1_][1])
70       - (
71           clippingPolygon_[currentClipEdgeP2_][1]
72         - clippingPolygon_[currentClipEdgeP1_][1]
73         )*(p[0] - clippingPolygon_[currentClipEdgeP1_][0])
74      >= 0
75     );
79 inline bool Foam::SutherlandHodgman::clipSegment
81     const point2D& p1,
82     const point2D& p2,
83     point2D& intersectPt
84 ) const
86     return lineSegmentIntersection
87     (
88         p1,
89         p2,
90         clippingPolygon_[currentClipEdgeP1_],
91         clippingPolygon_[currentClipEdgeP2_],
92         intersectPt
93     );
97 // ************************************************************************* //