Пример #1
0
def testElaguer(filename, trados, fonction='elaguer', show=True):
    name = filename.name
    debug(titre="testElaguer : %s" % name)
    if fonction == 'ajuster':
        msg = u"""L'élagage par "ajustement" ne marche pas, et il est très long.
        Je le supprime des tests.
        :TODO: voir au besoin si on peut l'améliorer"""
        debug(msg)
        return

    def compareCourbures(s0, s1, corde, trados):
        u"""s0 et s1 sont des intrados (ou des extrados), s0:original, s1:elagué
        On trace les deux splines et les log des abs(courbures), mises à l'échelle pour y voir qque chose"""
        s1.nbpe = s0.nbpe
        titre = ' '.join(('courbures', s0.name, s1.name))
        plt.title(titre)
        #     E = s0.epoints
        _, ax = plt.subplots()
        T = linspace(0, 1, 100)

        #         s0.echantillonner(nbpe)
        D0 = s0.dpoints
        C0 = s0.cpoints
        spline0, = ax.plot(D0[:, 0], D0[:, 1], 'r-', lw=1)
        #         echantillon, = ax.plot(E[:,0], E[:,1], 'bv', lw=1)
        control0, = ax.plot(C0[:, 0],
                            C0[:, 1],
                            'ro',
                            lw=1,
                            label=u'%d points contrôle' % len(C0))
        courbure0 = s0.courbure(T)
        courbure1 = s1.courbure(T)
        minc = min(min(courbure0), min(courbure1))
        maxc = max(max(abs(courbure0)), max(abs(courbure1)))
        courbure0 += (1.0 + abs(minc))
        courbure0 = log(courbure0)
        courbure0 /= maxc
        if trados == 'e':
            courbure0 = courbure0[::-1]
        courbure0, = ax.plot(corde * T[1:], corde * courbure0[1:])
        D1 = s1.dpoints
        C1 = s1.cpoints
        spline1, = ax.plot(D1[:, 0], D1[:, 1], 'b-', lw=1)
        control1, = ax.plot(C1[:, 0],
                            C1[:, 1],
                            'bo',
                            lw=1,
                            label=u'%d points contrôle' % len(C1))

        courbure1 += (1.0 + abs(minc))
        courbure1 = log(courbure1)
        courbure1 /= maxc
        if trados == 'e':
            courbure1 = courbure1[::-1]
        courbure1, = ax.plot(corde * T[1:], corde * courbure1[1:])
        ax.legend(loc='upper right')
        buttons = [
            'control0', 'control1', 'courbure0', 'courbure1', 'spline0',
            'spline1'
        ]
        values = [True, True, True, True, True, True]
        draws = [control0, control1, courbure0, courbure1, spline0, spline1]
        plt.subplots_adjust(left=0.2)
        plt.axis('equal')

        rax = plt.axes([0.05, 0.4, 0.1, 0.15])
        check = CheckButtons(rax, buttons, values)

        def func(label):
            if label == 'spline0':
                spline0.set_visible(not spline0.get_visible())
            elif label == 'spline1':
                spline1.set_visible(not spline1.get_visible())
            elif label == 'control0':
                control0.set_visible(not control0.get_visible())
            elif label == 'control1':
                control1.set_visible(not control1.get_visible())
            elif label == 'courbure0':
                courbure0.set_visible(not courbure0.get_visible())
            elif label == 'courbure1':
                courbure1.set_visible(not courbure1.get_visible())
            else:
                draw = draws[buttons.index(label)]
                draw.set_visible(not draw.get_visible())
            plt.draw()

        check.on_clicked(func)
        if show: plt.show()
        return plt

    def comparePointsSpline(P, s):
        u"""comparaison graphique, P famille de points s spline
        On trace les projections de P sur la spline s"""
        #         debug(s.projection(P))
        pjs = s(s.projectionObj(P)[0])
        if show:
            s.plot(more=([P[:, 0], P[:, 1], 'g.', 'C0'],
                         [pjs[:, 0], pjs[:, 1], 'y.', 'projections']))

    u"""Extraction intrados et extrados, normalisation"""
    points = pointsFromFile(filename)
    corde, nba = -1.0, np.nan
    bf = points[0]
    for k, point in enumerate(points):
        d = dist2(bf, point)
        if d > corde: corde, nba = d, k
    corde = math.sqrt(corde)
    debug(corde=corde, nba=nba)
    points *= (1000 / corde)  #en mm
    corde = 1000
    if trados == 'e':  #Extrados
        methode = ('cubic', ((2, 0, 0), (1, 0, -corde / 2)))  #extrados
        c0 = points[:1 + nba]
    elif trados == 'i':  #intrados
        methode = ('cubic', ((1, 0, -corde / 4), (2, 0, 0)))  #intrados
        c0 = points[nba:]
    u"""Construction de la spline d'interpolation du trados"""
    precision = 1000
    T0 = linspace(0, 1, precision)
    s0 = NSplineSimple(cpoints=c0,
                       precision=precision,
                       methode=methode,
                       mode='courbure')
    Tc = linspace(0, 1, 100)
    courb0 = s0.courbure(Tc)
    u"""La spline elaguée"""
    if fonction == 'elaguer':
        s1, d, (n0, n1) = s0.elaguer(1, debog=show)
    elif fonction == 'ajuster':
        s1, d, (n0, n1) = s0.ajuster(1)
    d0 = s0(T0)
    d1 = s1(T0)
    print u'  max dist(C0, s1)      = %.2e max des distances aux points de contrôle (‰) <  ################' % (
        d)
    print u'  max norme 2     D0-D1 = %.2e max des distances point à point des splines discrétisées' % max(
        norm(d0 - d1, 2, axis=1))
    print u'  norme frobenius D0-D1 = %.2e somme des distances point à point des splines discrétisées' % norm(
        d0 - d1, 'fro')
    print u'  norme frobenius D0-D1 = %.2e moyenne des distances point à point des splines discrétisées' % (
        norm(d0 - d1, 'fro') / len(d0))
    print u'  nb pts contrôle       : %d => %d' % (len(s0), len(s1))
    #     compareCourbures(s0, s1, corde, trados)
    comparePointsSpline(s0.cpoints, s1)
    debug(paragraphe='courbure Avant')
    print courb0.tolist()
    debug(paragraphe='courbure Apres')
    print s1.courbure(Tc).tolist()
    debug(titre="Fin testElaguer : %s" % filename.name)
Пример #2
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