Bagaimana cara menggambar antara 2 gambar atau lebih di Asymptote?

Aug 18 2020

Contoh:

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

Keluaran:

Inilah yang saya butuhkan:

Dapatkah saya menggambar garis putus-putus menghubungkan dua titik dari pic1ke pic2, pic2ke pic3, ...?

Jawaban

6 g.kov Aug 20 2020 at 01:03

Mungkin, akan lebih nyaman untuk melacak dan menggunakan transform, seperti ini, misalnya:

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

Berdasarkan pertanyaan dan komentar Anda, Anda ingin membuat garis di antara dua koordinat pada dua gambar berbeda dengan merujuk gambar tersebut. Saya tidak tahu cara langsung untuk melakukan ini, tetapi mungkin yang berikut ini akan sesuai dengan kebutuhan Anda.

Saya mendefinisikan offset pic2 sebagai pasangan. Kemudian Anda dapat menggunakan pasangan ini untuk juga mengimbangi titik akhir garis putus-putus.

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

Ingatlah bahwa tugas ini sangat mudah dalam menggambar dengan TikZ, baik untuk poin atau nodetermasuk semua anchorpoinnya. Jika mereka berada di bagian yang berbeda dari gambar saat ini, yaitu, di tempat yang berbeda scope, berikan beberapa nama pada simpul ini, katakan (A)dan (B). Lalu kita bisa menggunakan \draw (A)--(B);atau\draw (A.120)--(B.center);

Untuk Asymptote, jawaban dari @ g.kov berfungsi untuk poin ( pair) dalam gambar yang berbeda. Berikut ini adalah tes saya untuk titik batas objects yang berbeda . Sintaksnya point(B,dir(45),t)memberi kita pairarah 45pada batas object B, di bawah aksi transformasi t. Banyak hal berjalan sesuai harapan. Namun kami perlu menguji lebih banyak, misalnya,

  1. unitsize(1cm) tidak berfungsi, saya harus menentukan unit di setiap perintah;
  2. fill(circle(Y,2pt),red); // memang melihat sesuatu
  3. dot(Y);// tidak bekerja, salah posisi 4. menggambar (X .. mengontrol X + dir (45) dan Y + dir (-50) .. Y, merah, Panah); // beri garis lurus `Kode

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