예제 #1
0
    def testFourWeightedLinesOverSquare(self):
        """
        Dati 4 segmenti non tutti sovrapponibili contemporaneamente ad un quadrato a causa di uno solo segmento,
        se si assegna un raggio maggiore  al segmento "non sovrapponibile", l'errore diminuisce rispetto
        al caso in cui, allo stesso segmento, gli si assegni un peso pari a quello degli altri segmenti
        """
        square = Path([P(0,0), P(0, 100), P(100,100), P(100,0), P(0,0)])
        sqw = [1.0, 1.0, 1.0, 1.0, 1.0]

        T = rot(random.random()*2*math.pi) * xlate(P(random.random()*self.sf, random.random()*self.sf))

        seg1 = Path([P(0,0), P(0,60)]) * T
        w1 = [1.0, 1.0]

        seg2 = Path([P(110,100), P(110,60)]) * T
        w2 = [100.0, 100.0]

        seg3 = Path([P(0,100), P(70,100)]) * T
        w3 = [1.0, 1.0]

        seg4 = Path([P(0,0), P(83,0)]) * T
        w4 = [1.0, 1.0]

        mr1 = vecpathOverPath([seg1, seg2, seg3, seg4], square, 10)
        e1 = float(mr1.sse)
        # seg2 non puo' essere sovrapposto a square insieme agli altri segmenti.
        # Se aumentiamo il raggio di precisione di seg2 , gli
        # altri si dovrebbero allineare meglio, facendo diminuire l'errore
        mr2 = vecpathOverPath([seg1, seg2, seg3, seg4], [w1, w2, w3, w4], square, sqw, 10)
        e2 = float(mr2.sse)
        self.assertTrue(e2 <= e1)
예제 #2
0
    def testHalfSquareOverSquare(self):
        """
        Sovrapposizione di un mezzo quadrato su un quadrato
        """
        sq = Path([P(0,0), P(10,0), P(17,0), P(80,0), P(100,0), P(100,100), P(0,100), P(0,0)])
        hsq = Path([P(100,100), P(0,100), P(0,0)]) * rot(random.random()*2*math.pi) * xlate(P(random.random()*self.sf, random.random()*self.sf))
        mr = pathOverPath(hsq, sq, 10)

        self.assertAlmostEquals(mr.sse/mr.n, 0.0)
        A = X(mr.A)
        for p1 in hsq: # controllo della distanza punto-path
            self.assertAlmostEquals(sq.project(p1*A).dist, 0, tollerance)
예제 #3
0
 def testTwoLinesOverSquare(self):
     """
     Ripetizione del test del caso vecpathOverPath
     """
     square = Path([P(0,0), P(0, 100), P(100,100), P(100,0), P(0,0)])
     T = rot(random.random()*2*math.pi) * xlate(P(random.random()*self.sf, random.random()*self.sf))
     seg1 = Path([P(1,1), P(1,61)]) * T
     seg2 = Path([P(101,101), P(101,61)]) * T
     mr = vecpathOverVecpath([seg1, seg2], [square], 1, 10, 1)[0]
     A = X(mr.A)
     self.assertAlmostEquals(mr.sse/mr.n, 0.0)
     for p1 in list(seg1)+list(seg2): # controllo della distanza punto-path
         self.assertAlmostEquals(square.project(p1*A).dist, 0, tollerance)
예제 #4
0
    def testTwoLinesOverTwoLines(self):
        """
        La funzione deve tornare la matrice di rototraslazione per queste quatro linee sovrapponibili
        due a due
        """
        T = rot(random.random()*2*math.pi) * xlate(P(random.random()*self.sf, random.random()*self.sf))
        W = rot(random.random()*2*math.pi) * xlate(P(random.random()*self.sf, random.random()*self.sf))

        s1T = Path([P(1,1), P(1,61)]) * T
        s2T = Path([P(101,101), P(101,61)]) * T

        s1W = Path([P(1,1), P(1,61)]) * W
        s2W = Path([P(101,101), P(101,61)]) * W

        #Per avere una sovrapposizione piu' esatta possibile, diminuisco il passo a 1mm
        mr = vecpathOverVecpath([s1T, s2T], [s1W, s2W], 1, 10, 1)[0]
        self.assertNotEqual(mr.n, -1) # Risultato invalido
        A = X(mr.A)
        self.assertAlmostEquals(mr.sse/mr.n, 0.0)
        for p1 in s1T:
            self.assertAlmostEquals(s1W.project(p1*A).dist, 0, tollerance)
        for p2 in s2T:
            self.assertAlmostEquals(s2W.project(p2*A).dist, 0, tollerance)
예제 #5
0
 def testTwoLinesOverSquare(self):
     """
     Dato un quadrato e 2 suoi lati, la funzione deve restituire la matrice di rototraslazione per
     sovrapporre i 2 lati al quadrato originale
     """
     square = Path([P(0,0), P(0, 100), P(100,100), P(100,0), P(0,0)])
     T = rot(random.random()*2*math.pi) * xlate(P(random.random()*self.sf, random.random()*self.sf))
     seg1 = Path([P(1,1), P(1,61)]) * T
     seg2 = Path([P(101,101), P(101,61)]) * T
     mr = vecpathOverPath([seg1, seg2], square, 10)
     A = X(mr.A)
     self.assertAlmostEquals(mr.sse/mr.n, 0.0)
     for p1 in list(seg1)+list(seg2): # controllo della distanza punto-path
         self.assertAlmostEquals(square.project(p1*A).dist, 0, tollerance)
예제 #6
0
 def testHalfCircleOverHalfCircle(self):
     """
     La funzione deve sovrapporre due semicerchi identici, dopo che uno di questi e'
     stato traslato e ruotato
     """
     O1 = P(0,0)
     O2 = P(100,100)
     c1 = Path( circle(O1, 100, minpts= 100, maxerr=100)[0:50] )
     c2 = Path( c1 ) * rot(random.random()*2*math.pi) * xlate(O2)
     mr = pathOverPath(c2, c1, 10)
     self.assertAlmostEquals(mr.sse/mr.n, 0.0)
     A = X(mr.A)
     for p1, p2 in zip(c1, c2): # controllo della distanza punto-path
         self.assertAlmostEquals(c1.project(p2*A).dist, 0, tollerance)
예제 #7
0
    def testQuarterCircleOverHalfCircle(self):
        """
        La funzione deve sovrapporre un quarto-di-cerchio a un semicerchio, dopo che
        il quarto-di-cerchio e' stato traslato e ruotato
        """
        O1 = P(0,0)
        O2 = P(100,100)
        c1 = Path( circle(O1, 100, minpts= 100, maxerr=100)[0:50] )
        c2 = Path( c1[0:25] ) * rot(random.random()*2*math.pi) * xlate(O2)
        mr = pathOverPath(c2, c1, 10)

        self.assertAlmostEquals(mr.sse/mr.n, 0.0)
        A = X(mr.A)
        for p2 in c2: # controllo della distanza punto-path
            self.assertAlmostEquals(c1.project(p2*A).dist, 0, tollerance)
예제 #8
0
    def testReverseQuarterCircleOverHalfCircle(self):
        """
        La funzione deve sovrapporre un quarto-di-cerchio a un semicerchio, dopo che
        il quarto-di-cerchio e' stato traslato e ruotato.
        L'ordine dei punti del quarto di cerchio viene invertito (senso antiorario).

        Si nota che l'errore di accostamento dei due path sale a causa di una non piu' perfetta
        corrispondenza nella scelta dei punti (dato che i path "cominciano" da due punti differenti)
        """
        O1 = P(0,0)
        O2 = P(100,100)
        c1 = Path( circle(O1, 100, minpts= 100, maxerr=100)[0:50] )
        tmp = c1[25:50]
        tmp.reverse()
        c2 = Path( tmp ) * rot(random.random()*2*math.pi) * xlate(O2)
        # Per passare questo test e' necessario alzare la risoluzione a 1mm
        mr = pathOverPath(c2, c1, 1)

        self.assertAlmostEquals(mr.sse/mr.n, 0.0)
        A = X(mr.A)
        for p2 in c2: # controllo della distanza punto-path
            # Per passare questo test e' necessario alzare la tolleranza
            self.assertAlmostEquals(c1.project(p2*A).dist,0, tollerance)