papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Les transformations affines Lun 14 Déc 2015 - 18:15 | |
| Quand j’étais en 2ème année Panoramic, j’ai posté un code sur la transformation conforme. C'était ici. Je poste aujourd'hui un code sur les transformations affines Rapel : La transformation conforme conserve localement les angles, alors que les transformations affines conservent le parallélisme. - Code:
-
rem ============================================================================ rem Transformations affines rem par Papydall rem ============================================================================ rem les transformations suivantes sont données avec leurs matrices de transformation rem Etirement (changement d échelle) selon les axes rem Rotation autour de l origine rem Inclinaison le long de l axe des X rem Inclinaison le long de l axe des Y rem Déplacement relatif par rapport aux axes X et/ou Y rem ============================================================================
Init()
Trace_Figure() : ' Tracer la flèche comme figure exemple input bidon$ : cls
Etirement_Figure(1/4,1) : ' changement d'échelle (1/4 donc rapetissement) selon l'axe X, inchangé selon l'axe Y (1) Etirement_Figure(2,1) : ' changement d'échelle (2 donc agrandissement) selon l'axe X, inchangé selon l'axe Y (1) Etirement_Figure(4,1/3) : ' Agrandissement 4 fois selon l'axe X et rapetissement 1/3 selon l'axe Y caption 20,"Changement d'échelle selon les axes X et Y" caption 20,caption$(20) + chr$(13) + string$(30," ") + "<Entree> pour la suite" : input bidon$ : cls
Rotation() : ' Rotation autour de l'origines des axes caption 20, "<Entree> pour la suite"
Inclinaison_Figure("x",45) : ' Inclinaisons de 45° le long de de l'axe X caption 20,"Inclinaison le long de l'axe des X de 45°" caption 20,caption$(20) + chr$(13) + string$(20," ") + "<Entree> pour la suite" : input bidon$ : cls
Inclinaison_Figure("y",60) : ' Inclinaisons de 60° le long de de l'axe Y caption 20,"Inclinaison le long de l'axe des Y de 60°" caption 20,caption$(20) + chr$(13) + string$(20," ") + "<Entree> pour la suite" : input bidon$ : cls
Translation_Figure(-3,0) : ' Déplacement relatif par rapport à l'axe X Translation_Figure(-5,6) : ' déplacement relatif par rapport aux deux axes X et Y Translation_Figure(-9,-5): ' déplacement relatif par rapport aux deux axes X et Y caption 20,"Translation de la figure <Entree> pour la suite" : input bidon$ : cls caption 20,"That's all Folks !" + chr$(13) + "<Entree> pour terminer" input bidon$ for a = 2*y0 to 10 step -10 : height 0,a : pause 50 : next a terminate end rem ============================================================================ SUB Init() dim x0,y0,a,newx,newy,zoom,bidon$ full_space 0 picture 10 : full_space 10 : 2d_target_is 10 : print_target_is 10 font_bold 10 : font_color 10,0,0,255 font_size 10,12 x0 = width(10)/2 : y0 = height(10)/2 : ' Coordonée de l'origine zoom = 30 : ' facteur d'aggrandissement alpha 20 : top 20,50 : left 20,100 : font_bold 20 : font_name 20,"tahoma" font_color 20 ,100,50,20 : font_size 20, 14 : color 20,255,255,255 caption 20,"C'est sur cette flèche que nous allons tester les transformations affines :" caption 20,caption$(20) + chr$(13) + "Changement d'échelle selon les axes," caption 20,caption$(20) + chr$(13) + "Rotation autour de l'origine," caption 20,caption$(20) + chr$(13) + "Inclinaison le long des axes," caption 20,caption$(20) + chr$(13) + "Déplacement relatif par rapport aux axes X et/ou Y." caption 20,caption$(20) + chr$(13) + string$(30," ") + "<Entree> pour commencer"
degrees : ' on travaille en degrés END_SUB rem ============================================================================ ' Tracé d'une flèche comme exemple SUB Trace_Figure() dim_local i,p,x,y restore read p : read x : read y : 2d_poly_from x0 + zoom * x, y0 - zoom * y for i = 2 to p read x : read y : 2d_poly_to x0 + zoom * x,y0 - zoom * y next i 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 : 2d_circle x0,y0,5 2d_line x0-50,y0, x0+50,y0 : ' tracé de l'axe horizontal 2d_line x0,y0-50, x0,y0+50 : ' tracé de l'axe vertical 2d_pen_color 0,0,0 read x : read y : 2d_flood x0 + zoom * x,y0 - zoom * y , 0,0,0 2d_fill_color 255,255,255 print_locate x0 + zoom * (x+2),y0 - zoom * (y-1) : print "Figure exemple" END_SUB rem ============================================================================ SUB Rotation() caption 20,"Rotation autour de l'origine ..." Trace_Figure() : ' on trace une figure , une flèche vers le haut comme exemple ' On va faire tourner cette figure autour de l'origine for a = 0 to 2*360 step 10 : ' Faire un tour complet cls : 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 : 2d_circle x0,y0,5 2d_line x0-50,y0, x0+50,y0 : ' tracé de l'axe horizontal 2d_line x0,y0-50, x0,y0+50 : ' tracé de l'axe vertical 2d_pen_color 0,0,0 Rotation_Figure(a) : ' Faire tourner la figure pause 100 next a
END_SUB rem ============================================================================
' Rotation de la flèche de l'exemple autour de l'origine des axes d'un angle en dégrés ' Pour faire tourner une figure, il suffit de faire tourner tous ses points SUB Rotation_Figure(angle) dim_local i,p,x,y restore read p : read x : read y : Rotation_Point(x,y,angle) 2d_poly_from x0 + zoom * newx, y0 - zoom * newy for i = 2 to p read x : read y : Rotation_Point(x,y,angle) 2d_poly_to x0 + zoom * newx,y0 - zoom * newy next i read x : read y : Rotation_Point(x,y,angle) 2d_flood x0 + zoom * newx,y0 - zoom * newy , 0,0,0 2d_fill_color 255,255,255 print_locate x0 + zoom * (x+5),y0 - zoom * (y-1) print "Rotation de la figure autour de l'origine" END_SUB rem ============================================================================ ' Rotation autour de l'origine d'un point (x,y) d'un angle tetha en degrés. ' Pour effectuer une rotation à un point il suffit de multiplier ses coordonnées ' par la matrice de rotation suivante : ' cos(tetha) -sin(tetha) ' sin(tetha) cos(tetha) SUB Rotation_Point(x,y,tetha) newx = x * cos(tetha) - y * sin(tetha) newy = x * sin(tetha) + y * cos(tetha) END_SUB rem ============================================================================ ' Inclinaison de la flèche de l'exemple le long de l'axe des X ou l'axe des Y ' d'un angle a en degrés ' paramètre : axe$ = "X" <---- inclinaison le long de l'axe des X ' paramètre : axe$ = "Y" <---- inclinaison le long de l'axe des Y SUB Inclinaison_Figure(axe$,a) dim_local i,p,x,y if upper$(axe$) <> "X" and upper$(axe$) <> "Y" message "ERREUR !" + chr$(13) + "Vous avez indiqué un mauvais axe !" exit_sub end_if cls restore read p : read x : read y : Inclinaison_Point(x,y,axe$,a) 2d_poly_from x0 + zoom * newx, y0 - zoom * newy for i = 2 to p read x : read y : Inclinaison_Point(x,y,axe$,a) 2d_poly_to x0 + zoom * newx,y0 - zoom * newy next i 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 : 2d_circle x0,y0,5 2d_line x0-50,y0, x0+50,y0 : ' tracé de l'axe horizontal 2d_line x0,y0-50, x0,y0+50 : ' tracé de l'axe vertical 2d_pen_color 0,0,0 read x : read y : Inclinaison_Point(x,y,axe$,a) 2d_flood x0 + zoom * newx,y0 - zoom * newy , 0,0,0 2d_fill_color 255,255,255 if upper$(axe$) = "X" print_locate x0 + zoom * (x+5),y0 - zoom * (y-1) else print_locate x0 + zoom * (x+3),y0 - zoom * (y+5) end_if print "Inclinaison le long de l'axe " + upper$(axe$) + " d'un angle de " + str$(a) +"°" END_SUB rem ============================================================================ ' Les matrices de l'inclinaison sont : ' le long de l'axe des X : ' 1 tan(a) ' 0 1 ' Le long de l'axe des Y : ' 1 0 ' tan(a) 1 SUB Inclinaison_Point(x,y,axe$,a)
if upper$(axe$) = "X" newx = x * 1 + y * tan(a) newy = x * 0 + y * 1 else newx = x * 1 + y * 0 newy = x * tan(a) + y * 1 end_if
END_SUB
rem ============================================================================ ' Etirement de la flèche de l'exemple selon les axes X / Y ' Pour étirer une figure, il suffit d'étirer tous ses points SUB Etirement_Figure(sx,sy) dim_local i,p,x,y restore read p : read x : read y : Etirer_Point(x,y,sx,sy) 2d_poly_from x0 + zoom * newx, y0 - zoom * newy for i = 2 to p read x : read y : Etirer_Point(x,y,sx,sy) 2d_poly_to x0 + zoom * newx,y0 - zoom * newy next i 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 : 2d_circle x0,y0,5 2d_line x0-50,y0, x0+50,y0 : ' tracé de l'axe horizontal 2d_line x0,y0-50, x0,y0+50 : ' tracé de l'axe vertical 2d_pen_color 0,0,0 read x : read y : Etirer_Point(x,y,sx,sy) 2d_flood x0 + zoom * newx,y0 - zoom * newy , 0,0,0 2d_fill_color 255,255,255 print_locate x0 + zoom * (x+4),y0 - zoom * (y-4) print "Etirement selon les axes X / Y" END_SUB rem ============================================================================ ' Etirement d'un point (x,y) selon les axes d'un facteur sx et xy. ' Pour effectuer un étirement à un point il suffit de multiplier ses coordonnées ' par la matrice d'étirement suivante : ' sx 0 ' 0 sy SUB Etirer_Point(x,y,sx,sy) newx = x * sx newy = y * sy END_SUB rem ============================================================================ SUB Translation_Figure(tx,ty) dim_local i,p,x,y,t$ restore read p : read x : read y : Translater_Point(x,y,tx,ty) 2d_poly_from x0 + zoom * newx, y0 - zoom * newy for i = 2 to p read x : read y : Translater_Point(x,y,tx,ty) 2d_poly_to x0 + zoom * newx,y0 - zoom * newy next i 2d_pen_color 255,0,0 : 2d_fill_color 255,0,0 : 2d_circle x0,y0,5 2d_line x0-50,y0, x0+50,y0 : ' tracé de l'axe horizontal 2d_line x0,y0-50, x0,y0+50 : ' tracé de l'axe vertical 2d_pen_color 0,0,0 read x : read y : Translater_Point(x,y,tx,ty) 2d_flood x0 + zoom * newx,y0 - zoom * newy , 0,0,0 2d_fill_color 255,255,255 print_locate x0 + zoom * (newx+2),y0 - zoom * (newy-1) if tx <> 0 and ty <> 0 t$ = "aux axes X et Y" else if tx <> 0 and ty = 0 t$ = "à l'axe X" else t$ = "à l'axe Y" end_if end_if print "Déplacement relatif par rapport " + t$ END_SUB rem ============================================================================ SUB Translater_Point(x,y,tx,ty) newx = x + tx newy = y + ty END_SUB rem ============================================================================ ' dessin d'une flèche data 8 : ' nombre de points de la figure data 3,0 : ' coordonnées 1er point data 4,0 : ' coordonnées 2ème point data 4,3 data 5,3 data 3.5,4.5 data 2,3 data 3,3 data 3,0 : ' coordonnées dernier point qui est le même que le 1er pour boucler la boucle data 3.5,3 : ' coordonnées du flood rem ============================================================================
Transformez, transformez, il en restera toujours ! A+ | |
|