]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Resolve issues with floating-point round-off error in the geopoly_overlap()
authordrh <drh@noemail.net>
Sat, 12 May 2018 23:31:55 +0000 (23:31 +0000)
committerdrh <drh@noemail.net>
Sat, 12 May 2018 23:31:55 +0000 (23:31 +0000)
routine.

FossilOrigin-Name: a3c6696f2f39554e968dcd86c87296b0d54e5a1683c2b309071ca70e7631b178

ext/misc/geopoly.c
manifest
manifest.uuid

index 2c403c0cb441763a471a9db5f068c0845727d920..662eaccfb4933dd99855ca801aecad6488171b68 100644 (file)
@@ -501,6 +501,7 @@ struct GeoEvent {
 struct GeoSegment {
   double C, B;           /* y = C*x + B */
   double y;              /* Current y value */
+  float y0;              /* Initial y value */
   unsigned char side;    /* 1 for p1, 2 for p2 */
   unsigned int idx;      /* Which segment within the side */
   GeoSegment *pNext;     /* Next segment in a list sorted by y */
@@ -538,7 +539,8 @@ static void geopolyAddOneSegment(
   pSeg = p->aSegment + p->nSegment;
   p->nSegment++;
   pSeg->C = (y1-y0)/(x1-x0);
-  pSeg->B = y0 - x0*pSeg->C;
+  pSeg->B = y1 - x1*pSeg->C;
+  pSeg->y0 = y0;
   pSeg->side = side;
   pSeg->idx = idx;
   pEvent = p->aEvent + p->nEvent;
@@ -706,6 +708,7 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){
       GEODEBUG(("Distinct X: %g\n", pThisEvent->x));
       rX = pThisEvent->x;
       if( needSort ){
+        GEODEBUG(("SORT\n"));
         pActive = geopolySortSegmentsByYAndC(pActive);
         needSort = 0;
       }
@@ -725,7 +728,7 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){
         GEODEBUG(("Segment %d.%d %g->%g\n", pSeg->side, pSeg->idx, pSeg->y, y));
         pSeg->y = y;
         if( pPrev ){
-          if( pPrev->y>pSeg->y ){
+          if( pPrev->y>pSeg->y && pPrev->side!=pSeg->side ){
             rc = 1;
             GEODEBUG(("Crossing: %d.%d and %d.%d\n",
                     pPrev->side, pPrev->idx,
@@ -748,7 +751,7 @@ static int geopolyOverlap(GeoPoly *p1, GeoPoly *p2){
     if( pThisEvent->eType==0 ){
       /* Add a segment */
       pSeg = pThisEvent->pSeg;
-      pSeg->y = pSeg->C*rX + pSeg->B;
+      pSeg->y = pSeg->y0;
       pSeg->pNext = pActive;
       pActive = pSeg;
       needSort = 1;
index 687b3339f6a3776d037a4f6ce9c3bbb6df67af19..40e107acb41070ab4fe7c4115d226c6e5628eaf5 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\sgeopoly_svg()\sSQL\sfunction.
-D 2018-05-12T21:09:31.743
+C Resolve\sissues\swith\sfloating-point\sround-off\serror\sin\sthe\sgeopoly_overlap()\nroutine.
+D 2018-05-12T23:31:55.012
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in bfc40f350586923e0419d2ea4b559c37ec10ee4b6e210e08c14401f8e340f0da
@@ -279,7 +279,7 @@ F ext/misc/dbdump.c 69ef1be5b210538f77dfcc6fcb55b4b5f5e98b1e0bcfd67d818711e10761
 F ext/misc/eval.c 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3
 F ext/misc/fileio.c 48c7751c78fc4cdd29d8c862fd2f3f98bbfefa2a3cf1ca1496df4bf02eb8cded
 F ext/misc/fuzzer.c 7c64b8197bb77b7d64eff7cac7848870235d4c25
-F ext/misc/geopoly.c 0ff8defd4c14f696c6f7ae22f5b35684bb5e97d704b1fbcd83a52397ef1d748f
+F ext/misc/geopoly.c 3a07738e9e07000a7a6cdc8f03391d98d3a63f9aaff4eceafe3f528e9dd21cb3
 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c
 F ext/misc/json1.c dbe086615b9546c156bf32b9378fc09383b58bd17513b866cfd24c1e15281984
 F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567
@@ -1729,7 +1729,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 77bb7b7d7278725e4e02935d485c3540bb41f4fc29ca8da679b2a380ebc38d7d
-R 45a8a2641f4ccb20c343642fef078d5a
+P 318ba5f0c52596fc5ceed23a2b7b1ca18644449809890bfed47ab4ee01075060
+R 1da7cb9cf65004180c616e72e6f418ab
 U drh
-Z 51ab8a1c4e9dc75f7d7508c91ab6edda
+Z d3afa3a25b44d630c4f3a8b5d634f737
index 26f2d72709da78ade90ea486385b46a5670dd392..6494c9c2b2f6aed1b929ed4cc4ee6d9759ed2ffc 100644 (file)
@@ -1 +1 @@
-318ba5f0c52596fc5ceed23a2b7b1ca18644449809890bfed47ab4ee01075060
\ No newline at end of file
+a3c6696f2f39554e968dcd86c87296b0d54e5a1683c2b309071ca70e7631b178
\ No newline at end of file