def crossingPoints(self): """ All points, where 2 segments intersect A list of triples `(key1, key2, coordinate)`, where coordinate is a 2D vector. """ if self._cross_points is None: self._cross_points = col.defaultdict(list) for key1, key2 in it.combinations(self._coords, 2): for cr in ftuv.seg_intersect(self._coords[key1], self._coords[key2]): self._cross_points[key1].append((cr, key2)) self._cross_points[key2].append((cr, key1)) return self._cross_points
def test_seg_intersect(self): #normal case isec = ftuv.seg_intersect(([0., 1.], [0., -1.]), ([-1., 0.], [1., 0.])) self.assertEqual(len(isec), 1) np.testing.assert_allclose(isec[0], [0., 0.]) #parallel, no intersection isec = ftuv.seg_intersect(([0., 3.], [1., 3.]), ([2., 3.], [3., 3.])) self.assertEqual(isec, []) #one inside other isec = ftuv.seg_intersect(([0., 0.], [4., 4.]), ([1., 1.], [2., 2.])) self.assertEqual(len(isec), 2) isec = sorted(isec, key=lambda x: (x[0], x[1])) np.testing.assert_allclose(isec[0], [1., 1.]) np.testing.assert_allclose(isec[1], [2., 2.]) isec = ftuv.seg_intersect(([1., 1.], [2., 2.]), ([0., 0.], [4., 4.])) self.assertEqual(len(isec), 2) isec = sorted(isec, key=lambda x: (x[0], x[1])) np.testing.assert_allclose(isec[0], [1., 1.]) np.testing.assert_allclose(isec[1], [2., 2.]) #overlapping isec = ftuv.seg_intersect(([0., 2.], [2., 4.]), ([1., 3.], [3., 5.])) self.assertEqual(len(isec), 2) isec = sorted(isec, key=lambda x: (x[0], x[1])) np.testing.assert_allclose(isec[0], [1., 3.]) np.testing.assert_allclose(isec[1], [2., 4.]) #non-parallel, no intersection isec = ftuv.seg_intersect(([0., 2.], [2., 4.]), ([5., 3.], [10, 5.])) self.assertEqual(isec, []) #shared endpoint isec = ftuv.seg_intersect(([0., 1.], [0., 4.]), ([0., 4.], [5., 7.])) self.assertEqual(len(isec), 1) np.testing.assert_allclose(isec[0], [0., 4.]) isec = ftuv.seg_intersect(([0., 1.], [0., 4.]), ([0., 1.], [-5., 7.])) self.assertEqual(len(isec), 1) np.testing.assert_allclose(isec[0], [0., 1.]) #Invalid inputs with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 1.], [0., 4.]), ([0., 1.], [-5., 7., 5.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 1., 3.], [0., 4.]), ([0., 1.], [-5., 7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 1.], [0., 4., 5.]), ([0., 1.], [-5., 7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 1.], [0., 4.]), ([0., 1., 7.], [-5., 7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 1.], [0., 4., 6.]), ([0., 1., 7.], [-5., 7., 8.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.], [0., 4.]), ([0., 1.], [-5., 7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 5.], [4.34]), ([0., 1.], [-5., 7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.3, 5.2], [0.3, 5.2]), ([0., 1.], [-5., 7.]))
def test_seg_intersect(self): #normal case isec=ftuv.seg_intersect(([0.,1.], [0., -1.]), ([-1.,0.], [1.,0.])) self.assertEqual(len(isec), 1) np.testing.assert_allclose(isec[0], [0., 0.]) #parallel, no intersection isec=ftuv.seg_intersect(([0., 3.],[1., 3.]),([2.,3.], [3.,3.])) self.assertEqual(isec, []) #one inside other isec=ftuv.seg_intersect(([0.,0.],[4.,4.]), ([1.,1.], [2.,2.])) self.assertEqual(len(isec), 2) isec=sorted(isec, key=lambda x: (x[0], x[1])) np.testing.assert_allclose(isec[0], [1., 1.]) np.testing.assert_allclose(isec[1], [2., 2.]) isec=ftuv.seg_intersect(([1.,1.], [2.,2.]), ([0.,0.],[4.,4.])) self.assertEqual(len(isec), 2) isec=sorted(isec, key=lambda x: (x[0], x[1])) np.testing.assert_allclose(isec[0], [1., 1.]) np.testing.assert_allclose(isec[1], [2., 2.]) #overlapping isec=ftuv.seg_intersect(([0.,2.], [2.,4.]), ([1.,3.],[3.,5.])) self.assertEqual(len(isec), 2) isec=sorted(isec, key=lambda x: (x[0], x[1])) np.testing.assert_allclose(isec[0], [1., 3.]) np.testing.assert_allclose(isec[1], [2., 4.]) #non-parallel, no intersection isec=ftuv.seg_intersect(([0.,2.], [2.,4.]), ([5.,3.],[10,5.])) self.assertEqual(isec, []) #shared endpoint isec=ftuv.seg_intersect(([0.,1.], [0., 4.]), ([0.,4.], [5.,7.])) self.assertEqual(len(isec), 1) np.testing.assert_allclose(isec[0], [0., 4.]) isec=ftuv.seg_intersect(([0.,1.], [0., 4.]), ([0.,1.], [-5.,7.])) self.assertEqual(len(isec), 1) np.testing.assert_allclose(isec[0], [0., 1.]) #Invalid inputs with self.assertRaises(ValueError): ftuv.seg_intersect(([0.,1.], [0., 4.]), ([0.,1.], [-5.,7., 5.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.,1., 3.], [0., 4.]), ([0.,1.], [-5.,7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.,1.], [0., 4., 5.]), ([0.,1.], [-5.,7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.,1.], [0., 4.]), ([0.,1., 7.], [-5.,7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.,1.], [0., 4., 6.]), ([0.,1., 7.], [-5.,7.,8.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.], [0., 4.]), ([0.,1.], [-5.,7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0., 5.], [4.34]), ([0.,1.], [-5.,7.])) with self.assertRaises(ValueError): ftuv.seg_intersect(([0.3, 5.2], [0.3, 5.2]), ([0.,1.], [-5.,7.]))