Comment dessiner entre 2 images ou plus dans Asymptote ?

Aug 18 2020

Exemple:

unitsize(1cm);
defaultpen(linewidth(1bp));

picture pic1,pic2,pic3,pic4;

path bigbox=box((0,0),(4,4));
draw(pic1,Label("Input image",Relative(0.25/2)),bigbox);
draw(pic1,box((1,2),(2,3)),linetype(new real[] {4,4}));

filldraw(pic2,shift(2*(-.5,.5))*bigbox,white);
filldraw(pic2,shift(-.5,.5)*bigbox,white);
filldraw(pic2,bigbox,white);
label(pic2,Label(minipage("\centering Convolution \\ (feature maps)",3cm),Relative(0.25/2)),bigbox);
path dashedbox=box(((1,2)+(2,3))/2,(2,3));
draw(pic2,dashedbox,linetype(new real[] {4,4}));


path box1=box((1,1),(3,3));
filldraw(pic3,shift(2*(-.5,.5))*box1,white);
filldraw(pic3,shift(-.5,.5)*box1,white);
filldraw(pic3,box1,white);
label(pic3,Label("Maxpooling",Relative(0.25/2),9*RightSide),box1);

path cir=circle((3.5,0.5),0.5);
for(int i=6; i>=0;--i){ filldraw(pic4,shift(i*(-.5,.5))*cir,white); }
label(pic4,Label(minipage("\centering Fully- \\ connected \\ layer)",3cm),Relative(0.75),12*RightSide),shift(3*(-.5,.5))*cir);

add(pic1);
add(shift(6,0)*pic2);
add(shift(11,0)*pic3);
add(shift(15,0)*pic4);
shipout(bbox(2mm,Fill(white)));

Production:

C'est de quoi j'ai besoin:

Puis-je tracer une ligne pointillée reliant deux points de pic1à pic2, pic2à pic3, ... ?

Réponses

6 g.kov Aug 20 2020 at 01:03

Peut-être serait-il plus pratique de suivre et d'utiliser transform, comme ceci, par exemple :

settings.outformat="pdf";
size(9cm);
picture pic;

guide gc=scale(sqrt(2),1)*unitcircle;
guide gc1=shift(-1/sqrt(2),0)*scale(1/sqrt(2))*unitcircle;
guide gc2=shift( 1/sqrt(2),0)*scale(1/sqrt(2))*unitcircle;

pair A=(-1/sqrt(2),0);
pair B=( 1/sqrt(2),0);

filldraw(pic,gc ,orange,   darkblue+0.7bp);
filldraw(pic,gc1,lightred, red+     0.7bp);
filldraw(pic,gc2,lightblue,blue+    0.7bp);

transform[] tr={
  identity(),
  shift(3,2)*rotate(42),
  shift(3,-2)*rotate(242)
};

for(var rel: tr) add(rel*pic);

draw(tr[0]*B--tr[2]*B,blue+0.7*bp);
draw(tr[1]*A--tr[2]*A,red+0.7*bp);

for(var rel: tr){
  dot(rel*(A--B),UnFill);
  label("$A$",rel*A,plain.NE);
  label("$B$",rel*B,plain.NE);
}

3 James Aug 18 2020 at 20:38

Sur la base de votre question et de votre commentaire, vous souhaitez tracer une ligne entre deux coordonnées sur deux images différentes en référençant les images. Je ne connais pas de moyen direct de le faire, mais peut-être que ce qui suit répondra à vos besoins.

Je définis le décalage de pic2 comme une paire. Ensuite, vous pouvez utiliser cette paire pour également décaler l'extrémité de la ligne pointillée.

unitsize(1cm);
picture pic1,pic2;

draw(pic1,(0,0)--(3,3),Arrow);
dot(pic1,(1.5,1.5));
draw(pic2,(0,3)--(3,0),Arrow);
dot(pic2,(1.5,1.5));

pair pic2offset = (5,0);

add(pic1);
add(shift(pic2offset)*pic2);

draw((1.5,1.5)--pic2offset+(1.5,1.5),black+dashed);

shipout(bbox(2mm,Fill(white)));
1 BlackMild Feb 01 2021 at 23:36

Rappelons que cette tâche est très facile en dessin avec TikZ, aussi bien pour des points ou nodedes s comprenant tous leurs anchorpoints. S'ils se trouvent dans différentes parties de l'image actuelle, c'est-à-dire dans différents scope, donnez simplement à ces nœuds des noms, disons (A)et (B). Ensuite, nous pouvons utiliser \draw (A)--(B);ou\draw (A.120)--(B.center);

Pour Asymptote, la réponse de @g.kov fonctionne pour les points ( pair) dans différentes images. Voici mon test pour les points limites de différents objects. La syntaxe point(B,dir(45),t)nous donne un pairdans le sens 45sur la frontière de object B, sous l'action de la transformée t. Beaucoup de choses fonctionnent comme prévu. Cependant, nous devons tester davantage, par exemple,

  1. unitsize(1cm)ne fonctionne pas, je dois spécifier des unités dans chaque commande ;
  2. fill(circle(Y,2pt),red);// n'a rien vu
  3. dot(Y);// n'a pas fonctionné, mauvaise position 4. draw(X .. contrôle X+dir(45) et Y+dir(-50) .. Y,red,Arrow); //donne une ligne droite ` Le code

//unitsize(1cm);   // did not work, quite annoying
filldraw(circle((0,0),2.5cm),lightgray);
object A=draw("$A$",box,(-1cm,-1cm),xmargin=5mm,FillDraw(yellow,blue));
pair X=point(A,dir(120));
dot(X);

transform t=shift(4cm,-1cm);

picture pic;
filldraw(pic,box((0,0),(3cm,3.5cm)),pink);
object B=draw(pic,"$B$",ellipse,(2cm,2.5cm),xmargin=3mm,FillDraw(white,blue));
pair Y=point(B,dir(45),t);
fill(circle(Y,2pt),red);  // did not work
dot(Y);                      // did not work

add(t*pic);
draw(X {N} .. {S}Y,red,Arrow);
draw(X --Y,Arrow(TeXHead));

//draw(X .. controls X+dir(45) and Y+dir(-50) .. Y,red,Arrow); // <<< did not work! I don't know why

shipout(bbox(5mm,invisible));