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