En fait, cette demande est liée à mon message précédent portant sur les flèches.
La solution donnée par Gaëtan me convient très bien ; j'ai même presque compris le code. Il y a quand même la ligne donnant le point d'intersection (enfin la valeur réelle du paramètre correspondant au point d'intersection sur le chemin) qui reste mystérieuse.
Code : Tout sélectionner
real[] T=intersect(F.p,c--2*(m+realmult(rectify(dir),M-m))-c);
Je ne comprends pas le calcul du point "2*(m...)-c". En particulier la commande "rectify(dir)" que je ne trouve pas dans la doc d'asymptote (j'ai la version 2.15)
Bref, j'essaie d'ajouter des cercles au milieu des flèches, mais cela pourrait être des ellipses ou autre, et j'ai l'impression que je m'y prends mal. J'ai essayé d'utiliser un marker personnalisé (merci la gallerie) ou le marker prédéfini CircleBarIntervalMarker mais j'ai dû en faire une copie modifiée car cette routine trace le disque sans tracer le cercle indépendamment (c'est un constat, pas une critique).
Voici ma tentative. Ça me semble super lourd pour le résultat voulu. Est-ce qu'il serait plus malin de définir une nouvelle flèche ? Je n'ai jamais fait...
*** 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
- import markers;
- size(10cm);
- struct forme{
- path p;
- pair c;
- void operator init(path p, pair c=(0,0)){
- this.c=c;
- this.p=shift(-0.5*(min(p)+max(p)))*p;
- }
- void draw(picture pic=currentpicture,
- pen drawpen=currentpen+bp,
- pen fillpen=invisible,
- bool centreO=false){
- if(centreO){
- filldraw(pic, this.p, fillpen, drawpen);
- }else{
- filldraw(pic, shift(this.c)*this.p, fillpen, drawpen);
- }
- }
- }
- pair point(forme F, pair dir, transform t=identity())
- {
- pair m=min(F.p);
- pair M=max(F.p);
- pair c=0.5*(m+M);
- pair z=t*F.c;
- real[] T=intersect(F.p,c--2*(m+realmult(rectify(dir),M-m))-c);
- if(T.length == 0) return z;
- return z+t*point(F.p,T[0]);
- }
- frame circlebarframeBord(int n=1, real barsize=0,
- real radius=0,real angle=0,
- pair offset=0, pen p=currentpen,
- filltype filltype=NoFill, bool above=false)
- {
- if(barsize == 0) barsize=barmarksize(p);
- if(radius == 0) radius=circlemarkradius(p);
- frame opic;
- path g=circle(offset,radius);
- frame f=stickframe(n,barsize,space=2*radius/(n+1),angle,offset,p);
- if(above) {
- add(opic,f);
- filltype.fill(opic,g,p);
- draw(opic,g,p);
- } else {
- filltype.fill(opic,g,p);
- draw(opic,g,p);
- add(opic,f);
- }
- return opic;
- }
- marker CircleBarIntervalMarkerBord(int i=2, int n=1, real barsize=0, real radius=0,
- real angle=0, pair offset=0, bool rotated=true,
- pen p=currentpen, filltype filltype=NoFill,
- bool circleabove=false, frame uniform=newframe,
- bool above=true)
- {
- return marker(uniform,markinterval(i,circlebarframeBord(n,barsize,radius,angle,
- offset,p,filltype,
- circleabove),
- rotated),above);
- }
- pair Orig=(0,0);
- forme q=forme((0,0)--(3,0)--(2.5,1.5)--(0.5,1)--cycle,Orig);
- forme p=forme(slant(0.5)*yscale(1.5)*xscale(2)*unitsquare,shift(2E+3S)*Orig);
- q.draw();
- p.draw();
- marker cercle=CircleBarIntervalMarkerBord(i=1,
- n=0,
- barsize=0,
- radius=10,
- angle=0,
- offset=0,
- rotated=true,
- currentpen,
- Fill(white),
- circleabove=false,
- above=true);
- draw(point(q,S){S}..{S}point(p,N),Arrow,cercle);
Le but est d'avoir des labels vides, à compléter par les élèves.
Bon dimanche à tous !