00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 subroutine psmile_overlap_dble ( n_corners_src, n_corners_tgt, src, tgt, overlap )
00012
00013
00014
00015 use PSMILe
00016
00017 implicit none
00018
00019
00020
00021 Integer, Intent(In) :: n_corners_src
00022 Integer, Intent(In) :: n_corners_tgt
00023 Type (line_dble), Intent(In) :: src(n_corners_src)
00024 Type (line_dble), Intent(In) :: tgt(n_corners_tgt)
00025
00026
00027
00028 Logical, Intent(Out) :: overlap
00029
00030
00031
00032 Integer :: i, j
00033
00034 Logical :: intersect_dble
00035 Logical :: inside_dble
00036 Logical :: exact_dble
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 Character(len=len_cvs_string), save :: mycvs =
00057 '$Id: $'
00058
00059
00060
00061
00062
00063 overlap = .false.
00064
00065
00066
00067 do j = 1, n_corners_tgt
00068 do i = 1, n_corners_src
00069 overlap = intersect_dble ( src(i), tgt(j) )
00070 if ( overlap ) return
00071 enddo
00072 enddo
00073
00074
00075
00076 overlap = inside_dble ( n_corners_src, n_corners_tgt, src, tgt )
00077 if ( overlap ) return
00078
00079
00080
00081 if ( n_corners_src == n_corners_tgt ) &
00082 overlap = exact_dble ( n_corners_src, src, tgt )
00083
00084 end subroutine psmile_overlap_dble
00085
00086
00087
00088 logical function intersect_dble ( line1, line2 )
00089
00090 use PSMILe, only : shlon, line_dble, zero, one
00091 implicit none
00092
00093 type(line_dble) :: line1
00094 type(line_dble) :: line2
00095
00096 Double Precision, Parameter :: tol = 1.0d-12
00097
00098 Double Precision :: determinant
00099 Double Precision :: numer1
00100 Double Precision :: numer2
00101
00102 integer :: i
00103
00104
00105
00106
00107 intersect_dble = .false.
00108
00109 determinant = ( line2%p2%y - line2%p1%y ) * ( line1%p2%x - line1%p1%x ) - &
00110 ( line2%p2%x - line2%p1%x ) * ( line1%p2%y - line1%p1%y )
00111
00112 if ( abs(determinant) < tol ) return
00113
00114
00115
00116
00117
00118 do i = 0, 2
00119
00120 numer1 = ( line2%p2%x - line2%p1%x ) * &
00121 ( line1%p1%y - line2%p1%y ) - &
00122 ( line2%p2%y - line2%p1%y ) * &
00123 ( line1%p1%x - line2%p1%x + shlon(i) )
00124
00125 numer2 = ( line1%p2%x - line1%p1%x ) * &
00126 ( line1%p1%y - line2%p1%y ) - &
00127 ( line1%p2%y - line1%p1%y ) * &
00128 ( line1%p1%x - line2%p1%x + shlon(i) )
00129
00130 if ( ( numer1/determinant >= zero .and. numer1/determinant <= one ) .and. &
00131 ( numer2/determinant >= zero .and. numer2/determinant <= one ) ) then
00132 intersect_dble = .true.
00133
00134 return
00135 endif
00136
00137 enddo
00138
00139 end function intersect_dble
00140
00141
00142
00143 logical function inside_dble ( nbr_corners_src, nbr_corners_tgt, src, tgt )
00144
00145 use PSMILe, only : shlon, line_dble
00146 implicit none
00147
00148 Integer, Intent(In) :: nbr_corners_src
00149 Integer, Intent(In) :: nbr_corners_tgt
00150 Type (line_dble), Intent(In) :: src(nbr_corners_src)
00151 Type (line_dble), Intent(In) :: tgt(nbr_corners_tgt)
00152
00153 Double Precision :: nominator, denominator, xinters
00154
00155 integer :: i, k, n, counter
00156
00157
00158
00159
00160
00161 inside_dble = .false.
00162
00163
00164
00165
00166 do n = 0, 2
00167
00168
00169
00170
00171
00172
00173
00174 do k = 1, nbr_corners_tgt
00175
00176 counter = 0
00177
00178 do i = 1, nbr_corners_src
00179 #if 0
00180 if ( (src(i)%p1%y <= tgt(k)%p1%y .and. &
00181 tgt(k)%p1%y < src(i)%p2%y) .or. &
00182 (src(i)%p2%y <= tgt(k)%p1%y .and. &
00183 tgt(k)%p1%y < src(i)%p1%y) ) then
00184 nominator = (src(i)%p2%x-src(i)%p1%x) * (tgt(k)%p1%y-src(i)%p1%y)
00185 denominator = src(i)%p2%y-src(i)%p1%y
00186 xinters = nominator/denominator + src(i)%p1%x
00187 if ( tgt(k)%p1%x < xinters ) counter = counter + 1
00188 endif
00189 #else
00190 if ( tgt(k)%p1%y > min(src(i)%p1%y,src(i)%p2%y) ) then
00191 if ( tgt(k)%p1%y <= max(src(i)%p1%y,src(i)%p2%y) ) then
00192 if ( tgt(k)%p1%x + shlon(n) <= max(src(i)%p1%x,src(i)%p2%x) ) then
00193 if ( src(i)%p1%y /= src(i)%p2%y ) then
00194 nominator = (tgt(k)%p1%y-src(i)%p1%y) * (src(i)%p2%x-src(i)%p1%x)
00195 denominator = (src(i)%p2%y-src(i)%p1%y)
00196 xinters = nominator / denominator + src(i)%p1%x
00197 if ( src(i)%p1%x == src(i)%p2%x .or. tgt(k)%p1%y <= xinters ) counter = counter + 1
00198 endif
00199 endif
00200 endif
00201 endif
00202 #endif
00203 enddo
00204
00205 if ( mod(counter,2) /= 0 ) then
00206 inside_dble = .true.
00207 return
00208 endif
00209
00210 enddo
00211
00212
00213
00214
00215 do k = 1, nbr_corners_src
00216
00217 counter = 0
00218
00219 do i = 1, nbr_corners_tgt
00220 #if 0
00221 if ( (tgt(i)%p1%y <= src(k)%p1%y .and. &
00222 src(k)%p1%y < tgt(i)%p2%y) .or. &
00223 (tgt(i)%p2%y <= src(k)%p1%y .and. &
00224 src(k)%p1%y < tgt(i)%p1%y) ) then
00225 nominator = (tgt(i)%p2%x-tgt(i)%p1%x) * (src(k)%p1%y-tgt(i)%p1%y)
00226 denominator = tgt(i)%p2%y-tgt(i)%p1%y
00227 xinters = nominator/denominator + tgt(i)%p1%x
00228 if ( src(k)%p1%x < xinters ) counter = counter + 1
00229 endif
00230 #else
00231 if ( src(k)%p1%y > min(tgt(i)%p1%y,tgt(i)%p2%y) ) then
00232 if ( src(k)%p1%y <= max(tgt(i)%p1%y,tgt(i)%p2%y) ) then
00233 if ( src(k)%p1%x + shlon(n) <= max(tgt(i)%p1%x,tgt(i)%p2%x) ) then
00234 if ( tgt(i)%p1%y /= tgt(i)%p2%y ) then
00235 nominator = (src(k)%p1%y-tgt(i)%p1%y) * (tgt(i)%p2%x-tgt(i)%p1%x)
00236 denominator = (tgt(i)%p2%y-tgt(i)%p1%y)
00237 xinters = nominator / denominator + tgt(i)%p1%x
00238 if ( tgt(i)%p1%x == tgt(i)%p2%x .or. src(k)%p1%x <= xinters ) counter = counter + 1
00239 endif
00240 endif
00241 endif
00242 endif
00243 #endif
00244 enddo
00245
00246 if ( mod(counter,2) /= 0 ) then
00247 inside_dble = .true.
00248 return
00249 endif
00250
00251 enddo
00252
00253 enddo
00254
00255 end function inside_dble
00256
00257
00258
00259 logical function exact_dble ( nbr_corners, src, tgt )
00260
00261 use PSMILe, only : shlon, line_dble
00262 implicit none
00263
00264 Integer, Intent(In) :: nbr_corners
00265 Type (line_dble), Intent(In) :: src(nbr_corners)
00266 Type (line_dble), Intent(In) :: tgt(nbr_corners)
00267
00268 Double Precision :: tol = 1.0d-12
00269
00270 integer :: i, j, k, n
00271
00272 exact_dble = .false.
00273
00274
00275
00276
00277
00278 do k = 0, 2
00279 n = 0
00280 do i = 1, nbr_corners
00281 do j = 1, nbr_corners
00282 if ( abs(src(i)%p1%x + shlon(k) - tgt(j)%p1%x) < tol .and. &
00283 abs(src(i)%p1%y - tgt(j)%p1%y) < tol ) then
00284 n = n + 1
00285 exit
00286 endif
00287 enddo
00288 enddo
00289 exact_dble = ( n > 2 )
00290 if ( exact_dble ) return
00291 enddo
00292
00293 end function exact_dble