Page 1 sur 1

Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 12:53
par malaka
Bonjour j'ai écrit ce programme qui me permet de créer un triangle rectangle à partir des deux sommets de l'hypoténuse.
J'aimerais récupérer le chemin T une fois le programme lancé pour le réutiliser par la suite. Je ne vois pas comment faire.

Code : Tout sélectionner

void TRH(pair a, pair b, bool direction=true){ // Construire un triangle rectangle par les 2 sommets de l'hypoténuse
pair c=(a+b)/2; // milieu de l'hypoténuse
path DC; /// demi-cercle
	if(direction==true){DC=arc(c,a,b);}
	else {DC=arc(c,a,b,CW);}
pair d=relpoint(DC,0.3);  // Le sommet de l'angle droit.
fill(a--d--b--cycle,lightgrey);
path T=a--d--b--cycle;
}
Asymptote me renvoie "no matching variable 'T' ". En gros le triangle n'existe pas à l'extérieur de TRH.
Merci d'avance.

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 13:01
par GM
Bonjour,

sur cette page https://asy.marris.fr/asymptote/Prog_Fo ... index.html,
on trouve deux exemples pour tenter d'expliquer la différence entre

1. une procédure (qui correspond au type void) qui est une fonction qui exécute une action mais ne renvoie pas de donnée(s) ;

2. une fonction typée (real[] dans l'exemple, mais on peut avoir tous les types que l'on connait dans asymptote) qui permet de retourner quelque chose via la commande return.

GM

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 13:07
par GM
Si je donne un coup de pouce supplémentaire, cela donne cela :

Figure asymptote 0fd0fb591545eed28b68cf4fc1f78ae4
*** 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. unitsize(1cm);
  2.  
  3. path TRH(pair a, pair b, bool direction=true){ // Construire un triangle rectangle par les 2 sommets de l'hypoténuse
  4. pair c=(a+b)/2; // milieu de l'hypoténuse
  5. path DC; /// demi-cercle
  6. if(direction==true){DC=arc(c,a,b);}
  7. else {DC=arc(c,a,b,CW);}
  8. pair d=relpoint(DC,0.3); // Le sommet de l'angle droit.
  9. fill(a--d--b--cycle,lightgrey);
  10. return a--d--b--cycle;
  11. }
  12.  
  13. draw(TRH((0,0),(4,3)),green);
  14. draw(TRH((0,0),(-4,3)),red);


NB : j'ai changé le void et modifié la dernière ligne pour l'ajout du return mais je n'ai pas cherché à regarder le reste du code pour voir si j'aurais fait (ou pas) de la même manière.

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 13:18
par GM
A propos de triangle dans Asymptote, je rappelle que l'extension geometry de Philippe Ivaldi qui a été intégrée dans Asymptote, définit le type triangle :

https://asy.marris.fr/asymptote/Triangl ... 8_triangle

L'avantage de définir un triangle comme un objet de type triangle et non de type path, c'est que l'on peut ensuite obtenir des points et des droites particuliers relatifs au triangle, sans calcul, uniquement en utilisant les fonctions que Philippe a défini pour les objets de type triangle.

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 13:54
par malaka
Merci.
Dans les triangles de Philippe Ivaldi je n'ai pas trouvé la structure triangleABc (on donne deux angles et le côté entre eux) ni celui que je voulais pour ce cas précis.

Pour le VOID j'ai tout simplement recopié l'un de tes programmes en changeant ce que je comprenais et laissant le reste :D
Je ne trouvais pas la fonction return dans l'index d'ASymptote mais je crois comprendre à peu près ce qu'elle fait avec tes deux exemples et du coup je peux même retirer la ligne
fill(a--d--b--cycle,lightgrey);

C'est exactement ce que je cherchais à faire. Merci beaucoup.

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 13:56
par GM
Je n'ai répondu ci-dessus que du point de vue "technique de programmation avec Asymptote"
mais je viens de réfléchir au point de vue Mathématiques de la question posée :
Des triangles rectangles dont A(0;0) et B(4;3) sont les extrémités de l'hypothénuse, il y en a une infinité
donc c'est bizarre de définir une fonction qui ne peut renvoyer que le triangle dans les deux cas particuliers où le point C a pour "abscisse curviligne" 0.3 sur le demi-cercle. Ne faut-il pas ajouter un paramètre avec une valeur par défaut pour définir le troisième point ? Et ce paramètre ne peut-il pas être plutôt, l'angle en A plutôt qu'une abscisse curviligne par rapport au demi-cercle ?
Je dis cela mais je ne sais pas quel sera l'usage de cette fonction, donc je ferais mieux de me taire. :D

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 14:03
par GM
malaka a écrit :
lun. 24 avr. 2023, 13:54
et du coup je peux même retirer la ligne
fill(a--d--b--cycle,lightgrey);
oui et utiliser filldraw si tu veux colorer l'un des triangles :

Figure asymptote baaccbcd02da2c750d1f05d39dd64484
*** 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. unitsize(1cm);
  2.  
  3. path TRH(pair a, pair b, bool direction=true){ // Construire un triangle rectangle par les 2 sommets de l'hypoténuse
  4. pair c=(a+b)/2; // milieu de l'hypoténuse
  5. path DC; /// demi-cercle
  6. if(direction==true){DC=arc(c,a,b);}
  7. else {DC=arc(c,a,b,CW);}
  8. pair d=relpoint(DC,0.3); // Le sommet de l'angle droit.
  9. return a--d--b--cycle;
  10. }
  11.  
  12. filldraw(TRH((0,0),(4,3)),lightgrey,red);
  13. draw(TRH((-4,3),(0,0),false),green);

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 15:05
par malaka
GM a écrit :
lun. 24 avr. 2023, 13:56
Je n'ai répondu ci-dessus que du point de vue "technique de programmation avec Asymptote"
mais je viens de réfléchir au point de vue Mathématiques de la question posée :
Des triangles rectangles dont A(0;0) et B(4;3) sont les extrémités de l'hypothénuse, il y en a une infinité
donc c'est bizarre de définir une fonction qui ne peut renvoyer que le triangle dans les deux cas particuliers où le point C a pour "abscisse curviligne" 0.3 sur le demi-cercle. Ne faut-il pas ajouter un paramètre avec une valeur par défaut pour définir le troisième point ? Et ce paramètre ne peut-il pas être plutôt, l'angle en A plutôt qu'une abscisse curviligne par rapport au demi-cercle ?
Je dis cela mais je ne sais pas quel sera l'usage de cette fonction, donc je ferais mieux de me taire. :D
Sur le fond mathématiques tu as raison mais pour mon usage les 2 cas (CW et CCW) me suffisent. Si j'arrive à obtenir la figure finale que je veux (une succession de triangles rectangles et des 3 carrés attachés aux côtés) je le posterais et je verrais pour affiner.

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : lun. 24 avr. 2023, 19:15
par GM
J'ai cru voir passer la tentative suivante.
Je suis alerté des tentatives de codes sur le forum ! ;-)

J'ai mis size(100) et une couleur plus foncée pour que cela passe sur le forum.

Figure asymptote a21ccfe7e66c4b748dac307d694dbbf4
*** 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(100);
  3.  
  4. path TRH(pair a, pair b, bool direction=true){ // Construire un triangle rectangle par les 2 sommets de l'hypoténuse
  5. pair c=(a+b)/2; // milieu de l'hypoténuse
  6. path DC; /// demi-cercle
  7. if(direction==true){DC=arc(c,a,b);}// Sens de construction (in)direct
  8. else {DC=arc(c,a,b,CW);}
  9. pair d=relpoint(DC,0.3); // Le sommet de l'angle droit.
  10. return a--d--b--cycle;
  11. }
  12. path[] carres(path t){// Construire les carrés sur les trois côtés d'un triangle
  13. path[] carres;
  14. for(int i=0; i<3; ++i){
  15. carres.push(square(point(t,i+1),point(t,i))); // Rajoute chaque carré dans le tableau
  16. }
  17. return carres;
  18. }
  19. pair A=(0,0), B=(1,0), C=B+3dir(90);
  20. path t1=A--B--C--cycle;
  21.  
  22. fill(t1,grey);
  23. fill(TRH(point(carres(t1)[2],2),point(carres(t1)[2],3)),grey);
  24. fill(TRH(point(carres(t1)[0],2),point(carres(t1)[0],3)),grey);
  25. fill(TRH(point(carres(t1)[1],2),point(carres(t1)[1],3)),grey);

Re: Réutiliser une construction à l'extérieur d'un programme.

Posté : mar. 25 avr. 2023, 09:21
par malaka
Big brother is watching :lol:
J'arrive pas à poster d'image ni de code comme tu le fais dans ton message précédent :cry: :?: . Dommage ! Ma construction fonctionne et donne exactement ce que je voulais.
J'essaie de fignoler aujourd'hui pour le plaisir.