Petit (mais alors tout petit) défi

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Petit (mais alors tout petit) défi

Message non lu par rebouxo »

Voilà je voudrais faire la figure du solide de révolution du BAC STI GM option A et F. C'est un solide de révolution avec la fonction $f(x) = -x*ln(x)+2*x$ entre $1$ et $10$., Il faudra des plans de coupe en $x = 1$, $x=10$ et $x=4.5$.

Donc je suis allé voir la sUUpEErbe doc de Maurice. Il y a bien des solides de révolution, mais pas définis par une fonction. Donc, que faut-il modifier dans le code suivant, pour avoir mon joli solide ?

Code : Tout sélectionner

   import solids;
        currentprojection = perspective(10,100,25);
        unitsize(2.5cm);
        triple pO=(0,0,0);
         // je suppose que c'est là
        path3 gene=(0,0.5,-2)..(0,0.5,-1)..(0,1,-0.5)..(0,1,0.5)..(0,0.5,1)..(0,0.5,2);
        // Question subsidiaire, pourquoi cette redondance de revolution ?
        // Vous faites parti d'un complot de l'ultra gauche ?
        revolution sur=revolution(pO,gene,Y,0,360);
        draw(surface(sur),yellow);
Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

Re: petit (mais alors tout petit défi)

Message non lu par chellier »

C'est quelque chose comme ça ? :
verre.png
verre.png (29.61 Kio) Consulté 1944 fois

Code : Tout sélectionner

import solids;
size(10cm);

currentprojection=perspective(-5,12,3);
revolution solrev=revolution(new real(real x) {return -x*log(x)+2*x;},
                                  1,10,70,operator..,X);
draw(surface(solrev),blue,render(compression=Low,merge=true));
Christophe
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

Pas si petit que cela le défi pour obtenir la section... correspondante à h/2 (si j'ai bien lu le sujet... donc pour la valeur centrale de l'intervalle [1;7] qui n'est pas 4,5).

Code : Tout sélectionner

import solids;
import gm;
size(10cm);

currentprojection=cavaliereY;

real f(real x) {return -x*log(x)+2*x;}

revolution solrev=revolution(f,1,7,60,operator..,X);

draw(surface(solrev),paleblue+opacity(.7),nolight); // ,render(compression=Low,merge=true)

skeleton s;
solrev.transverse(s,reltime(solrev.g,0));
solrev.transverse(s,reltime(solrev.g,1));

// à revoir... car la valeur .47 est approximative.
solrev.transverse(s,reltime(solrev.g,.47));

draw(s.transverse.back,linetype("8 8"));
draw(s.transverse.front);

xaxis3("$x$",xmin=0,xmax=7.9,OutTicks(NoZero,Step=1),Arrow3);
zaxis3("$z$",Arrow3);
2011-07-02_024142.png
Il faut revoir la façon de tracer la section intermédiaire correspondant à x=4... et ajouter les cotes... mais là je vais me coucher.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

GMaths a écrit :Pas si petit que cela le défi pour obtenir la section... correspondante à h/2 (si j'ai bien lu le sujet... donc pour la valeur centrale de l'intervalle [1;7] qui n'est pas 4,5).

Code : Tout sélectionner

// à revoir... car la valeur .47 est approximative.
solrev.transverse(s,reltime(solrev.g,.47));
Quoique... je suis en train de me demander si

Code : Tout sélectionner

solrev.transverse(s,reltime(solrev.g,.5));
ne donne pas ce qui est souhaité.

Sur le moment, je pensais que c'était .5=50% de la longueur du path3 générateur de la surface... qui ne correspondrait pas à la moyenne des abscisses extrêmes mais moment de doute. Je dois vérifier.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

GMaths a écrit :Quoique... je suis en train de me demander si

Code : Tout sélectionner

solrev.transverse(s,reltime(solrev.g,.5));
ne donne pas ce qui est souhaité.

Sur le moment, je pensais que c'était .5=50% de la longueur du path3 générateur de la surface... qui ne correspondrait pas à la moyenne des abscisses extrêmes mais moment de doute. Je dois vérifier.
La réponse est dans la comparaison de cette figure http://marris.org/asymptote/Solides/ind ... 008_sphere et celle qui suit la suivante.
Dans un cas, les cercles sont régulièrement espacés en fonction des distances sur le demi-cercle générateur... et dans l'autre en fonction des valeurs des cotes.

Et il est à noter la différence avec un exemple 2D où les points définissant le path sont espacés en fonction des abscisses (j'ai demandé n=6 pour que cela correspondent aux entiers dans l'exemple suivant) :
5c411b818214e5384ee3aa4dad9ca4c56d215d1f.svg
Donc attention à cette différence du reltime(...,.5).
Dernière modification par GMaths le samedi 02 juillet 2011, 10:53, modifié 1 fois.
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2238
Inscription : samedi 29 décembre 2007, 00:58

Re: Petit (mais alors tout petit) défi

Message non lu par projetmbc »

Bonjour,
si au moins le concepteur du sujet avait fait cet effort. Du grand n'importe quoi ce problème de STI GM.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

projetmbc a écrit :si au moins le concepteur du sujet avait fait cet effort.
Tu veux dire : l'effort d'une figure qui correspondent mieux à la forme réelle ???
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

GMaths a écrit :Donc attention à cette différence du reltime(...,.5).
Un exemple qui montre la différence (j'ai demandé n=6 pour que les points de la génératrice correspondent aussi aux entiers) :

Code : Tout sélectionner

import solids;
import gm;
size(10cm);

currentprojection=cavaliereY;

real f(real x) {return -x*log(x)+2*x;}

revolution solrev=revolution(f,1,7,6,operator..,X);

draw(surface(solrev),paleblue+opacity(.7),nolight); // ,render(compression=Low,merge=true)

skeleton s;
solrev.transverse(s,reltime(solrev.g,0));
solrev.transverse(s,reltime(solrev.g,1));

solrev.transverse(s,reltime(solrev.g,.5));

draw(s.transverse.back,linetype("8 8"));
draw(s.transverse.front);
draw(solrev.silhouette(),.6bp+blue);

xaxis3("$x$",xmin=0,xmax=7.9,OutTicks(NoZero,Step=1),Arrow3);
zaxis3("$z$",Arrow3);

draw(solrev.g);
dot(solrev.g);
real t=reltime(solrev.g,.5);
dot(format("time du point = %f",t),point(solrev.g,t),NE);
dans lequel on constate que :

Code : Tout sélectionner

real t=reltime(solrev.g,.5);
ne donne pas le point de 'time 3'... et donc pas la section par le plan d'équation x=4.
2011-07-02_112559.png
projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 2238
Inscription : samedi 29 décembre 2007, 00:58

Re: Petit (mais alors tout petit) défi

Message non lu par projetmbc »

GMaths a écrit :
projetmbc a écrit :si au moins le concepteur du sujet avait fait cet effort.
???
Tu veux dire : l'effort d'une figure qui correspondent mieux à la forme réelle ???
Lors de l'explication du barême, nous étions plusieurs à émettre les critiques suivantes :
  1. Donner la figure sans les axes, c'est un bon moyen de mettre la majorité des élèves de TGM en difficulté.
  2. Le dessin du solide, surement fait sous Worst de Windaube de façon schématique ne reprenait pas l'allure de la courbe.
  3. Les deux points précédents rendent inutilement compliqué l'énoncé, même si en tant qu'enseignant on voit tout de suite ce qu'il se passe, je doute que les élèves y ont bien compris quelque chose.
  4. Le coup du calcul formel pour demander d'utiliser la calculatrice, je préfère pas en parler.
  5. ...etc
Par contre, si je regarde ta figure, et je l'imagine dans un sujet de BAC, là je deviens un peu moins critique.

PS : j'aime beaucoup le verre de Chellier.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

GMaths a écrit :dans lequel on constate que :

Code : Tout sélectionner

real t=reltime(solrev.g,.5);
ne donne pas le point de 'time 3'... et donc pas la section par le plan d'équation x=4.
On peut alors penser à mettre :

Code : Tout sélectionner

solrev.transverse(s,3);
mais cela ne fonctionne pas... et j'ai mis un temps certain à comprendre la subtilité : il faut mettre :

Code : Tout sélectionner

solrev.transverse(s,3.0);
ou

Code : Tout sélectionner

solrev.transverse(s,t=3);
pour obtenir la section souhaitée.
2011-07-02_121032.png
Sujet clos pour moi : je retourne à mes propres développements (ma base de sujets de bac). :-)
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

Un dernier ajout tout de même :

pour ne pas avoir à préciser n dans la définition de solrev et à réfléchir ensuite au numéro du noeud correspondant à la valeur de x souhaitée... on préfèrera ceci :

Code : Tout sélectionner

...

revolution solrev=revolution(f,1,7,operator..,X);
...

real x=4;
real ti=(x-solrev.m.x)/(solrev.M.x-solrev.m.x)*length(solrev.g);

solrev.transverse(s,ti);
pour ajouter la section dans le plan d'équation x=4.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

Pour qu'il en reste une trace facile à trouver :

j'ai mis un exemple d'application 2d de ce qui précède ici

... et je vais reprendre probablement, dans la galerie, aussi l'exemple 3d... mais plus tard car j'ai un petit souci avec ma définition de la projection cartesienneY à revoir d'abord.
A moins que je me rabatte sur une projection conventionnelle :

Code : Tout sélectionner

import solids;
import gm;
size(10cm);

//currentprojection=cavaliereY;
currentprojection=orthographic((20,-40,20),zoom=.9);

real f(real x) {return -x*log(x)+2*x;}

revolution solrev=revolution(f,1,7,6,operator..,X);

draw(surface(solrev),paleblue+opacity(.7),nolight); // ,render(compression=Low,merge=true)

skeleton s;
solrev.transverse(s,reltime(solrev.g,0));
solrev.transverse(s,reltime(solrev.g,1));

real x=4;
real ti=(x-solrev.m.x)/(solrev.M.x-solrev.m.x)*length(solrev.g);

solrev.transverse(s,ti);

draw(s.transverse.back,linetype("8 8"));
draw(s.transverse.front);
draw(solrev.silhouette(),.6bp+blue);

xaxis3("$x$",xmin=0,xmax=7.9,OutTicks(NoZero,Step=1),Arrow3);
zaxis3("$z$",Arrow3);

draw(solrev.g);
dot(solrev.g);
dot(format("time du point = %f",ti),point(solrev.g,ti),NE);
bacsti.pdf
(439.69 Kio) Téléchargé 257 fois
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

Re: Petit (mais alors tout petit) défi

Message non lu par chellier »

GMaths a écrit :mais plus tard car j'ai un petit souci avec ma définition de la projection cartesienneY à revoir d'abord.
De quelle genre?
Que donne celle que je définis dans ma doc (voir ma signature, dans les annexes)?

Christophe
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

chellier a écrit :De quelle genre?
Un truc bizarre : un changement d'angle de vue quand je mets ou j'enlève -render=4 en option de compilation.

Code : Tout sélectionner

projection cavaliereY(real angle=45, real rapport=.5)
{
  transform3 t={{1,rapport*Cos(angle),0,0},
                {0,rapport*Sin(angle),1,0},
                {0,-1,0,-1},
                {0,0,0,1}};
  return projection((Cos(angle)^2,-1,1-Cos(angle)^2),normal=(0,-1,0),
  new transformation(triple,triple,triple) { return transformation(t);});
}
Je regarderai plus tard le problème... car je sais le parer pour l'instant et je n'en ai pas besoin.
chellier
Modérateur honoraire
Modérateur honoraire
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot
Contact :

Re: Petit (mais alors tout petit) défi

Message non lu par chellier »

GMaths a écrit :Un truc bizarre : un changement d'angle de vue quand je mets ou j'enlève -render=4 en option de compilation.
Je viens de faire quelques essais, je ne vois rien de tout ça... Ni avec la définition de la perspective cavalière pcY (et pcX) que j'ai déjà donné dans mon démarrage rapide, annexe D, qui en fait revient à la même que la tienne.

Christophe
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Re: Petit (mais alors tout petit) défi

Message non lu par rebouxo »

Je déterre se sujet.

Grâce au code de Gaëtan, j'ai réussi à faire une autre figure.

Je bloque sur quelques trucs :

dans solrev.transverse(s,reltime(solrev.g,0));, que veut dire le solrev.g et plus particulièrement le .g ?
J'ai voulu rajouter l'axe des y, mais il ne pointe pas vers moi, comment faire pour le faire venir à moi.

Enfin, je voudrais un ligne sur le bas de ma figure. J'ai réussi à le faire pour le haut, mais le bas, je vois pas.

Code : Tout sélectionner

import solids;
  size(10cm,10cm);

  currentprojection=orthographic(5,-20,5);

  real f(real x) {return -x^3+ 4.5*x^2-6*x+3;}
  real g(real x){return 0.5 ;}
  real h(real x){return 1 ;}

  revolution solrev=revolution(f,1,2,1,operator..,X);
  revolution goulot=revolution(g,0,1,1,operator..,X);
  revolution cul=revolution(h,2,5,1,operator..,X);

  draw(surface(solrev),paleblue+opacity(.25),nolight); //
  draw(surface(goulot),paleblue+opacity(.25),nolight); // 
  draw(surface(cul),paleblue+opacity(.25),nolight); // 
  
  skeleton s_1;
  // permet de faire des tranches. Construction de l'intersection
  solrev.transverse(s_1,reltime(solrev.g,0)); // début
  //  solrev.transverse(s_1,reltime(solrev.g,1)); // fin
  //  solrev.transverse(s_1,reltime(solrev.g,.5)); //milieu

  // Dessin de l'intersection
  draw(s_1.transverse.back,linetype("8 8"));
  draw(s_1.transverse.front);
  
  skeleton s_2;
  goulot.transverse(s_2,reltime(goulot.g,0)) ;

  draw(s_2.transverse.back,linetype("8 8"));
  draw(s_2.transverse.front);

  skeleton s_3;
  cul.transverse(s_3,reltime(cul.g,0)) ;
  cul.transverse(s_3,reltime(cul.g,1)) ;

  draw(s_3.transverse.back,linetype("8 8"));
  draw(s_3.transverse.front);
  
  xaxis3("$x$",xmin=0,xmax=5.0,OutTicks(NoZero,Step=1),Arrow3);
  yaxis3("$y$",Arrow3) ;
  zaxis3("$z$",Arrow3);
  
  draw(solrev.g);
  draw(goulot.g);
  draw(cul.g) ;
//  dot(solrev.g);
  real t=reltime(solrev.g,.5);
Les lignes horizontales ne sont pas très intéressantes non plus.

Merci de vos réponses.

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

rebouxo a écrit :dans solrev.transverse(s,reltime(solrev.g,0));, que veut dire le solrev.g et plus particulièrement le .g ?
C'est le path générateur.

Pour avoir un trait qui délimite le tour, il y a .silhouette() mais alors il faut traiter la bouteille en une fois.

Une version sensiblement plus courte qui le fait, et qui prend vraiment en compte la partie cubique (qui n'était pas tracée dans le code précédent, compte tenu du n=1 passé à graph) :

Code : Tout sélectionner

import solids;
size(10cm,10cm);
currentprojection=orthographic(5,-20,5);
real f(real x) {
  if(x<1) return .5;
  if(x>2) return 1;
  return -x^3+ 4.5*x^2-6*x+3;}

revolution bouteille=revolution(f,0,5,100,operator--,X);
draw(surface(bouteille),paleblue+opacity(.25),nolight);    
draw(bouteille.silhouette(),black);

real k1=arclength(revolution(f,0,1,X).g) / arclength(revolution(f,0,5,X).g),
       k2=arclength(revolution(f,0,2,X).g) / arclength(revolution(f,0,5,X).g);
skeleton sk;
bouteille.transverse(sk,reltime(bouteille.g,0),P=currentprojection);
bouteille.transverse(sk,reltime(bouteille.g,k1),P=currentprojection);
bouteille.transverse(sk,reltime(bouteille.g,k2),P=currentprojection);
draw(sk.transverse.back,linetype("8 8"));
draw(sk.transverse.front);
- pour cacher les traits : essayer de compiler avec -render=4 : je n'en ai pas chez moi.

- pour "travailler" dans un repère indirect... je n'ai jamais eu besoin, et je ne suis pas pas sûr qu'il y ait une option qui le permette facilement : il faudra peut-être bricoler (à savoir mettre une flèche dans l'autre sens, sans que réellement on puisse placer un point dans ce repère indirect sans tricher sur le signe du y). La nuit va porter conseil.
guiguiche
Modérateur général
Modérateur général
Messages : 8191
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans
Contact :

Re: Petit (mais alors tout petit) défi

Message non lu par guiguiche »

Plutôt que chercher à travailler dans un repère indirect, ce ne serait pas plus simple de permuter les deux axes (x et y) ?
Pas d'aide par MP : les questions sont publiques, les réponses aussi.
Tu as apprécié l'aide qui t'a été fournie ? Alors n'hésite pas à rendre la pareille à quelqu'un d'autre.
Un peu d'autopromotion.
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Re: Petit (mais alors tout petit) défi

Message non lu par rebouxo »

Ah oui, je me disais aussi que je trouvais les connexions un peu anguleuse.

Bon, je vais me passer de l'axe des $y$, pas franchement utile.
GMaths a écrit :C'est le path générateur.
Cela ne m'éclaire guère. C'est ce qui permet de dire à asymptote la génératrice de ton solide de révolution ?
Si c'est cela, g n'est pas assez parlant (enfin je trouve...)

Bon, je regarde pourquoi je n'ai pas réussi à faire apparaître la partie cubique.

Merci
Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Petit (mais alors tout petit) défi

Message non lu par GMaths »

rebouxo a écrit :Bon, je vais me passer de l'axe des $y$, pas franchement utile.
GMaths a écrit :C'est le path générateur.
Cela ne m'éclaire guère. C'est ce qui permet de dire à asymptote la génératrice de ton solide de révolution ?
Si c'est cela, g n'est pas assez parlant (enfin je trouve...)
J'ai écrit path mais c'était sous-entendu en 3D, donc un path3.

Oui, la génératrice.

Début de la définition de la structure revolution dans solids.asy ; le commentaire préalable l'explique :

Code : Tout sélectionner

// A surface of revolution generated by rotating a planar path3 g
// from angle1 to angle2 about c--c+axis.
struct revolution {
  triple c;
  path3 g;
  triple axis;
  real angle1,angle2;
  triple M;
  triple m;

.....................
Répondre