From ddcc00526b2fdfe479df6d0a46e611232bc592f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Wed, 8 May 2024 12:33:47 +0200 Subject: [PATCH 1/7] Remove artifact from Polygon rendering --- datashader/glyphs/polygon.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/datashader/glyphs/polygon.py b/datashader/glyphs/polygon.py index d1d0838cd..e584c2ee5 100644 --- a/datashader/glyphs/polygon.py +++ b/datashader/glyphs/polygon.py @@ -197,8 +197,10 @@ def draw_polygon( # Reject edges that are above, below, or left of current pixel. # Note: Edge skipped if lower vertex overlaps, # but is kept if upper vertex overlaps - if (y0c >= yi or y1c < yi - or (x0c < xi and x1c < xi) + if ( + y0c >= yi + # or y1c > yi # Create white dots https://github.com/holoviz/datashader/issues/1327 + or (x0c < xi and x1c < xi) ): # Edge not eligible for any remaining pixel in this row eligible[ei] = 0 From 0eb9b4e73dcf1ddeb0f7f420df03cdb263ef73ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Wed, 8 May 2024 22:26:12 +0200 Subject: [PATCH 2/7] Add some isclose --- datashader/glyphs/polygon.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/datashader/glyphs/polygon.py b/datashader/glyphs/polygon.py index e584c2ee5..5be9416b8 100644 --- a/datashader/glyphs/polygon.py +++ b/datashader/glyphs/polygon.py @@ -155,7 +155,10 @@ def draw_polygon( x1c = x_mapper(x1) * sx + tx - 0.5 y1c = y_mapper(y1) * sy + ty - 0.5 - if y1c > y0c: + if np.isclose(y1c, y0c): + # Skip horizontal edges + continue + elif y1c > y0c: xs[ei, 0] = x0c ys[ei, 0] = y0c xs[ei, 1] = x1c @@ -199,7 +202,7 @@ def draw_polygon( # but is kept if upper vertex overlaps if ( y0c >= yi - # or y1c > yi # Create white dots https://github.com/holoviz/datashader/issues/1327 + or y1c < yi or (x0c < xi and x1c < xi) ): # Edge not eligible for any remaining pixel in this row @@ -223,7 +226,7 @@ def draw_polygon( # Compute cross product of B and A bxa = (bx * ay - by * ax) - if bxa < 0 or (bxa == 0 and yincreasing[ei]): + if bxa < 0 or (np.isclose(bxa, 0) and yincreasing[ei]): # Edge to the right winding_number += yincreasing[ei] else: From 35946e941c689896ed02e61a70137e6b6029a68b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Wed, 8 May 2024 22:26:26 +0200 Subject: [PATCH 3/7] Remove + 1 --- datashader/glyphs/polygon.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datashader/glyphs/polygon.py b/datashader/glyphs/polygon.py index 5be9416b8..434edfc75 100644 --- a/datashader/glyphs/polygon.py +++ b/datashader/glyphs/polygon.py @@ -130,11 +130,11 @@ def draw_polygon( append(i, startxi, startyi, *aggs_and_cols) return elif (stopxi - startxi) == 1: - for yi in range(min(startyi, stopyi) + 1, max(startyi, stopyi)): + for yi in range(min(startyi, stopyi), max(startyi, stopyi)): append(i, startxi, yi, *aggs_and_cols) return elif (stopyi - startyi) == 1: - for xi in range(min(startxi, stopxi) + 1, max(startxi, stopxi)): + for xi in range(min(startxi, stopxi), max(startxi, stopxi)): append(i, xi, startyi, *aggs_and_cols) return From f285f640f5869b35d9ceaa9544c4f6913dd07b3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Thu, 9 May 2024 08:58:18 +0200 Subject: [PATCH 4/7] Revert non-essential changes --- datashader/glyphs/polygon.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/datashader/glyphs/polygon.py b/datashader/glyphs/polygon.py index 434edfc75..49e68b705 100644 --- a/datashader/glyphs/polygon.py +++ b/datashader/glyphs/polygon.py @@ -155,10 +155,7 @@ def draw_polygon( x1c = x_mapper(x1) * sx + tx - 0.5 y1c = y_mapper(y1) * sy + ty - 0.5 - if np.isclose(y1c, y0c): - # Skip horizontal edges - continue - elif y1c > y0c: + if y1c > y0c: xs[ei, 0] = x0c ys[ei, 0] = y0c xs[ei, 1] = x1c @@ -200,10 +197,8 @@ def draw_polygon( # Reject edges that are above, below, or left of current pixel. # Note: Edge skipped if lower vertex overlaps, # but is kept if upper vertex overlaps - if ( - y0c >= yi - or y1c < yi - or (x0c < xi and x1c < xi) + if (y0c >= yi or y1c < yi + or (x0c < xi and x1c < xi) ): # Edge not eligible for any remaining pixel in this row eligible[ei] = 0 @@ -226,7 +221,7 @@ def draw_polygon( # Compute cross product of B and A bxa = (bx * ay - by * ax) - if bxa < 0 or (np.isclose(bxa, 0) and yincreasing[ei]): + if bxa < 0 or (bxa == 0 and yincreasing[ei]): # Edge to the right winding_number += yincreasing[ei] else: From b7ab59f64269fce7ff3e299084e60a04b6680e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Thu, 9 May 2024 09:15:01 +0200 Subject: [PATCH 5/7] Update tests to match new implementation --- datashader/tests/test_geopandas.py | 6 +++--- datashader/tests/test_polygons.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/datashader/tests/test_geopandas.py b/datashader/tests/test_geopandas.py index a039dddf3..f1f4c7df8 100644 --- a/datashader/tests/test_geopandas.py +++ b/datashader/tests/test_geopandas.py @@ -86,15 +86,15 @@ [nan, nan, 0., 0., 0., 0., 0., nan, 2., 2., 2., 2., 2., 2., 2., 2., 1., 1., nan, nan], # noqa: E501 [nan, nan, 0., 0., 0., 0., 0., nan, 2., 2., 2., 2., 2., 2., 2., 2., 1., 1., nan, nan], # noqa: E501 [nan, nan, nan, 0., nan, nan, nan, nan, 2., 2., 2., 2., 2., 2., 1., 1., 1., 1., 1., nan], # noqa: E501 - [nan, nan, nan, nan, nan, nan, nan, nan, nan, 2., 2., 2., 2., 2., 1., 1., 1., 1., 1., nan], # noqa: E501 + [nan, nan, nan, nan, nan, nan, nan, nan, 3., 2., 2., 2., 2., 2., 1., 1., 1., 1., 1., nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, 3., 3., 3., 2., 2., 2., 1., 1., 1., 1., 1., 1., nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 3., 2., 1., 1., 1., 1., 1., 1., 1., nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 3., 1., 1., 1., 1., 1., 1., 1., 1., 1.], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 3., 1., 1., 1., 1., 1., 1., 1., 1., 1.], # noqa: E501 - [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 3., 1., 1., nan, 1., 1., 1., nan, nan], # noqa: E501 + [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 3., 1., 4., nan, 1., 1., 1., nan, nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 3., 4., 4., nan, nan, nan, nan, nan, nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 4., 4., 4., 4., nan, nan, nan, nan], # noqa: E501 - [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 4., 4., 4., 4., 4., nan, nan, nan], # noqa: E501 + [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 4., 4., 4., 4., 4., 4., nan, nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 4., 4., 4., 4., 4., 4., nan, nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 3., 4., 4., 4., 4., 4., 4., nan, nan], # noqa: E501 [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 4., 4., 4., nan, nan, nan, nan, nan], # noqa: E501 diff --git a/datashader/tests/test_polygons.py b/datashader/tests/test_polygons.py index 634938d6a..178e8990f 100644 --- a/datashader/tests/test_polygons.py +++ b/datashader/tests/test_polygons.py @@ -244,7 +244,7 @@ def test_multipolygon_subpixel_vertical(DataFrame, scale): [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], - [0, 1, 1, 0, 0, 1, 1, 0], + [1, 1, 1, 0, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] @@ -278,11 +278,11 @@ def test_multipolygon_subpixel_horizontal(DataFrame, scale): agg = cvs.polygons(df, 'geometry', agg=ds.count()) sol = np.array([ - [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] From 0f477addea14d0d9f2cf05e6ef88af9d4103c71d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Thu, 9 May 2024 09:17:59 +0200 Subject: [PATCH 6/7] Exclude Python 3.9 + Windows as it won't solve --- .github/workflows/test.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index cfe40fd1a..65ea71afc 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -66,16 +66,26 @@ jobs: run: | MATRIX=$(jq -nsc '{ "os": ["ubuntu-latest", "macos-latest", "windows-latest"], - "python-version": ["3.9", "3.10", "3.11", "3.12"] + "python-version": ["3.9", "3.10", "3.11", "3.12"], + "exclude": [{ + "os": "windows-latest", + "python-version": "3.9" + }] }') + # Windows won't solve on Windows + Python 3.9 echo "MATRIX=$MATRIX" >> $GITHUB_ENV - name: Set test matrix with 'full' option if: env.MATRIX_OPTION == 'full' run: | MATRIX=$(jq -nsc '{ "os": ["ubuntu-latest", "macos-latest", "windows-latest"], - "python-version": ["3.9", "3.10", "3.11", "3.12"] + "python-version": ["3.9", "3.10", "3.11", "3.12"], + "exclude": [{ + "os": "windows-latest", + "python-version": "3.9" + }] }') + # Windows won't solve on Windows + Python 3.9 echo "MATRIX=$MATRIX" >> $GITHUB_ENV - name: Set test matrix with 'downstream' option if: env.MATRIX_OPTION == 'downstream' From 2d16fe70b61c7bd31f20e0725a724b0fdd61120d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20H=C3=B8xbro=20Hansen?= Date: Fri, 10 May 2024 06:32:54 +0200 Subject: [PATCH 7/7] Apply suggestions from code review --- .github/workflows/test.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 65ea71afc..7b5a1243f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -72,7 +72,7 @@ jobs: "python-version": "3.9" }] }') - # Windows won't solve on Windows + Python 3.9 + # Won't solve on Windows + Python 3.9 echo "MATRIX=$MATRIX" >> $GITHUB_ENV - name: Set test matrix with 'full' option if: env.MATRIX_OPTION == 'full' @@ -85,7 +85,7 @@ jobs: "python-version": "3.9" }] }') - # Windows won't solve on Windows + Python 3.9 + # Won't solve on Windows + Python 3.9 echo "MATRIX=$MATRIX" >> $GITHUB_ENV - name: Set test matrix with 'downstream' option if: env.MATRIX_OPTION == 'downstream'