À propos de la routine surface()

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1328
Enregistré le : dim. 7 mars 2010, 14:50

Re: À propos de la routine surface()

Message non lu par GM » jeu. 19 janv. 2012, 16:38

Je suis moi-même complètement débordé en ce moment... et je suis debout depuis 3h30... donc pas très frais...

Tout cela pour te dire... que pour faire au plus vite pour te dépanner... et retourner à mon propre boulot,
j'ai, sans trop réfléchir à l'optimisation, commencé par reproduire ta vue 2D... puis j'ai bêtement créé chaque triple correspondant (en ajoutant 0) pour les cotations... sans réfléchir à la possibilité d'optimiser pour réduire le code,
et pour te proposer cela en dépannage :

Image

Code : Tout sélectionner

import three;
import geometry;
size(10cm);

currentprojection=orthographic(-1,-1,1);

//================ by CHELLIER
void cote3D(picture pic=currentpicture,
Label L="", triple A, triple B,
real d=5mm, triple v, bool cc=true,
pen p=currentpen, pen joinpen=dotted,
arrowbar3 arrow=Arrows3)
{
transform3 T=shift(d*unit(v));
triple A=A, B=B;
pic.add(new void(picture f, transform3 t) {
picture opic;
path3 dist;
triple Ap=t*A, Bp=t*B;
triple a=T*Ap, b=T*Bp;
if (cc) {dist=a--b;}
else {dist=b--a;}
draw(opic,L,dist,p,arrow);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
//==========================================

real AO=15,
     OH=7,
    HC=6,
    OC=OH+HC,
    AH=sqrt(AO^2-OH^2),
    CB=sqrt(AO^2-OC^2),
    ep=.8;

point pO=(0,0),
      pH=(-OH,0),
     pA=(-OH,AH),
     pC=(-OC,0),
     pB=(-OC,-CB);

triple O=(0,0,0),
       H=(-OH,0,0),
      A=(-OH,AH,0),
      C=(-OC,0,0),
      B=(-OC,-CB,0);
    
circle c=circle(pO,AO);

path p= pO--arc(c,pA,pB,CW)--cycle;
transform3 t=shift(0,0,ep);

draw(extrude(p,ep*Z),lightgray);
draw(surface(path3(p)^^(t*path3(p))),lightgray);

/////////////////

cote3D(Label(format("$%f\,\textrm{cm}$",OH),red),O,H,0Z);
cote3D(Label(format("$%f\,\textrm{cm}$",HC),red),H,C,0Z);
cote3D(Label(format("$%f\,\textrm{cm}$",AO),red),O,A,1Z);
cote3D(Label("$HA$",red),H,A,0Z);
cote3D(Label("$CB$",red),C,B,0Z);
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 10/10/17) :
PC n°1 :Windows 10 - Asymptote(2.41)+MikTeX2.9 - Editeurs : Notepad++ et TeXworks.
Mes autres PC :Ubuntu 16.04LTS - Asymptote(2.42 git) + TexLive2017 - Editeur : TeXworks.
Merci de préciser la votre pour faciliter l'aide des autres !

Fabrice
Messages : 92
Enregistré le : sam. 13 mars 2010, 11:41

Re: À propos de la routine surface()

Message non lu par Fabrice » jeu. 19 janv. 2012, 18:52

Bonsoir Gaëtan,
Merci pour avoir pris de ton temps (précieux !) pour proposer ce code.
Je n'ai malheureusement pas de scanner, et je ne peux donc pas te montrer la figure de l'exercice dont je m'inspire. Il y a moins d'indications mais seulement 4 traits en pointillés, parallèles à l'axe des ordonnées (dans le plan de la feuille), et démarrant de quatre points "stratégiques" de la galette. Entre ces traits, il y a 3 doubles flèches de même direction indiquant respectivement 6,7 et 15.
Mais bon, ce que tu as proposé est largement suffisant.
Debian Sid + Asymptote 2.25svn + Emacs + TeXLive 2013

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1328
Enregistré le : dim. 7 mars 2010, 14:50

Re: À propos de la routine surface()

Message non lu par GM » jeu. 19 janv. 2012, 20:41

Si j'ai compris... quelque chose comme cela :

Image


Code : Tout sélectionner

import three;
import geometry;
size(10cm);

currentprojection=orthographic(-1,-1,1);

//================ by CHELLIER
void cote3D(picture pic=currentpicture,
Label L="", triple A, triple B,
real d=5mm, triple v, bool cc=true,
pen p=currentpen, pen joinpen=dotted,
arrowbar3 arrow=Arrows3)
{
transform3 T=shift(d*unit(v));
triple A=A, B=B;
pic.add(new void(picture f, transform3 t) {
picture opic;
path3 dist;
triple Ap=t*A, Bp=t*B;
triple a=T*Ap, b=T*Bp;
if (cc) {dist=a--b;}
else {dist=b--a;}
draw(opic,L,dist,p,arrow);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
//==========================================

real AO=15,
     OH=7,
    HC=6,
    OC=OH+HC,
    AH=sqrt(AO^2-OH^2),
    CB=sqrt(AO^2-OC^2),
    ep=.8;

point pO=(0,0),
      pH=(-OH,0),
     pA=(-OH,AH),
     pC=(-OC,0),
     pB=(-OC,-CB),
     pD=(-AO,0);

triple O=(0,0,0),
       H=(-OH,0,0),
      A=(-OH,AH,0),
      C=(-OC,0,0),
      B=(-OC,-CB,0),
      D=(-AO,0,0);
    
circle c=circle(pO,AO);

path p= pO--arc(c,pA,pB,CW)--cycle;
transform3 t=shift(0,0,ep);

draw(extrude(p,ep*Z),lightgray);
draw(surface(path3(p)^^(t*path3(p))),lightgray);
draw(O--D^^C--B,dotted);
draw(path3(arc(c,pA,pB)),dotted);

/////////////////

cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",AO),blue),O,A,Z,d=.5cm);
cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",OH),align=-Y,blue),O,H,Y,d=5cm);
cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",HC),align=-Y,blue),H,C,Y,d=5cm);
cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",AO),align=Y,blue),O,D,Y,d=5.5cm);


... mais le placement des pointillés serait à revoir

et surtout, il faudra revoir le code ultérieurement pour l'optimiser : ce n'est que du dépannage rapide.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 10/10/17) :
PC n°1 :Windows 10 - Asymptote(2.41)+MikTeX2.9 - Editeurs : Notepad++ et TeXworks.
Mes autres PC :Ubuntu 16.04LTS - Asymptote(2.42 git) + TexLive2017 - Editeur : TeXworks.
Merci de préciser la votre pour faciliter l'aide des autres !

Fabrice
Messages : 92
Enregistré le : sam. 13 mars 2010, 11:41

Re: À propos de la routine surface()

Message non lu par Fabrice » ven. 20 janv. 2012, 23:31

Bonsoir Gaëtan,
Ce code m'a bien dépanné, merci.
GM a écrit :Si j'ai compris... quelque chose comme cela :

Cela commence à y ressembler ;)
J'ai "bricolé" une figure dans le plan pour illustrer ce que nous cherchons à reproduire :

Figure asymptote f6f38d239c2a14cba26f38985852ad8a
*** 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 geometry;
  2. size(8cm,0);
  3. real a=2, b=1;
  4. point A=(1,1);
  5. conic el=ellipse(A,a,b);
  6. arc a1=arc(el,90+asin(7/15),180+acos(13/15),CW);
  7. path g=(1,1)--a1--cycle;
  8. transform t=shift(0,-0.2);
  9. draw(g);
  10. arc a2=arc(el,0,180-acos(13/15),CW);
  11. draw(t*a2);
  12. path c=angpoint(el,90+asin(7/15))--A--intersectionpoint(t*A--t*angpoint(el,90+asin(7/15)),A--angpoint(el,180+acos(13/15)))--t*angpoint(el,90+asin(7/15))--cycle;
  13. draw(c);
  14. line l1=segment(angpoint(el,90+asin(7/15)),(angpoint(el,90+asin(7/15)).x,-0.5));
  15. line l3=segment(angpoint(el,0),(angpoint(el,0).x,-0.5));
  16. line l2=segment(A,(A.x,-0.5));
  17. line l4=segment(angpoint(el,180+acos(13/15)),(angpoint(el,180+acos(13/15)).x,-0.5));
  18. draw(l1,dashed);
  19. draw(l2,dashed);
  20. draw(l3,dashed);
  21. draw(l4,dashed);
  22. distance("$6$",(angpoint(el,180+acos(13/15)).x,-0.5),(angpoint(el,90+asin(7/15)).x,-0.5));
  23. distance("$7$",(angpoint(el,90+asin(7/15)).x,-0.5),(A.x,-0.5));
  24. distance("$15$",(A.x,-0.5),(angpoint(el,0).x,-0.5));

@+
Debian Sid + Asymptote 2.25svn + Emacs + TeXLive 2013

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1328
Enregistré le : dim. 7 mars 2010, 14:50

Re: À propos de la routine surface()

Message non lu par GM » mar. 24 janv. 2012, 19:57

Bonsoir, j'ai découvert par hasard au lycée... que le message précédent avait évolué depuis le 20 : la figure a été ajoutée après !?!? :|

Attention... je suis très prompt à lire les nouveaux messages... dès que je reçois un mail d'alerte... donc en éditant un message déjà posté, il y a un grand risque que je ne m'en aperçoive jamais puisque je n'aurai pas de nouveau mail pour me prévenir du changement.

Et quand je vois la figure... j'ai un deuxième conseil à donner : si à l'avenir, il était possible de fournir un scan ou une photo de ce qui est voulu (quitte à le dessiner sur une feuille avant de le photographier)... ceux qui pourront t'aider gagneront en efficacité dans leur réponse. Je dis cela... car je m'aperçois que je ne t'ai pas proposé ce que tu voulais... contrairement à ce que j'avais crû quand tu avais écrit : "Ce code m'a bien dépanné, merci."

--------

Où en es-tu ? J'imagine que c'est trop tard.

-----

A propos de ta figure... elle n'est pas bizarre dans ses dimensions par rapport aux cotations ?
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 10/10/17) :
PC n°1 :Windows 10 - Asymptote(2.41)+MikTeX2.9 - Editeurs : Notepad++ et TeXworks.
Mes autres PC :Ubuntu 16.04LTS - Asymptote(2.42 git) + TexLive2017 - Editeur : TeXworks.
Merci de préciser la votre pour faciliter l'aide des autres !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1328
Enregistré le : dim. 7 mars 2010, 14:50

Re: À propos de la routine surface()

Message non lu par GM » mar. 24 janv. 2012, 20:06

GM a écrit :Et quand je vois la figure... j'ai un deuxième conseil à donner : si à l'avenir, il était possible de fournir un scan ou une photo de ce qui est voulu (quitte à le dessiner sur une feuille avant de le photographier)... ceux qui pourront t'aider gagneront en efficacité dans leur réponse. Je dis cela... car je m'aperçois que je ne t'ai pas proposé ce que tu voulais... contrairement à ce que j'avais crû quand tu avais écrit : "Ce code m'a bien dépanné, merci."


GM a écrit :A propos de ta figure... elle n'est pas bizarre dans ses dimensions par rapport aux cotations ?


Je ne comprends ta dernière figure (que tu as appelé "ton bricolage")... par rapport au lien initial que tu avais donné : http://www.fileupyours.com/files/310238/part.pdf et les cotations que tu avais données : AO = 15, OH = 7 et HC = 6.

J'ai le sentiment que ma dernière figure répondait à ta demande initiale... et que ta dernière figure la contredit.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 10/10/17) :
PC n°1 :Windows 10 - Asymptote(2.41)+MikTeX2.9 - Editeurs : Notepad++ et TeXworks.
Mes autres PC :Ubuntu 16.04LTS - Asymptote(2.42 git) + TexLive2017 - Editeur : TeXworks.
Merci de préciser la votre pour faciliter l'aide des autres !

Fabrice
Messages : 92
Enregistré le : sam. 13 mars 2010, 11:41

Re: À propos de la routine surface()

Message non lu par Fabrice » mer. 25 janv. 2012, 09:32

Bonjour Gaëtan,
Il faut déjà que tu saches que je suis un peu marginal puisque je ne possède pas de portable !!
Donc, il ne m'est pas venu à l'idée de faire une photo.
Pas de scanner, pas de smartphone, ....
La figure que j'ai reproduite est à peu près celle qui se trouve dans le livre, sauf pour le label "6" que l'on voit mieux car l'écart entre les deux verticales est plus grand. A partir de celle-ci, j'ai résolu l'exercice et j'ai trouvé la réponse qui est donnée, ouf !!
Celle que tu as proposée est plus claire pour les élèves.
GM a écrit :Je ne comprends ta dernière figure (que tu as appelé "ton bricolage")... par rapport au lien initial que tu avais donné : http://www.fileupyours.com/files/310238/part.pdf et les cotations que tu avais données : AO = 15, OH = 7 et HC = 6.

Le lien montre une figure que j'ai faite à partir de celle du livre, ce qui m'a permis de trouver la bonne réponse.
GM a écrit :J'ai le sentiment que ma dernière figure répondait à ta demande initiale... et que ta dernière figure la contredit.

Celle du livre me semble difficilement interprétable pour les élèves, mais je ne comprends pas pourquoi celle que j'ai bricolée contredit la tienne.
Merci.
Debian Sid + Asymptote 2.25svn + Emacs + TeXLive 2013

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1328
Enregistré le : dim. 7 mars 2010, 14:50

Re: À propos de la routine surface()

Message non lu par GM » mer. 25 janv. 2012, 10:35

Fabrice a écrit :
GM a écrit :J'ai le sentiment que ma dernière figure répondait à ta demande initiale... et que ta dernière figure la contredit.

Celle du livre me semble difficilement interprétable pour les élèves, mais je ne comprends pas pourquoi celle que j'ai bricolée contredit la tienne.
Merci.


Disons que même si on rectifiait l'angle de la partie ôtée... de telle sorte que les proportions respectées pour le 6 et le 7... il y a un "gros" problème" : 6+7 n'a jamais été égal à 15
... et de la manière où tu places les lignes de cotation (qui doivent toujours être parallèles au segment dont on indique la longueur), les traits bleu et rouge sont des rayons du cercle... et tu leur donnes des valeurs différentes avec tes cotations.

Image

Donc j'imagine... que tu ne voulais pas faire le trait rouge à l'horizontale... car sinon en l'état cela contredit la figure que tu avais donnée.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 10/10/17) :
PC n°1 :Windows 10 - Asymptote(2.41)+MikTeX2.9 - Editeurs : Notepad++ et TeXworks.
Mes autres PC :Ubuntu 16.04LTS - Asymptote(2.42 git) + TexLive2017 - Editeur : TeXworks.
Merci de préciser la votre pour faciliter l'aide des autres !

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1328
Enregistré le : dim. 7 mars 2010, 14:50

Re: À propos de la routine surface()

Message non lu par GM » mer. 25 janv. 2012, 10:56

GM a écrit :
Fabrice a écrit :
GM a écrit :J'ai le sentiment que ma dernière figure répondait à ta demande initiale... et que ta dernière figure la contredit.

Celle du livre me semble difficilement interprétable pour les élèves, mais je ne comprends pas pourquoi celle que j'ai bricolée contredit la tienne.
Merci.


Disons que même si on rectifiait l'angle de la partie ôtée... de telle sorte que les proportions respectées pour le 6 et le 7... il y a un "gros" problème" : 6+7 n'a jamais été égal à 15
... et de la manière où tu places les lignes de cotation (qui doivent toujours être parallèles au segment dont on indique la longueur), les traits bleu et rouge sont des rayons du cercle... et tu leur donnes des valeurs différentes avec tes cotations.

Image

Donc j'imagine... que tu ne voulais pas faire le trait rouge à l'horizontale... car sinon en l'état cela contredit la figure que tu avais donnée.


Et donc j'imagine que tu veux cela :

Image


avec ceci :

Code : Tout sélectionner

import three;
import geometry;
size(10cm);

currentprojection=orthographic(0,-1,.25);
currentlight=nolight;

//================ by CHELLIER
void cote3D(picture pic=currentpicture,
Label L="", triple A, triple B,
real d=5mm, triple v, bool cc=true,
pen p=currentpen, pen joinpen=dotted,
arrowbar3 arrow=Arrows3)
{
transform3 T=shift(d*unit(v));
triple A=A, B=B;
pic.add(new void(picture f, transform3 t) {
picture opic;
path3 dist;
triple Ap=t*A, Bp=t*B;
triple a=T*Ap, b=T*Bp;
if (cc) {dist=a--b;}
else {dist=b--a;}
draw(opic,L,dist,p,arrow);
draw(opic,a--Ap^^b--Bp,joinpen);
add(f,opic);
}, true);
}
//==========================================

real AO=15,
     OH=7,
    HC=6,
    OC=OH+HC,
    AH=sqrt(AO^2-OH^2),
    CB=sqrt(AO^2-OC^2),
    ep=.8;

point pO=(0,0),
      pH=(-OH,0),
     pA=(-OH,AH),
     pC=(-OC,0),
     pB=(-OC,-CB),
     pD=(-AO,0);

triple O=(0,0,0),
       H=(-OH,0,0),
      A=(-OH,AH,0),
      C=(-OC,0,0),
      B=(-OC,-CB,0),
      D=(-AO,0,0);
     
circle c=circle(pO,AO);

path p= pO--arc(c,pA,pB,CW)--cycle;
transform3 t=shift(0,0,ep);

draw(extrude(p,ep*Z),gray);
draw(surface(path3(p)^^(t*path3(p))),lightgray);
draw(O--D^^C--B,linetype("4 4"));
draw(path3(arc(c,pA,pB)),linetype("4 4"));

/////////////////

//cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",AO),blue),O,A,Z,d=.5cm);
cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",OH),align=-Z,blue),O,H,Z,d=2cm);
cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",HC),align=-Z,blue),H,C,Z,d=2cm);
cote3D(Label(scale(.5)*format("$%f\,\textrm{cm}$",AO),align=Z,blue),O,D,Z,d=2.5cm);
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 10/10/17) :
PC n°1 :Windows 10 - Asymptote(2.41)+MikTeX2.9 - Editeurs : Notepad++ et TeXworks.
Mes autres PC :Ubuntu 16.04LTS - Asymptote(2.42 git) + TexLive2017 - Editeur : TeXworks.
Merci de préciser la votre pour faciliter l'aide des autres !

Fabrice
Messages : 92
Enregistré le : sam. 13 mars 2010, 11:41

Re: À propos de la routine surface()

Message non lu par Fabrice » mer. 25 janv. 2012, 17:23

Salut,
GM a écrit :il y a un "gros" problème" : 6+7 n'a jamais été égal à 15

Je confirme ! :D
GM a écrit :et de la manière où tu places les lignes de cotation (qui doivent toujours être parallèles au segment dont on indique la longueur)

Je n'ai fait que reproduire "bêtement" la figure du livre qui ne respecte pas cette convention, d'où ce problème d'interprétation.
GM a écrit :Donc j'imagine... que tu ne voulais pas faire le trait rouge à l'horizontale... car sinon en l'état cela contredit la figure que tu avais donnée.

Exact !
Sur la figure, le trait rouge que tu indiques n'est pas dans le prolongement du trait bleu, c'est vrai, il est plus tourné vers l'observateur. Néanmoins, je réaffirme que pour les élèves, on a l'impression que 6+7 est un rayon de la galette car les lignes de cotation sont telles que je les ai dessinées.
Donc, le dessin que tu as proposé était bien meilleur !
Merci.
Debian Sid + Asymptote 2.25svn + Emacs + TeXLive 2013

Répondre