52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
import unittest
|
|
|
|
import pytest
|
|
|
|
from shapely.geometry.polygon import LinearRing, Polygon, orient, signed_area
|
|
|
|
|
|
class SignedAreaTestCase(unittest.TestCase):
|
|
def test_triangle(self):
|
|
tri = LinearRing([(0, 0), (2, 5), (7, 0)])
|
|
assert signed_area(tri) == pytest.approx(-7 * 5 / 2)
|
|
|
|
def test_square(self):
|
|
xmin, xmax = (-1, 1)
|
|
ymin, ymax = (-2, 3)
|
|
rect = LinearRing(
|
|
[(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax), (xmin, ymin)]
|
|
)
|
|
assert signed_area(rect) == pytest.approx(10.0)
|
|
|
|
|
|
class RingOrientationTestCase(unittest.TestCase):
|
|
def test_ccw(self):
|
|
ring = LinearRing([(1, 0), (0, 1), (0, 0)])
|
|
assert ring.is_ccw
|
|
|
|
def test_cw(self):
|
|
ring = LinearRing([(0, 0), (0, 1), (1, 0)])
|
|
assert not ring.is_ccw
|
|
|
|
|
|
class PolygonOrienterTestCase(unittest.TestCase):
|
|
def test_no_holes(self):
|
|
ring = LinearRing([(0, 0), (0, 1), (1, 0)])
|
|
polygon = Polygon(ring)
|
|
assert not polygon.exterior.is_ccw
|
|
polygon = orient(polygon, 1)
|
|
assert polygon.exterior.is_ccw
|
|
|
|
def test_holes(self):
|
|
# fmt: off
|
|
polygon = Polygon(
|
|
[(0, 0), (0, 1), (1, 0)],
|
|
[[(0.5, 0.25), (0.25, 0.5), (0.25, 0.25)]]
|
|
)
|
|
# fmt: on
|
|
assert not polygon.exterior.is_ccw
|
|
assert polygon.interiors[0].is_ccw
|
|
polygon = orient(polygon, 1)
|
|
assert polygon.exterior.is_ccw
|
|
assert not polygon.interiors[0].is_ccw
|