Changeset 11689

Show
Ignore:
Timestamp:
06/21/07 11:48:56 (1 year ago)
Author:
mloskot
Message:

Fixed inner-outer ring relation test in Shapefile driver (Ticket #976, #1415).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/ogr/ogrsf_frmts/shape/shpopen.c

    r11008 r11689  
    19341934/*      we need to fix this to handle multiple island polygons and      */ 
    19351935/*      unordered sets of rings.                                        */ 
    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; 
    19391946 
    19401947        bInner = FALSE; 
     
    19641971                    iNext = 0; 
    19651972 
    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] ) ) 
    19701981                { 
    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                    { 
    19771993                        bInner = !bInner; 
    1978                 } 
     1994                    } 
     1995                }     
    19791996            } 
    1980         } 
     1997        } /* for iCheckRing */ 
    19811998 
    19821999/* -------------------------------------------------------------------- */