예제 #1
0
 def calcPCErr(self, pc1, pc2):
     """
     Calcola la distanza di un punto dal suo corrispondente fra due nuvole di punti
     """
     errore = 0.0
     for p1, p2 in zip(pc1, pc2):
         d = dist(p1,p2)
         errore += d*d
     return errore
예제 #2
0
 def testScaledTrasformation(self):
     """
     Data una nuovola di punti e una sua copia a cui viene applicata una matrice roto-scaling-traslazione
     la funzione dovra' restituire una matrice di rototraslazione che non applichi nessuno scaling
     alla prima nuvola.
     """
     teta = math.pi*2*random.random()
     sf = random.randrange(30,70) / 100
     x1 = math.cos(teta)
     x2 = math.sin(teta)
     x3 = random.random()*self.sf
     x4 = random.random()*self.sf
     T = X(P(x1, x2), P(-x2, x1), P(x3, x4)) * scale(sf)
     pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(self.cloudSize)]
     pc2 = [ p*T for p in pc1 ]
     mr = points_matching(pc1, pc2)
     A = X(mr.A)
     pc1_bis = [ p*A for p in pc1 ]
     # La distanza tra i 2 punti originali deve essere la stessa tra i 2 punti trasformati.
     # In questo modo si e' sicuri che non ci sia stato nessuno scaling
     for (p1, p1bis) , (p2, p2bis) in pairwise( zip(pc1, pc1_bis) ):
         self.assertAlmostEquals(dist(p1,p2), dist(p1bis, p2bis), tollerance)
예제 #3
0
    def testInterpola(self):
        """interpola aggiunge i punti per distanza massima 3.0 (bug #3071)."""
        path = geo2d.Path([P(0, 0), P(5, 0), P(10, 0)])
        new_path = geo2d.interpola(path, 3.0)
        self.assertAlmostEqual(geo2d.pathPathDist(new_path, path), 0)

        # La soluzione ottimale per il path prevede 5 punti, quindi se ne sta
        # mettendo di più o di meno sta sbagliando.
        self.assert_(len(new_path) == 5)

        for i_pt, pt in enumerate(new_path):
            if i_pt == 0:
                continue
            self.assert_(geo2d.dist(pt, new_path[i_pt - 1]) < 3.0)