/* On appelle **contour**, une courbe fermée sans point de self-intersection. Tout contour partage le plan en deux domaines (il en est la frontière) : - le domaine borné est appelé **intérieur du contour**, - l'autre domaine est appelé **extérieur du contour**. Un domaine est dit "simplement connexe" si l'intérieur de chacun de ses contours appartient au domaine. Un domaine qui n'est pas simplement connexe est dit "multiplement connexe". */ size(7.5cm,0); path c1=unitcircle, c2=scale(1.5)*unitcircle, c3=scale(2)*unitcircle; path[] c={c1,c2,c3}; // La régle de remplissage par défaut est *zerowinding* // pen zerowinding=fillrule(0); filldraw(c,palegreen,black); // On aurait pu écrire : filldraw(c,palegreen+zerowinding,black); // On peut remplacer la valeur par défaut par *evenodd* // pen evenodd=fillrule(1); filldraw(shift(5,0)*c,palered+evenodd,black); shipout(bbox(5mm,white)); |
size(7.5cm,0); path c1=unitcircle, c2=shift(.25,0)*unitcircle; path[] c={c1,c2}; // La régle de remplissage par défaut est *zerowinding* // pen zerowinding=fillrule(0); filldraw(c,palegreen,black); // On aurait pu écrire : filldraw(c,palegreen+zerowinding,black); // On peut remplacer la valeur par défaut par *evenodd* // pen evenodd=fillrule(1); filldraw(shift(2.5,0)*c,palered+evenodd,black); shipout(bbox(5mm,white)); |
size(7.5cm,0); path c1=unitcircle, c2=shift(1,0)*scale(1.5)*unitcircle, c3=scale(2)*unitcircle; path[] c={c1,c2,c3}; filldraw(c,palegreen,black); filldraw(shift(5,0)*c,palered+evenodd,black); shipout(bbox(5mm,white)); |
size(7.5cm,0); path c1=circle((.5,.5),.6), c2=unitsquare, c3=shift(1.5,0)*c1, c4=shift(1.5,0)*c2; filldraw(c1^^c2,yellow+evenodd,black); filldraw(c3^^c4,yellow,black); shipout(bbox(5mm,white)); |
size(7cm,0); path c1=circle((.5,1),1), c2=unitsquare, c3=(0,0)--(2,1)--(1,2)--cycle; filldraw(c1^^c2^^c3,yellow+evenodd,.8bp+white); shipout(bbox(5mm,Fill(.3blue))); |
// Une fonction méconnue : windingnumber // Premier exemple pour la comprendre. size(8cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..(-.5,.8)..cycle; dot(chemin,5bp+.5green); draw(chemin,Arrow()); pair z; for(int k=0; k<50; ++k){ z=(-.75+2*unitrand(),-.75+2*unitrand()); dot(string(windingnumber(chemin,z)),z,.1E,1bp+red); } z=point(chemin,4.3); dot(string(windingnumber(chemin,z)),z,.3E,5bp+blue); label("windingnumber(path, pair)",truepoint(N),N); label("undefined = "+string(undefined),truepoint(S),S); |
// Une fonction méconnue : windingnumber // Deuxième exemple pour la comprendre. size(8cm,0); path chemin=reverse((0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..(-.5,.8)..cycle); dot(chemin,5bp+.5green); draw(chemin,Arrow()); pair z; for(int k=0; k<50; ++k){ z=(-.75+2*unitrand(),-.75+2*unitrand()); dot(string(windingnumber(chemin,z)),z,.1E,1bp+red); } z=point(chemin,1.5); dot(string(windingnumber(chemin,z)),z,.3E,5bp+blue); label("windingnumber(path, pair)",truepoint(N),N); label("undefined = "+string(undefined),truepoint(S),S); |
// Une série d'exemples pour comprendre le fonctionnement de buildcycle. // Dans cet exemple, buildcycle(c1,c2) permet de construire l'intersection // des ensembles... mais ne pas croire que c'est toujours le cas : cf. exemple qui suit. size(7.8cm,0); // Je définis un chemin c1 et un second c2 déduit par translation. path c1=(0,0)..(1.5,0)..(2,1.5)..(-1,1)..cycle; path c2=shift(-1.5,.6)*c1; // c3 est le chemin cyclique résultant de la fonction buildcycle // appliquée à c1 et c2 dans cet ordre. path c3=buildcycle(c1,c2); // On colorie la zone définie par c3 et on dessine les ensembles. fill(c3,palegreen); draw(c1,2bp+blue); draw(c2,2bp+red); draw(c3,.9bp+yellow); // On étiquette les noeuds des trois chemins pour // bien comprendre comment est construit c3 à partir de c1 et c2. defaultpen(fontsize(14pt)); real w=linewidth(); for(int i=0; i<length(c1); ++i) dot(string(i),point(c1,i),SW,linewidth(12w)+.7blue); for(int i=0; i<length(c2); ++i) dot(string(i),point(c2,i),SW,linewidth(12w)+.7red); for(int i=0; i<length(c3); ++i) dot(string(i),point(c3,i),E,linewidth(6w)+.9green); |
// Le même exemple que précédemment : seule la translation qui permet // de construire c2 change ! On constate que, cette fois, buildcycle(c1,c2) // permet de construire la réunion des ensembles. size(7.8cm,0); // Je définis un chemin c1 et un second c2 déduit par translation. path c1=(0,0)..(1.5,0)..(2,1.5)..(-1,1)..cycle; path c2=shift(-.25,-.75)*c1; // c3 est le chemin cyclique résultant de la fonction buildcycle // appliquée à c1 et c2 dans cet ordre. path c3=buildcycle(c1,c2); // On colorie la zone définie par c3 et on dessine les ensembles. fill(c3,palegreen); draw(c1,2bp+blue); draw(c2,2bp+red); draw(c3,.9bp+yellow); // On étiquette les noeuds des trois chemins pour // bien comprendre comment est construit c3 à partir de c1 et c2. defaultpen(fontsize(14pt)); real w=linewidth(); for(int i=0; i<length(c1); ++i) dot(string(i),point(c1,i),SW,linewidth(12w)+.7blue); for(int i=0; i<length(c2); ++i) dot(string(i),point(c2,i),SW,linewidth(12w)+.7red); for(int i=0; i<length(c3); ++i) dot(string(i),point(c3,i),E,linewidth(6w)+.9green); |
// Un autre d'exemple pour comprendre le fonctionnement de buildcycle. // Attention les chemins sont orientés ! Pour bien le comprendre, cet exemple // est la reprise de l'exemple fig_bc01, mais en changeant l'orientation de c2. size(7.8cm,0); // Je définis un chemin c1 et un second c2 déduit par translation. path c1=(0,0)..(1.5,0)..(2,1.5)..(-1,1)..cycle; path c2=reverse(shift(-1.5,.6)*c1); // c3 est le chemin cyclique résultant de la fonction buildcycle // appliquée à c1 et c2 dans cet ordre. path c3=buildcycle(c1,c2); // On colorie la zone définie par c3 et on dessine les ensembles. fill(c3,palegreen); draw(c1,2bp+blue); draw(c2,2bp+red); draw(c3,.9bp+yellow); // On étiquette les noeuds des trois chemins pour // bien comprendre comment est construit c3 à partir de c1 et c2. defaultpen(fontsize(14pt)); real w=linewidth(); for(int i=0; i<length(c1); ++i) dot(string(i),point(c1,i),SW,linewidth(12w)+.7blue); for(int i=0; i<length(c2); ++i) dot(string(i),point(c2,i),SW,linewidth(12w)+.7red); for(int i=0; i<length(c3); ++i) dot(string(i),point(c3,i),E,linewidth(6w)+.9green); |
// Une série d'exemples pour comprendre le fonctionnement de buildcycle. // Attention les chemins sont orientés ! Pour bien le comprendre, cet exemple // est la reprise de l'exemple fig_bc02, mais en changeant l'orientation de c2. size(7.8cm,0); // Je définis un chemin c1 et un second c2 déduit par translation. path c1=(0,0)..(1.5,0)..(2,1.5)..(-1,1)..cycle; path c2=reverse(shift(-.25,-.75)*c1); // c3 est le chemin cyclique résultant de la fonction buildcycle // appliquée à c1 et c2 dans cet ordre. path c3=buildcycle(c1,c2); // On colorie la zone définie par c3 et on dessine les ensembles. fill(c3,palegreen); draw(c1,2bp+blue); draw(c2,2bp+red); draw(c3,.9bp+yellow); // On étiquette les noeuds des trois chemins pour // bien comprendre comment est construit c3 à partir de c1 et c2. defaultpen(fontsize(14pt)); real w=linewidth(); for(int i=0; i<length(c1); ++i) dot(string(i),point(c1,i),SW,linewidth(12w)+.7blue); for(int i=0; i<length(c2); ++i) dot(string(i),point(c2,i),SW,linewidth(12w)+.7red); for(int i=0; i<length(c3); ++i) dot(string(i),point(c3,i),E,linewidth(6w)+.9green); |
// Le dernier exemple de cette série : reprise du premier exemple, // en ayant remplacé buildcycle(c1,c2) par buildcycle(c2,c1). // Il faut constater que si la zone définie par c3 est la même, // il ne s'agit pas du même chemin pour autant : regarder le numéro // des noeuds pour s'en convaincre. size(7.8cm,0); // Je définis un chemin c1 et un second c2 déduit par translation. path c1=(0,0)..(1.5,0)..(2,1.5)..(-1,1)..cycle; path c2=shift(-1.5,.6)*c1; // c3 est le chemin cyclique résultant de la fonction buildcycle // appliquée à c1 et c2 dans cet ordre. path c3=buildcycle(c2,c1); // On colorie la zone définie par c3 et on dessine les ensembles. fill(c3,palegreen); draw(c1,2bp+blue); draw(c2,2bp+red); draw(c3,.9bp+yellow); // On étiquette les noeuds des trois chemins pour // bien comprendre comment est construit c3 à partir de c1 et c2. defaultpen(fontsize(14pt)); real w=linewidth(); for(int i=0; i<length(c1); ++i) dot(string(i),point(c1,i),SW,linewidth(12w)+.7blue); for(int i=0; i<length(c2); ++i) dot(string(i),point(c2,i),SW,linewidth(12w)+.7red); for(int i=0; i<length(c3); ++i) dot(string(i),point(c3,i),E,linewidth(6w)+.9green); |
size(7cm,0); path cercle2=scale(2)*unitcircle, // cercle de rayon 2 cercle3=scale(3)*unitcircle; // cercle de rayon 3 // Définition d'une croix à 8 branches, inscrite dans cercle de rayon 3 path croix=scale(3)*cross(8,round=false,r=0.5); fill(croix,orange); // On colorie la croix... clip(cercle2); // ... puis on efface la partie de la croix en dehors du cercle2. // On dessine la croix complète en vert ... draw(croix,green); // ... et les deux cerclesen pointillés. draw(cercle2^^cercle3,dashed); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; filloutside(chemin,red); shipout(bbox(3mm,white)); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; fill(scale(1)*unitcircle,red); unfill(chemin); draw(chemin,dashed+gray); shipout(bbox(3mm,white)); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; pen[] p={red,green,blue,magenta}; int[] edge_flag={0,0,0,1}; draw(chemin); gouraudshade(chemin,p,edge_flag); dot(chemin); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; pen[] p={red,green,blue,magenta}; int[] edge_flag={0,0,0,2}; draw(chemin); gouraudshade(chemin,p,edge_flag); dot(chemin); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; pen[] p={red,green,blue,magenta}; pair[] points={(0,0),(1,0),(1,1),(0,1)}; int[] edge_flag={0,0,0,1}; draw(chemin); gouraudshade(chemin,p,points,edge_flag); dot(chemin); draw(points[0]--points[1]--points[2]--points[3]--cycle,dashed); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; pen[] p={red,green,blue,magenta}; pair[] points={(0,0),(1,0),(1,1),(0,1)}; int[] edge_flag={0,0,0,2}; draw(chemin); gouraudshade(chemin,p,points,edge_flag); dot(chemin); draw(points[0]--points[1]--points[2]--points[3]--cycle,dashed); |
size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(0,1)..cycle; pen[] p={red,green,blue,magenta}; pair[] points={(0,0),(1.1,0),(.5,1.1),(0,1.1)}; int[] edge_flag={0,0,0,1}; draw(chemin); gouraudshade(chemin,p,points,edge_flag); dot(chemin); draw(points[0]--points[1]--points[2]--points[3]--cycle,dashed); |
import geometry; size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(1.5,1)..(0,1)..cycle; pen stylo1=red, stylo2=blue; point p1=(0,0), p2=(1,1); segment seg=segment(p1,p2); line d2=perpendicular(p1,seg), d3=perpendicular(p2,seg); axialshade(chemin,stylo1,p1,stylo2,p2); draw(chemin); dot(chemin); draw(d2^^d3,1bp+dashed); distance("D\'egrad\'e axial",p1,p2,dashed,Arrows); |
import geometry; size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(1.5,1)..(0,1)..cycle; pen stylo1=red, stylo2=blue; point p1=(0.5,0.5), p2=(0.5,0.8); real r1=.5, r2=0.85; circle c1=circle(p1,r1), c2=circle(p2,r2); radialshade(chemin,stylo1,p1,r1,stylo2,p2,r2); draw(chemin); dot(chemin); draw(c1^^c2,1bp+dashed); dot(p1^^p2,4bp+green); |
// Bizarre, bizarre... vous avez dit bizarre ? import geometry; size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(1.5,1)..(0,1)..cycle; pen stylo1=red, stylo2=blue; point p1=(0.5,0.5), p2=(0.5,0.8); real r1=.5, r2=0.6; circle c1=circle(p1,r1), c2=circle(p2,r2); radialshade(chemin,stylo1,p1,r1,stylo2,p2,r2); draw(chemin); dot(chemin); draw(c1^^c2,1bp+dashed); dot(p1^^p2,4bp+green); |
// Bizarre, bizarre... vous avez dit bizarre ? size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(1.5,1)..(0,1)..cycle; pen stylo1=red, stylo2=blue; //point p1=(0.5,0.5), p2=(0.5,0.8); pair p1=(0.5,0.5), p2=(0.5,0.8); real r1=.5, r2=0.6; path c1=circle(p1,r1), c2=circle(p2,r2); radialshade(chemin,stylo1,p1,r1,stylo2,p2,r2); draw(chemin); dot(chemin); draw(c1^^c2,1bp+dashed); dot(p1^^p2,4bp+green); |
// Bizarre, bizarre... vous avez dit bizarre ? size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(1.5,1)..(0,1)..cycle; pen stylo1=red, stylo2=blue; pair p1=(0.5,0.5), p2=(0.5,0.8); real r1=.5, r2=0.6; path c1=circle(p1,r1), c2=circle(p2,r2); radialshade(chemin,stylo2,p2,r2,stylo1,p1,r1); draw(chemin); dot(chemin); draw(c1^^c2,1bp+dashed); dot(p1^^p2,4bp+green); |
// Bizarre, bizarre... vous avez dit bizarre ? import geometry; size(7cm,0); path chemin=(0,0){dir(45)}..(1,0)..(1,.5)..(1.5,1)..(0,1)..cycle; pen stylo1=red, stylo2=blue; point p1=(0.5,0.5), p2=(0.5,0.8); real r1=.5, r2=0.6; circle c1=circle(p1,r1), c2=circle(p2,r2); radialshade(chemin,stylo2,p2,r2,stylo1,p1,r1); draw(chemin); dot(chemin); draw(c1^^c2,1bp+dashed); dot(p1^^p2,4bp+green); |
Dernière modification le Fri Oct 28 13:00:18 CEST 2011 par G.Marris Valide XHTML