def testConstructeurs(filename, show=False): debug(titre='testConstructeurs %s' % filename.name) p = NSplineSimple() debug(paragraphe='1. constructeur vide') debug(p=p) p = NSplineSimple(cpoints=np.zeros((1, 2)), parent=None, methode=('cubic', 'periodic'), mode='rayon', name='SPLINE1') debug(paragraphe='2. constructeur presque vide') print p # for point in p.qcpolygon : # print point # for point in p.qdpolygon : # print point debug(paragraphe='3. p vide => p.cpoints=points de %s' % filename.name) points = pointsFromFile(filename) p.cpoints = points if show: p.plot(titre='cpoints=pointsFromFile()') S0 = NSplineSimple( points=pointsFromFile(filename), methode=('cubic', 'periodic'), # mode='courbure', name=filename.name) debug(S0) if show: S0.plot(titre=filename.name) debug(paragraphe='4. S = NSplineSimple(**dump00) (points:%s)' % filename.name) dump00 = S0.toDump() debug("dump00") pprint(dump00) S = NSplineSimple(**dump00) dump01 = S.toDump() pprint(dump01) debug("dump00!=dump01 : %s" % dictsAreNotEqual(dump00, dump01)) debug(paragraphe='4. S1 = S0.copy() (points:%s)' % filename.name) S = S0.copy() dump02 = S.toDump() debug("dump00!=dump02 : %s" % dictsAreNotEqual(dump00, dump02)) filename = Path(RUNS_DIR, 'spline.npkl') S0.save(filename=filename) S0.open(filename) # debug('S0.toDump()') # pprint(S0.toDump()) debug(S0) debug('S0.toDump()!=dump00', dictsAreNotEqual(S0.toDump(), dump02)) if show: S0.plot(titre='open pkl') S1 = S0.copy() d0, d1 = dump00, S1.toDump() debug('d0!=d1', dictsAreNotEqual(d0, d1)) if show: S1.plot(titre='copy') debug(titre='Fin testConstructeurs %s' % filename.name)
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)