Come posso disegnare tra 2 o più immagini in Asymptote?

Aug 18 2020

Esempio:

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)));

Produzione:

Questo è ciò di cui ho bisogno:

Posso tracciare una linea tratteggiata che collega due punti da pic1a pic2, pic2a pic3, ...?

Risposte

6 g.kov Aug 20 2020 at 01:03

Forse, sarebbe più conveniente tracciare e utilizzare transform, in questo modo, ad esempio:

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

Sulla base della tua domanda e del tuo commento, vuoi tracciare una linea tra due coordinate su due immagini diverse facendo riferimento alle immagini. Non conosco un modo diretto per farlo, ma forse quanto segue soddisferà le tue esigenze.

Definisco l'offset di pic2 come una coppia. Quindi puoi usare questa coppia per compensare anche il punto finale della linea tratteggiata.

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

Ricorda che questo compito è molto semplice nel disegnare con TikZ, sia per i punti che per nodei inclusi tutti i loro anchorpunti. Nel caso in cui si trovino in parti diverse dell'immagine corrente, cioè in diversi scope, basta dare a questi nodi dei nomi, diciamo (A)e (B). Quindi possiamo usare \draw (A)--(B);o\draw (A.120)--(B.center);

Per Asymptote, la risposta di @g.kov funziona per i punti ( pair) in diverse immagini. Quello che segue è il mio test per i punti di confine di diversi objects. La sintassi point(B,dir(45),t)ci dà un pairnella direzione 45sul confine di object B, sotto l'azione della trasformazione t. Molte cose funzionano come previsto. Tuttavia, dobbiamo testare di più, ad es.

  1. unitsize(1cm)non funziona, devo specificare le unità in ogni comando;
  2. fill(circle(Y,2pt),red);// ha visto qualcosa
  3. dot(Y);// non ha funzionato, posizione errata 4. draw(X .. controlla X+dir(45) e Y+dir(-50) .. Y,red,Arrow); //dà una riga dritta ` Il codice

//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));