Page 1 sur 1

Gestion des pointillés dans une figure 3D

Posté : jeu. 30 juil. 2020, 12:05
par Viserion
Bonjour,
Je pense que cette question a été abordée plusieurs fois mais ...
Dans le code ci-après, les droites (IJ) et (KI) doivent avoir une partie en traits pointillés : possible ou pas possible avec le module three ?
Comment "étendre" le segment [EF] pour plutôt avoir une "droite" ?
Merci.
Fabrice

Code : Tout sélectionner

import three;
import math;

size(5cm,0);
currentprojection=obliqueX;

defaultpen(fontsize(9pt));

triple A = (0,0,0), B = (0,4,0), C = (3,4,0), D = (-4,0,2);
triple I = interp(A,B,2/3);
triple J = interp(A,C,1/4);
triple K = interp(A,D,1/3);
triple F = interp(K,I,intersect(K,I,normal(new triple[]{B,C,D}),D));
triple Ep = interp(J,I,intersect(J,I,normal(new triple[]{B,C,D}),D));

draw(K--J,red);
draw(D--A--C--B--D--C);
draw(A--B,linetype("8 8"));
draw(K--F);
draw(J--Ep);
draw(Ep--F,heavygreen);

dot("$A$", A, blue, align=W);  dot("$B$", B, blue, align=S+E);
dot("$C$", C, blue, align=S);  dot("$D$", D, align=N);
dot("$K$", K, red, align=W+N);  dot("$J$", J, red, align=S);
dot("$I$", I, blue, align=N); dot("$F$", F, align=N+E);
dot("$E$", Ep, align=N);

Re: Gestion des pointillés dans une figure 3D

Posté : jeu. 30 juil. 2020, 13:13
par GM
Bonjour Fabrice,

avant de répondre à une question, j'essaie d'abord de comprendre ce qui m'est proposé.

J'ai donc essayé de comprendre ceci :

Code : Tout sélectionner

triple F = interp(K,I,intersect(K,I,normal(new triple[]{B,C,D}),D));
triple Ep = interp(J,I,intersect(J,I,normal(new triple[]{B,C,D}),D));
mais cela n'a pas été aussi immédiat que si tu m'avais proposé ce qui suit... et qui me semble plus simple à comprendre.

Code : Tout sélectionner

triple F = planeproject(B--C--D,K-I)*I; // projeté de I sur (BCD) parallèlement à (IK)
triple Ep = planeproject(B--C--D,J-I)*I; // projeté de I sur (BCD) parallèlement à (IJ)
Pour la question d'un segment dont une partie est cachée, voir du côté de project et invert : viewtopic.php?f=9&t=453.

Pour le prolongement d'un segment, tu peux utiliser interp avec un coefficient négatif (ou plus grand que 1) :

Code : Tout sélectionner

draw(interp(Ep,F,-0.2)--interp(Ep,F,1.2),heavygreen);
Si tu aspires à une réponse avec le code complet, tu devras attendre ce soir car je drois reprendre des travaux en cours avec un ami.

Re: Gestion des pointillés dans une figure 3D

Posté : jeu. 30 juil. 2020, 16:27
par GM
(suite)

Cela peut donner cela, avec peut-être l'occasion de définir (dans un ficher de configuration personnel) une fonction pointABCD telle que je l'ai définie dans le code ci-dessous.

Figure asymptote 55d75c687eee8d1f416040bd4f9f87b3
*** 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 three;
  2. import math;
  3.  
  4. size(5cm,0);
  5. currentprojection=obliqueX;
  6.  
  7. defaultpen(fontsize(9pt));
  8. pen style1 = linetype("4 4");
  9.  
  10. // Fonction qui renvoie le point (triple) de (AB) qui semble (vraiment ou faussement) sur (CD)
  11. triple pointABCD(triple A, triple B, triple C, triple D) {
  12. pair Xp = extension(project(A),project(B),project(C),project(D));
  13. return invert(Xp,A,B);
  14. }
  15.  
  16. triple A = (0,0,0), B = (0,4,0), C = (3,4,0), D = (-4,0,2);
  17. triple I = interp(A,B,2/3);
  18. triple J = interp(A,C,1/4);
  19. triple K = interp(A,D,1/3);
  20. triple F = planeproject(B--C--D,K-I)*I; // projeté de I sur (BCD) parallèlement à (IK)
  21. triple Ep = planeproject(B--C--D,J-I)*I; // projeté de I sur (BCD) parallèlement à (IJ)
  22. triple I1=pointABCD(K,I,B,C); // point de (KI) qui semble sur (BC) sans l'être
  23. triple I2=pointABCD(J,I,B,D); // point de (JI) qui semble sur (BD) sans l'être
  24.  
  25. draw(K--J,red);
  26. draw(D--A--C--B--D--C);
  27. draw(A--B,style1);
  28. draw(K--I1,style1);draw(I1--F);
  29. draw(J--I2,style1);draw(I2--Ep);
  30. draw(interp(Ep,F,-0.2)--interp(Ep,F,1.2),heavygreen);
  31.  
  32. dot("$A$", A, blue, align=W); dot("$B$", B, blue, align=SE);
  33. dot("$C$", C, blue, align=S); dot("$D$", D, align=N);
  34. dot("$K$", K, red, align=NW); dot("$J$", J, red, align=SW);
  35. dot("$I$", I, blue, align=N); dot("$F$", F, align=N+E);
  36. dot("$E$", Ep, align=NE);

Re: Gestion des pointillés dans une figure 3D

Posté : ven. 31 juil. 2020, 14:07
par Viserion
Bonjour Gaëtan;
Désolé pour la réponse tardive mais je pensais qu'il y avait une notification de réponse (comme auparavant, il me semble).
J'ai un peu délaissé Asymptote au profit de Metapost et TikZ, mais pour les dessins en "3 D", c'est mieux ...
J'ai donc fouillé dans la documentation officielle et la routine

Code : Tout sélectionner

triple F = interp(K, I, intersect(K, I, normal(new triple[]{B, C, D}), D));
m'a semblé la plus appropriée mais ta façon de faire est plus facile à comprendre, c’est vrai.
Merci beaucoup pour ton aide car Asymptote reste un outil très puissant et pas facile à maîtriser. J'ai encore une petite question : peut-on remplacer les points par des croix ?
Fabrice
Modifier | Retour | Copier

Re: Gestion des pointillés dans une figure 3D

Posté : ven. 31 juil. 2020, 20:51
par GM
Bonsoir,
Viserion a écrit :
ven. 31 juil. 2020, 14:07
Désolé pour la réponse tardive mais je pensais qu'il y avait une notification de réponse (comme auparavant, il me semble).
il y en avait et j'espère que la mise à jour du serveur (qui n'a pas été simple) n'a pas cassé certaines choses.

A voir aussi, s'il n'y a pas un paramètre mal réglé dans ton profil depuis que tu as recréé un compte.