def testWeightedPoints(self): """ Data una nuvola di punti e una sua copia alla quale viene applicata una rototraslazione, vengono aggiunti dei punti differenti a peso nullo alle 2 nuvole. la funzione deve restituire esattamente la rototraslazione applicata alla seconda nuvola di punti """ teta = math.pi*2*random.random() 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)) 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 ] rn = random.randint(10,100) rand_pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(rn)] rand_pc2 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(rn)] weights = [1.0 for p in pc1] + [0.0 for x in xrange(rn)] mr = points_matching(pc1 + rand_pc1, pc2 + rand_pc2, weights) A = X(mr.A) self.assertAlmostEquals(A.a.x, T.a.x) self.assertAlmostEquals(A.a.y, T.a.y) self.assertAlmostEquals(A.b.x, T.b.x) self.assertAlmostEquals(A.b.y, T.b.y) self.assertAlmostEquals(A.c.x, T.c.x) self.assertAlmostEquals(A.c.y, T.c.y) self.assertAlmostEquals(self.calcPCErr([ p*A for p in pc1 ], pc2), 0.0, tollerance) self.assertNotAlmostEquals(self.calcPCErr([ p*A for p in pc1 + rand_pc1 ], pc2 + rand_pc2), 0.0)
def testIdentity(self): """ Date due identiche nuvole di punti, la trasformazione risultante dovra' essere l'identita' """ pc1 = [ P( (random.random()-0.5)*self.sf, (random.random()-0.5)*self.sf) for x in xrange(self.cloudSize)] pc2 = list(pc1) mr = points_matching(pc1, pc2) A = X(mr.A) I = X() self.assertAlmostEquals(A.a.x, I.a.x) self.assertAlmostEquals(A.a.y, I.a.y) self.assertAlmostEquals(A.b.x, I.b.x) self.assertAlmostEquals(A.b.y, I.b.y) self.assertAlmostEquals(A.c.x, I.c.x) self.assertAlmostEquals(A.c.y, I.c.y) self.assertAlmostEquals(self.calcPCErr([ p*A for p in pc1 ], pc2), 0.0, tollerance)
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 testPerfectTrasformation(self): """ Data una nuvola di punti e una sua copia alla quale viene applicata una rototraslazione, la funzione deve restituire esattamente la rototraslazione applicata alla seconda nuvola di punti """ teta = math.pi*2*random.random() 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)) 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) self.assertAlmostEquals(A.a.x, T.a.x) self.assertAlmostEquals(A.a.y, T.a.y) self.assertAlmostEquals(A.b.x, T.b.x) self.assertAlmostEquals(A.b.y, T.b.y) self.assertAlmostEquals(A.c.x, T.c.x) self.assertAlmostEquals(A.c.y, T.c.y) self.assertAlmostEquals(self.calcPCErr([ p*A for p in pc1 ], pc2), 0.0, tollerance)