1 #Region "Microsoft.VisualBasic::89d976b1cd73243662419329334372d9, Microsoft.VisualBasic.Core\Extensions\Image\Math\PolygonD.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class PolygonD
35     
36     '         Constructor: (+2 OverloadsSub New
37     
38     '         Function: boundingInside, (+2 Overloads) inside
39     
40     '         Sub: calculateBounds
41     
42     
43     ' /********************************************************************************/
44
45 #End Region
46
47 Imports sys = System.Math
48
49 Namespace Imaging.Math2D
50
51     Public Class PolygonD
52
53         Public npoints As Integer = 0
54         Public xpoints As Double() = New Double(3) {}
55         Public ypoints As Double() = New Double(3) {}
56
57         Protected Friend bounds1 As Vector2D = Nothing
58         Protected Friend bounds2 As Vector2D = Nothing
59
60         Public Sub New()
61         End Sub
62
63         Public Sub New(paramArrayOfDouble1 As Double(), paramArrayOfDouble2 As Double(), paramInt As Integer)
64             Me.npoints = paramInt
65             Me.xpoints = New Double(paramInt - 1) {}
66             Me.ypoints = New Double(paramInt - 1) {}
67             Array.Copy(paramArrayOfDouble1, 0, Me.xpoints, 0, paramInt)
68             Array.Copy(paramArrayOfDouble2, 0, Me.ypoints, 0, paramInt)
69             calculateBounds(paramArrayOfDouble1, paramArrayOfDouble2, paramInt)
70         End Sub
71
72         Friend Overridable Sub calculateBounds(paramArrayOfDouble1 As Double(), paramArrayOfDouble2 As Double(), paramInt As Integer)
73             Dim d1 As Double = Double.MaxValue
74             Dim d2 As Double = Double.MaxValue
75             Dim d3 As Double = Double.MinValue
76             Dim d4 As Double = Double.MinValue
77             For i As Integer = 0 To paramInt - 1
78                 Dim d5 As Double = paramArrayOfDouble1(i)
79                 d1 = sys.Min(d1, d5)
80                 d3 = Math.Max(d3, d5)
81                 Dim d6 As Double = paramArrayOfDouble2(i)
82                 d2 = sys.Min(d2, d6)
83                 d4 = Math.Max(d4, d6)
84             Next
85             Me.bounds1 = New Vector2D(d1, d2)
86             Me.bounds2 = New Vector2D(d3, d4)
87         End Sub
88
89         Friend Overridable Function boundingInside(paramDouble1 As Double, paramDouble2 As DoubleAs Boolean
90             Return (paramDouble1 >= Me.bounds1.x) AndAlso (paramDouble1 <= Me.bounds2.x) AndAlso (paramDouble2 >= Me.bounds1.y) AndAlso (paramDouble2 <= Me.bounds2.y)
91         End Function
92
93         Public Overridable Function inside(paramVector2D As Vector2D) As Boolean
94             Return inside(paramVector2D.x, paramVector2D.y)
95         End Function
96
97         ''' <summary>
98         ''' @deprecated
99         ''' </summary>
100         Public Overridable Function inside(paramDouble1 As Double, paramDouble2 As DoubleAs Boolean
101             If boundingInside(paramDouble1, paramDouble2) Then
102                 Dim i As Integer = 0
103                 Dim d1 As Double = 0.0
104                 Dim j As Integer = 0
105                 While (j < Me.npoints) AndAlso (Me.ypoints(j) = paramDouble2)
106                     j += 1
107                 End While
108                 For k As Integer = 0 To Me.npoints - 1
109                     Dim m As Integer = (j + 1) Mod Me.npoints
110                     Dim d2 As Double = Me.xpoints(m) - Me.xpoints(j)
111                     Dim d3 As Double = Me.ypoints(m) - Me.ypoints(j)
112                     If d3 <> 0.0 Then
113                         Dim d4 As Double = paramDouble1 - Me.xpoints(j)
114                         Dim d5 As Double = paramDouble2 - Me.ypoints(j)
115                         If (Me.ypoints(m) = paramDouble2) AndAlso (Me.xpoints(m) >= paramDouble1) Then
116                             d1 = Me.ypoints(j)
117                         End If
118                         If (Me.ypoints(j) = paramDouble2) AndAlso (Me.xpoints(j) >= paramDouble1) Then
119                             If (If(d1 > paramDouble2, 1, 0)) <> (If(Me.ypoints(m) > paramDouble2, 1, 0)) Then
120                                 i -= 1
121                             End If
122                         End If
123                         Dim f As Single = CSng(d5) / CSng(d3)
124                         If (f >= 0.0) AndAlso (f <= 1.0) AndAlso (f * d2 >= d4) Then
125                             i += 1
126                         End If
127                     End If
128                     j = m
129                 Next
130                 Return i Mod 2 <> 0
131             End If
132             Return False
133         End Function
134     End Class
135 End Namespace