Come posso disegnare tra 2 o più immagini in Asymptote?
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 pic1
a pic2
, pic2
a pic3
, ...?
Risposte
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);
}

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)));
Ricorda che questo compito è molto semplice nel disegnare con TikZ, sia per i punti che per node
i inclusi tutti i loro anchor
punti. 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 object
s. La sintassi point(B,dir(45),t)
ci dà un pair
nella direzione 45
sul confine di object
B
, sotto l'azione della trasformazione t
. Molte cose funzionano come previsto. Tuttavia, dobbiamo testare di più, ad es.
unitsize(1cm)
non funziona, devo specificare le unità in ogni comando;fill(circle(Y,2pt),red);
// ha visto qualcosadot(Y);
// non ha funzionato, posizione errata4.
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));