Petit (mais alors tout petit) défi

Tout ce qui concerne le langage Asymptote. Ce langage est supporté sur le forum via les balises asy.

Modérateur : gdm_asy

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 global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

Petit (mais alors tout petit) défi

Message 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
Modérateur
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot

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

Message par chellier »

C'est quelque chose comme ça ? :
verre.png

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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

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

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

Message 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.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

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

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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) :
{}
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 : 1903
Inscription : samedi 29 décembre 2007, 00:58

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

projetmbc
Utilisateur chevronné
Utilisateur chevronné
Messages : 1903
Inscription : samedi 29 décembre 2007, 00:58

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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). :-)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

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

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

chellier
Modérateur
Modérateur
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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
Modérateur
Messages : 355
Inscription : samedi 25 juillet 2009, 12:25
Localisation : Le Creusot

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

Message 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 global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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 global
Modérateur global
Messages : 8075
Inscription : vendredi 06 janvier 2006, 15:32
Statut actuel : Enseignant
Localisation : Le Mans

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

Message 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 global
Modérateur global
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre

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

Message 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 : 2031
Inscription : lundi 01 octobre 2007, 10:20

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

Message 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;

.....................