예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
 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.]))
예제 #4
0
 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.]))