Page 1 sur 1

hachures sous une courbe

Posté : ven. 20 avr. 2012, 12:52
par DK
Bonjour,

Dans l'exemple ci-dessous, les hachures sous la courbe occupent un rectangle. J'aurai voulu limiter la zone hachurée sous la courbe sur un espace moins important et sans que cela ai l'aspect d'une zone rectangulaire. Comment puis-je faire? (sans forcément prendre une courbe parallèle sous la courbe comme limite inférieure des hachures).

Deuxième problème : je ne parviens pas à hachurer toute la zone sous les courbes Cg-Cf-Cg sur l'intervalle [-4;3]. (Nous savons bien que ca ne correspond pas à f(x)<=g(x) sur [-4;3], mais sinon par curiosité comment faire de telles hachures d'un seul coup?)

Merci pour vos suggestions.

Bien cordialement.
DK

Figure asymptote f6d41606859955e851fc0e793589ea18
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph_pi;
  2. import patterns;
  3.  
  4. usepackage("relsize");
  5. usepackage("mathrsfs");
  6.  
  7. // ----- Définition et tracé de la grille (+axes) -----------------
  8. real xmin=-4, xmax=2, ymin=-8 , ymax=6 ;
  9. graphicrules( xunit=.8cm, yunit=.8cm, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax );
  10. grid(xStep=1, xstep=.5,
  11. yStep=1, ystep=.5,
  12. pTick=.7bp+black,
  13. ptick=linetype("0 " + string(1mm), offset=0, scale=false, adjust=false)+.7bp+.4white,
  14. above=false
  15. );
  16. cartesianaxis(
  17. p=currentpen,
  18. xticks=Ticks(Label(currentpen+fontsize(7),Fill(white)),
  19. Step=1, step=.5,
  20. NoZero,
  21. ptick=grey),
  22. yticks=Ticks(Label(currentpen+fontsize(7), align=0.75*NW,Fill(white)),
  23. Step=1, step=.5,
  24. NoZero,
  25. ptick=grey),
  26. viewxaxis=true,
  27. viewyaxis=true,
  28. arrow=Arrow
  29. );
  30. labeloij(p=1bp+.5*red,arrow=Arrow(SimpleHead,5bp),dot);
  31.  
  32. // ----- Définition des fonctions -----------------
  33. real f(real x) {return x^2+3*x+1 ;}
  34. real g(real x) {return -2*x^2-4*x+3 ;}
  35.  
  36. // ----- Tracé des courbes Cf, Cg -----------------
  37. draw(graph(f, -4,1.1, n=500),1bp+red);
  38. draw(graph(g, -3.5,3/2, n=500),1bp+blue);
  39.  
  40. real marge=.5;
  41. xlimits(xmin-marge,xmax+marge,Crop);
  42. ylimits(ymin-marge,ymax+marge,Crop);
  43.  
  44. // ----- Quelques textes et constructions sur la figure -----------------
  45. label("$\mathscr{C}_f$",(-3.5,f(-3.5)),NE);
  46. label("$\mathscr{C}_g$",(-3/2,g(-3/2)),NW);
  47. label("\relsize{-2}{BMA - option : \'Eb\'enisterie -- DM mars 2012}", (-1,-8.35),UnFill);
  48. // Points d'intersection entre les deux courbes sur l'intervalle [-4;3] :
  49. real[][] pts=intersections(graph(f),graph(g));
  50. pair I=point(graph(f),pts[0][0]),
  51. J=point(graph(f),pts[1][0]);
  52. dot("$I$",I,NW,3bp+black);
  53. dot("$J$",J,E,3bp+black);
  54. //
  55. // ----- Les hachures pour f(x) <= g(x) -----------------
  56. path zonehachure = buildcycle( (I.x,g(-3.5))--I, graph(f,I.x,J.x), J--(J.x,g(3/2))--(I.x,g(-3.5)) );
  57.  
  58. add("hachure",hatch(H=1mm,dir=SE,gray));
  59. fill(zonehachure,pattern("hachure"));

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 13:01
par GM
DK a écrit :Bonjour,

Bonjour,

DK a écrit :Dans l'exemple ci-dessous, les hachures sous la courbe occupent un rectangle. J'aurai voulu limiter la zone hachurée sous la courbe sur un espace moins important et sans que cela ai l'aspect d'une zone rectangulaire. Comment puis-je faire? (sans forcément prendre une courbe parallèle sous la courbe comme limite inférieure des hachures).

Si tu ne veux pas délimiter le bas avec un trait horizontal ou une courbe parallèle... je ne vois pas quelle forme tu espères.

DK a écrit :Deuxième problème : je ne parviens pas à hachurer toute la zone sous les courbes Cg-Cf-Cg sur l'intervalle [-4;3].

Que veux-dire Cg-Cf-Cg ?

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 16:46
par DK
Bonjour,

J'ai utilisé l'écriture Cg-Cf-Cg pour dire comment pourrait-on hachurer sous la courbe bleu jusqu'au point I (donc de x=-3.5 à x=xI, intersections des courbes Cg et Cf), sous la courbe rouge entre les points I et J, et sous la courbe bleue de J jusqu'à son tracé que j'ai arrêté à x=3/2? (donc Cg=courbe représentative de la fonction g, Cf= courbe représentative de la fonction f et qui est tracée en rouge).

Si tu ne veux pas délimiter le bas avec un trait horizontal ou une courbe parallèle... je ne vois pas quelle forme tu espères.

Et bien n'importe quelle forme, une bézier par exemple. Donc là je vais regarder comment dessiner une bézier, sous la courbe rouge entre les abscisses de I et J, puis ensuite tenter de hachurer le domaine compris en-dessous de la courbe rouge entre les points I et J, et les abscisses x=xI et x= xJ et une courbe de bézier.

Bien cordialement.
DK

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 17:34
par chellier
Bonjour,

Je ne sais pas si ça répond en parti à ta question :

Code : Tout sélectionner

// ----- Les hachures pour f(x) <= g(x) -----------------
//path zonehachure = buildcycle( (I.x,g(-3.5))--I, graph(f,I.x,J.x), J--(J.x,g(3/2))--(I.x,g(-3.5)) );
path p1=graph(g, -3.5,I.x, n=500), p2=graph(f,I.x,J.x,n=500), p3=graph(g,J.x,1.5, n=500);
path zonehachure = p1--p2--p3--cycle;
add("hachure",hatch(H=1mm,dir=SE,gray));
fill(zonehachure,pattern("hachure"));


Figure asymptote 7819271e201252d0daab322bb4192612
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph_pi;
  2. import patterns;
  3.  
  4. usepackage("relsize");
  5. usepackage("mathrsfs");
  6.  
  7. // ----- Définition et tracé de la grille (+axes) -----------------
  8. real xmin=-4, xmax=2, ymin=-8 , ymax=6 ;
  9. graphicrules( xunit=.8cm, yunit=.8cm, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax );
  10. grid(xStep=1, xstep=.5,
  11. yStep=1, ystep=.5,
  12. pTick=.7bp+black,
  13. ptick=linetype("0 " + string(1mm), offset=0, scale=false, adjust=false)+.7bp+.4white,
  14. above=false
  15. );
  16. cartesianaxis(
  17. p=currentpen,
  18. xticks=Ticks(Label(currentpen+fontsize(7),Fill(white)),
  19. Step=1, step=.5,
  20. NoZero,
  21. ptick=grey),
  22. yticks=Ticks(Label(currentpen+fontsize(7), align=0.75*NW,Fill(white)),
  23. Step=1, step=.5,
  24. NoZero,
  25. ptick=grey),
  26. viewxaxis=true,
  27. viewyaxis=true,
  28. arrow=Arrow
  29. );
  30. labeloij(p=1bp+.5*red,arrow=Arrow(SimpleHead,5bp),dot);
  31.  
  32. // ----- Définition des fonctions -----------------
  33. real f(real x) {return x^2+3*x+1 ;}
  34. real g(real x) {return -2*x^2-4*x+3 ;}
  35.  
  36. // ----- Tracé des courbes Cf, Cg -----------------
  37. draw(graph(f, -4,1.1, n=500),1bp+red);
  38. draw(graph(g, -3.5,3/2, n=500),1bp+blue);
  39.  
  40. real marge=.5;
  41. xlimits(xmin-marge,xmax+marge,Crop);
  42. ylimits(ymin-marge,ymax+marge,Crop);
  43.  
  44. // ----- Quelques textes et constructions sur la figure -----------------
  45. label("$\mathscr{C}_f$",(-3.5,f(-3.5)),NE);
  46. label("$\mathscr{C}_g$",(-3/2,g(-3/2)),NW);
  47. label("\relsize{-2}{BMA - option : \'Eb\'enisterie -- DM mars 2012}", (-1,-8.35),UnFill);
  48. // Points d'intersection entre les deux courbes sur l'intervalle [-4;3] :
  49. real[][] pts=intersections(graph(f),graph(g));
  50. pair I=point(graph(f),pts[0][0]),
  51. J=point(graph(f),pts[1][0]);
  52. dot("$I$",I,NW,3bp+black);
  53. dot("$J$",J,E,3bp+black);
  54. //
  55. // ----- Les hachures pour f(x) <= g(x) -----------------
  56. //path zonehachure = buildcycle( (I.x,g(-3.5))--I, graph(f,I.x,J.x), J--(J.x,g(3/2))--(I.x,g(-3.5)) );
  57. path p1=graph(g, -3.5,I.x, n=500), p2=graph(f,I.x,J.x,n=500), p3=graph(g,J.x,1.5, n=500);
  58. path zonehachure = p1--p2--p3--cycle;
  59. add("hachure",hatch(H=1mm,dir=SE,gray));
  60. fill(zonehachure,pattern("hachure"));


Christophe

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 18:18
par GM
Peut-être comme cela : j'ai supprimé les points d'intersection dont je ne me suis pas servi.

Figure asymptote 8b2c164dbd00bdac9c084bb55071de17
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph_pi;
  2. import patterns;
  3. usepackage("relsize");
  4. usepackage("mathrsfs");
  5.  
  6. // ----- Définition et tracé de la grille (+axes) -----------------
  7. real xmin=-4, xmax=2, ymin=-8 , ymax=6 ;
  8. graphicrules( xunit=.8cm, yunit=.8cm, xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax );
  9. grid(xStep=1, xstep=.5,
  10. yStep=1, ystep=.5,
  11. pTick=.7bp+black,
  12. ptick=linetype("0 " + string(1mm), offset=0, scale=false, adjust=false)+.7bp+.4white,
  13. above=false
  14. );
  15. cartesianaxis(
  16. p=currentpen,
  17. xticks=Ticks(Label(currentpen+fontsize(7),Fill(white)),
  18. Step=1, step=.5,
  19. NoZero,
  20. ptick=grey),
  21. yticks=Ticks(Label(currentpen+fontsize(7), align=0.75*NW,Fill(white)),
  22. Step=1, step=.5,
  23. NoZero,
  24. ptick=grey),
  25. viewxaxis=true,
  26. viewyaxis=true,
  27. arrow=Arrow
  28. );
  29. labeloij(p=1bp+.5*red,arrow=Arrow(SimpleHead,5bp),dot);
  30.  
  31. // ----- Définition des fonctions et des courbes ------
  32. real f(real x) {return x^2+3*x+1 ;}
  33. real g(real x) {return -2*x^2-4*x+3 ;}
  34. path Cf = graph(f, -4,1.1, n=500),
  35. Cg = graph(g, -3.5,3/2, n=500);
  36.  
  37. real marge=.5;
  38. xlimits(xmin-marge,xmax+marge,Crop);
  39. ylimits(ymin-marge,ymax+marge,Crop);
  40.  
  41. // ----- Quelques textes et constructions sur la figure -----------------
  42. label("$\mathscr{C}_f$",(-3.5,f(-3.5)),NE);
  43. label("$\mathscr{C}_g$",(-3/2,g(-3/2)),NW);
  44. label("\relsize{-2}{BMA - option : \'Eb\'enisterie -- DM mars 2012}", (-1,-8.35),UnFill);
  45.  
  46. // --------- HACHURES et ftontière de la zone hachurée
  47. path zonehachure = firstcut(Cg,Cf).before
  48. --lastcut(firstcut(Cf,Cg).after,Cg).before
  49. --lastcut(Cg,Cf).after;
  50. draw(zonehachure,3bp+yellow);
  51.  
  52. // ----- Tracé des courbes Cf, Cg -----------------
  53. draw(Cf,1bp+red);
  54. draw(Cg,1bp+blue);
  55.  
  56. add("hachure",hatch(H=1mm,dir=SE,gray));
  57. fill(zonehachure--cycle,pattern("hachure"));

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 18:39
par GM
Pour quelque chose d'un peu plus original en bas :

Figure asymptote fab2818b5b7952065afcdd5097f5820c
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import patterns;
  2. import graph;
  3. real f(real x) {return x^2+3*x+1 ;}
  4. real g(real x) {return -2*x^2-4*x+3 ;}
  5. path Cf = graph(f, -4,1.1, n=500),
  6. Cg = graph(g, -3.5,3/2, n=500);
  7. path zonehachure = firstcut(Cg,Cf).before --lastcut(firstcut(Cf,Cg).after,Cg).before --lastcut(Cg,Cf).after;
  8. zonehachure = subpath(zonehachure,20,480);
  9. size(200,200,IgnoreAspect);
  10. draw(zonehachure,3bp+yellow);
  11. draw(Cf,1bp+red);
  12. draw(Cg,1bp+blue);
  13. add("hachure",hatch(H=1mm,dir=SE,gray));
  14. fill(zonehachure{dir(120)}..cycle,pattern("hachure"));

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 21:47
par DK
Bonsoir,

Pour la dernière figure, c'est ce que je recherchais à faire. Bien, alors j'étais bien loin du code proposé et qui répond à mes questions. Impossible à deviner même dirais-je ! Quelques explications m'arrangeraient une peu, disons pour me permettre d'utiliser dans d'autres situations.

Merci à vous cependant.

Bien cordialement.
D. COLLIN

Re: hachures sous une courbe

Posté : ven. 20 avr. 2012, 22:08
par GM
DK a écrit :Quelques explications m'arrangeraient un peu


Des exemples pour comprendre firstcut et lastcut :
http://www.marris.org/asymptote/Intersections/index.html#fig_fa01_240708_firstcut_lastcut

subpath(path, real, real) est, je pense, suffisamment parlant. On pouvait deviner l'ordre de grandeur des réels à mettre, compte tenu que tu avais demandé 500 points aussi bien pour Cf que pour Cg.

Figure asymptote 9f15105fd4a5092540ffea9c8e65a965
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. size(200);
  2. transform t=shift(0,-1);
  3. path p1=(0,0)..(3,-1)..(5,2)..(7,2)..(10,1),
  4. p2=t*p1,
  5. p3=t^2*p1;
  6. draw(p1,dot());
  7. draw(p2^^p3,linetype("4 4"),dot());
  8. draw(subpath(p2,1,2),1bp+red,dot(red));
  9. draw(subpath(p3,0.5,3.25),1bp+green,dot(green));


J'imagine que tu as compris que c'est le {dir(120)} qui a imposé une tangente et a eu donc pour incidence la déformation de la courbe du bas.

Figure asymptote 77c6fcd843d8d8aefb86b97603c5e066
*** Pour masquer/découvrir le code Asymptote qui a permis de créer la figure, il faut cliquer dessus. ;-) ***

CODE ASYMPTOTE de la figure ci-dessus : Tout sélectionner
  1. import graph;
  2. size(300);
  3. real f(real x) { return 4-x^2; }
  4. path p[]={ graph(f,-2,2),
  5. graph(f,-2,2)--cycle,
  6. graph(f,-2,2)..cycle,
  7. graph(f,-2,2){dir(120)}..cycle,
  8. subpath(graph(f,-2,2),0,100){dir(120)}..cycle,
  9. subpath(graph(f,-2,2),20,80){dir(120)}..cycle
  10. };
  11. for(int k=0; k<p.length; ++k) draw(shift(5k,0)*p[k]);


Si les explications ne sont pas suffisantes, il suffit de le dire.