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
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)
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)