예제 #1
0
def testDivers1(filename, show=True):
    #     show=True
    debug(titre="testDivers1 : %s" % filename.name)

    msg = u"""
    On teste les methodes NSplineSimple.projectionObj(obj) et
    NSplineSimple.projection(obj).
    """
    debug(msg)
    cpoints = pointsFromFile(filename)[::-1]
    #On recale le BA en 0,0
    corde, nba = computeCordeAndNBA(cpoints)
    debug(corde=corde, nba=nba, len_cpoints=len(cpoints))
    cpoints = cpoints - cpoints[nba]
    cpoints = cpoints[0:nba]
    #     cpoints = cpoints[0:nba+1]
    debug(BA=cpoints[-1], BF=cpoints[0], extrados=cpoints[nba / 2])
    #     S0 = NSplineSimple(cpoints=cpoints, name=filename.name)
    #     debug(S0)
    #     if show : S0.plot(show=True)
    ########################################
    #     dump = {'cpoints': [[0.5279636979103088, 0.07332829385995865], [0.7137287259101868, 0.3275330364704132], [1.268811468596966, 0.3365727279966774], [1.1390328407287598, 0.07332829385995865], [1.2571670716747245, 0.2148051133421408], [1.2206038430660453, -0.0507648238639925], [1.5545598268508911, -0.0048885527066886425]],
    # #             'methode': ('cubic', 'not-a-knot'),
    #             'methode': ('ius', 3),
    #             'name': u'test',
    #             'nbpe': 30,
    #             'precision': 1000,
    #             'mode': 'linear'}
    dump = {
        'classename': 'NSplineSimple',
        'cpoints': cpoints,
        'methode': ('cubic', 'not-a-knot'),
        'mode': 'rayon',
        'name': filename.name,
        'nbpe': 30,
        'precision': 1000,
        'role': 'NSplineSimple'
    }
    S = NSplineSimple(**dump)
    #     if show : S.plot(plt)

    #     p1, p2, p3 = [0.0,0.25], S.barycentre[0], S.centregravite
    p1, p2, p3 = [0.0, 0.25], [1.0, -0.1], [1.0, 0.1],
    debug(p1=p1, p2=p2, p3=p3)
    (t1, d1, n1,
     m1), (t2, d2, n2,
           m2), (t3, d3, n3,
                 m3) = S.projection(p1), S.projection(p2), S.projection(p3)
    pj1, pj2, pj3 = S(t1), S(t2), S(t3)

    debug(paragraphe="****  DISTANCE POINT-SPLINE discret=0  ****")
    print '    message=%-20s' % m1, 'd(S,p1)=%-10.3g' % d1, 't=%-10.3g' % t1, 'nb appels a fct=%d' % n1
    print '    message=%-20s' % m2, 'd(S,p2)=%-10.3g' % d2, 't=%-10.3g' % t2, 'nb appels a fct=%d' % n2
    print '    message=%-20s' % m3, 'd(S,p3)=%-10.3g' % d3, 't=%-10.3g' % t3, 'nb appels a fct=%d' % n3
    more = [([p1[0], pj1[0]], [p1[1],
                               pj1[1]], 'g-o', 'd(S,p1) : %.2g' % sqrt(d1)),
            ([p2[0], pj2[0]], [p2[1],
                               pj2[1]], 'g-o', 'd(S,p2) : %.2g' % sqrt(d2)),
            ([p3[0], pj3[0]], [p3[1],
                               pj3[1]], 'g-o', 'd(S,p3) : %.2g' % sqrt(d3))]

    if show:
        S.plot(more=more, titre='distance point-spline(continu)', show=True)

    (t1, d1, n1, m1) = S.projection(p1, discret=100)
    (t2, d2, n2, m2) = S.projection(p2, discret=100)
    (t3, d3, n3, m3) = S.projection(p3, discret=100)
    pj1, pj2, pj3 = S(t1), S(t2), S(t3)
    debug("paragraphe=****  DISTANCE POINT-SPLINE discret=100 ****")
    print '    message=%-20s' % m1, 'd(S,p1)=%-10.3g' % d1, 't=%-10.3g' % t1, 'nb appels a fct=%d' % n1
    print '    message=%-20s' % m2, 'd(S,p2)=%-10.3g' % d2, 't=%-10.3g' % t2, 'nb appels a fct=%d' % n2
    print '    message=%-20s' % m3, 'd(S,p3)=%-10.3g' % d3, 't=%-10.3g' % t3, 'nb appels a fct=%d' % n3
    if show:
        more = [([p1[0],
                  pj1[0]], [p1[1],
                            pj1[1]], 'g-o', 'd(S,p1) : %.2g' % sqrt(d1)),
                ([p2[0],
                  pj2[0]], [p2[1],
                            pj2[1]], 'g-o', 'd(S,p2) : %.2g' % sqrt(d2)),
                ([p3[0],
                  pj3[0]], [p3[1],
                            pj3[1]], 'g-o', 'd(S,p3) : %.2g' % sqrt(d3))]

        S.plot(more=more, titre='distance point-spline (discret)', show=True)
    T, D, N, _ = S.projectionObj(S.epoints, discret=100)
    print '    S.projectionObj(S.epoints) : norm(D)=%.3g, max(D)=%.3g' % (sqrt(
        sum(D)), sqrt(max(D)))
    #     P = asarray([p1,p2,p3])
    P = (rand(5, 2) - 0.3) / 10 + S.centregravite
    #     debug(P.tolist())
    T, D, N, _ = S.projectionObj(P, discret=1000)
    S.nbpd = 1000
    Pj = S(T)
    debug(paragraphe='Aleatoire : S.projectionObj(P,discret=%d)' % S.nbpd,
          T_D_N=zip(T, D, N))
    #     exit()

    if show:
        more = [([p[0], pj[0]], [p[1],
                                 pj[1]], 'g-o', 'd(S,p1) : %.2g' % sqrt(d))
                for p, pj, d in zip(P, Pj, D)]
        S.plot(more=more, titre='distance point-spline', show=True)
    debug(paragraphe=u'Elagage')
    s1, d, (n0, n1) = S.elaguer(eps=1.0, debog=show)
    if show:
        S.plot(titre=u'avant élagage', show=False)
        s1.plot(
            titre=
            u"Après élagage, distance=%.3g ; nb points contrôle : %d => %d" %
            (d, n0, n1),
            show=True)
    debug(titre="Fin testDivers1 : %s" % filename.name)

    return
예제 #2
0
def testDivers(filename, show=True):
    name = filename.name
    debug(titre="testDivers : %s" % name)

    msg = u"""Dans cet exemple, on a des points doubles p4=p5=p6 et p8=p9,
    donc la spline x(t) ne peut pas être construite.
    Que faire ?
    - supprimer p[6] <=== Oui c'est la solution adoptée ici
    - déplacer légèrement le point
    - faire une spline composée, splittée en 6
    """
    debug(msg)
    cpoints = pointsFromFile(filename)
    S0 = NSplineSimple(cpoints=cpoints, name=filename.name)
    debug(S0)
    if show: S0.plot(show=True)
    ########################################
    msg = u"""S est une NSplineSimple. Teste les méthodes :
    - S.absCurv(T) qui retourne les abscisses curvilignes VRAIES des points S(T)
    - S.longueur('x') =
        # longueur vraie(x=r) par intégration numérique
        # longueur du polyligne S.[cpoints,dpoints,epoints] 'x'=['c','d','e']
    - S.projection(p) et affiche le résultat pour 3 points
        Calcule la distance du point 'p' à la spline 'S' et le point 'h' de la spline
        le plus proche de 'p'. Retourne également la precision et le nb d'appels à fonction
        Utilise :
        "https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize_scalar.html
    """
    dump = {
        'classename': 'NSplineSimple',
        'cpoints': cpoints,
        'methode': ('cubic', 'not-a-knot'),
        #             'mode': 'segment',
        #             'methode': ('ius', 1),
        'mode': 'rayon',
        #             'mode': 'cpoints',
        'name': filename.name,
        'nbpe': 30,
        'precision': 1000,
        'role': 'NSplineSimple'
    }
    dump = {
        'cpoints': [[0.5279636979103088, 0.07332829385995865],
                    [0.7137287259101868, 0.3275330364704132],
                    [1.268811468596966, 0.3365727279966774],
                    [1.1390328407287598, 0.07332829385995865],
                    [1.2571670716747245, 0.2148051133421408],
                    [1.2206038430660453, -0.0507648238639925],
                    [1.5545598268508911, -0.0048885527066886425]],
        #             'methode': ('cubic', 'not-a-knot'),
        'methode': ('ius', 3),
        'name':
        u'test',
        'nbpe':
        30,
        'precision':
        1000,
        'mode':
        'linear'
    }
    debug(msg)
    S = NSplineSimple(**dump)
    if show: S.plot()
    knots = S.knots
    acn = S.absCurv(knots)
    acr = S.absCurv(acn)
    debug('S.absCurv(None)', acn.tolist())
    debug('S.knots', knots.tolist())
    l = S.longueur()
    debug('(acr-acn)*longueur', (acr - acn * l).tolist())
    debug('longueur=%.10g' % l)
    lr = acr[-1]
    debug('vraie abscurv[-1]=%.10g' % lr)
    ln = acn[-1]
    debug('abscurv[-1]=%.10g' % ln)
    S.nbpd = 100
    ld3 = S.longueur('d')
    debug('S.dlongueur=%g' % ld3 + u"(calculé sur %d points)" % S.precision)
    S.nbpd = 1000
    ld4 = S.longueur('d')
    debug('S.dlongueur=%g' % ld4 + u"(calculé sur %d points)" % S.precision)
    S.nbpd = 10000
    ld5 = S.longueur('d')
    debug('S.dlongueur=%g' % ld5 + u"(calculé sur %d points)" % S.precision)
    le = S.longueur('e')
    debug('S.elongueur=%g' % le)
    lc = S.longueur('c')
    debug('S.clongueur=%g' % lc)

    if show:
        diff = [l - lr, l - ln, l - ld3, l - ld4, l - ld5, l - le, l - lc]
        plt.show()
        plt.bar(range(len(diff)), diff)
        plt.xticks(range(len(diff)), 'lr,ln,ld3,ld4,ld5,le,lc'.split(','))
        plt.title('differentes longueurs calculees')
    p1, p2, p3 = [0.2, 0.01], [1.1, 0.2], [-0.1, 0.3]
    res1, res2, res3 = S.projection(p1), S.projection(p2), S.projection(p3)
    pj1, pj2, pj3 = S(res1[0]), S(res2[0]), S(res3[0])
    #     debug(str(res))
    debug(paragraphe="****  DISTANCE POINT-SPLINE  ****")
    debug('message="%s"' % res1[3], 'd(S,p1)=%g' % res1[1], 't=%g' % res1[0],
          'nb appels a fct=%d' % res1[2])
    debug('message="%s"' % res2[3], 'd(S,p2)=%g' % res2[1], 't=%g' % res2[0],
          'nb appels a fct=%d' % res2[2])
    debug('message="%s"' % res3[3], 'd(S,p3)=%g' % res3[1], 't=%g' % res3[0],
          'nb appels a fct=%d' % res3[2])
    if show:
        more = [([p1[0],
                  pj1[0]], [p1[1],
                            pj1[1]], 'g-o', 'd(S,p1) : %.2g' % sqrt(res1[1])),
                ([p2[0],
                  pj2[0]], [p2[1],
                            pj2[1]], 'g-o', 'd(S,p2) : %.2g' % sqrt(res2[1])),
                ([p3[0],
                  pj3[0]], [p3[1],
                            pj3[1]], 'g-o', 'd(S,p3) : %.2g' % sqrt(res3[1]))]
        projections = [(pj1[0], pj1[1], 'y.', ''), (pj2[0], pj2[1], 'y.', ''),
                       (pj3[0], pj3[1], 'y.', '')]
        more += projections
        S.plot(more=more, titre='distance point-spline', show=True)


#     plt.plot(p1[0],p1[1],'go', label='p1 : %g'%res1[1])
#     plt.legend()
#     if show : plt.show()
#     return
    debug('ORIGINAL', S=S)
    debug(rect=S.boundingRect())
    #     debug('CLONE', clone=S.clone())
    debug('COPY', clone=S.copy())
    S.hardScale((0.5, 0.5), S.centregravite)
    debug('APRES HARDSCALE', S=S)
    debug(rect=S.boundingRect())
    S.hardMove((10, 10))
    debug('APRES HARDMOVE', S=S)
    debug(rect=S.boundingRect())
    #     debug(top='%g'%rect.top(), left='%g'%rect.left(), width='%g'%rect.width(), height='%g'%rect.height(), )
    #     debug(bottom='%g'%rect.bottom(), top='%g'%rect.top())
    if show: S.plot(titre="**dump")
    debug(titre="Fin testDivers : %s" % filename.name)