| 1936 | | /* -------------------------------------------------------------------- */ |
|---|
| 1937 | | dfTestX = psObject->padfX[psObject->panPartStart[iOpRing]]; |
|---|
| 1938 | | dfTestY = psObject->padfY[psObject->panPartStart[iOpRing]]; |
|---|
| | 1936 | /* */ |
|---|
| | 1937 | /* -------------------------------------------------------------------- */ |
|---|
| | 1938 | |
|---|
| | 1939 | /* Use point in the middle of segment to avoid testing |
|---|
| | 1940 | * common points of rings. |
|---|
| | 1941 | */ |
|---|
| | 1942 | dfTestX = ( psObject->padfX[psObject->panPartStart[iOpRing]] |
|---|
| | 1943 | + psObject->padfX[psObject->panPartStart[iOpRing] + 1] ) / 2; |
|---|
| | 1944 | dfTestY = ( psObject->padfY[psObject->panPartStart[iOpRing]] |
|---|
| | 1945 | + psObject->padfY[psObject->panPartStart[iOpRing] + 1] ) / 2; |
|---|
| 1966 | | if( (psObject->padfY[iEdge+nVertStart] < dfTestY |
|---|
| 1967 | | && psObject->padfY[iNext+nVertStart] >= dfTestY) |
|---|
| 1968 | | || (psObject->padfY[iNext+nVertStart] < dfTestY |
|---|
| 1969 | | && psObject->padfY[iEdge+nVertStart] >= dfTestY) ) |
|---|
| | 1973 | /* Rule #1: |
|---|
| | 1974 | * Test whether the edge 'straddles' the horizontal ray from the test point (dfTestY,dfTestY) |
|---|
| | 1975 | * The rule #1 also excludes edges collinear with the ray. |
|---|
| | 1976 | */ |
|---|
| | 1977 | if ( ( psObject->padfY[iEdge+nVertStart] < dfTestY |
|---|
| | 1978 | && dfTestY <= psObject->padfY[iNext+nVertStart] ) |
|---|
| | 1979 | || ( psObject->padfY[iNext+nVertStart] < dfTestY |
|---|
| | 1980 | && dfTestY <= psObject->padfY[iEdge+nVertStart] ) ) |
|---|
| 1971 | | if( psObject->padfX[iEdge+nVertStart] |
|---|
| 1972 | | + (dfTestY - psObject->padfY[iEdge+nVertStart]) |
|---|
| 1973 | | / (psObject->padfY[iNext+nVertStart] |
|---|
| 1974 | | - psObject->padfY[iEdge+nVertStart]) |
|---|
| 1975 | | * (psObject->padfX[iNext+nVertStart] |
|---|
| 1976 | | - psObject->padfX[iEdge+nVertStart]) < dfTestX ) |
|---|
| | 1982 | /* Rule #2: |
|---|
| | 1983 | * Test if edge-ray intersection is on the right from the test point (dfTestY,dfTestY) |
|---|
| | 1984 | */ |
|---|
| | 1985 | float const intersect = |
|---|
| | 1986 | ( psObject->padfX[iEdge+nVertStart] |
|---|
| | 1987 | + ( dfTestY - psObject->padfY[iEdge+nVertStart] ) |
|---|
| | 1988 | / ( psObject->padfY[iNext+nVertStart] - psObject->padfY[iEdge+nVertStart] ) |
|---|
| | 1989 | * ( psObject->padfX[iNext+nVertStart] - psObject->padfX[iEdge+nVertStart] ) ); |
|---|
| | 1990 | |
|---|
| | 1991 | if (intersect < dfTestX) |
|---|
| | 1992 | { |
|---|