Asymptote'da 2 veya daha fazla resim arasında nasıl çizim yapabilirim?

Aug 18 2020

Misal:

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

Çıktı:

İhtiyacım olan şey bu:

Ben gelen hat bağlantı iki nokta kesik çizebilirsiniz pic1için pic2, pic2için pic3, ...?

Yanıtlar

6 g.kov Aug 20 2020 at 01:03

Belki de şu şekilde izlemek ve kullanmak daha uygun olacaktır transform, örneğin:

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

Sorunuza ve yorumunuza göre, resimleri referans alarak iki farklı resim üzerinde iki koordinat arasına bir çizgi çekmek istiyorsunuz. Bunu yapmanın doğrudan bir yolunu bilmiyorum, ancak belki aşağıdakiler ihtiyaçlarınızı karşılayabilir.

Pic2 ofsetini bir çift olarak tanımlıyorum. Daha sonra bu çifti kesikli çizgi uç noktasını kaydırmak için de kullanabilirsiniz.

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

Bu görevin TikZ ile çizim yapmanın hem puanlar hem nodede tüm anchornoktaları dahil olmak üzere çok kolay olduğunu hatırlayın . Mevcut resmin farklı bölümlerinde olmaları, yani farklı olmaları durumunda scope, bu düğümlere bazı isimler verin, örneğin (A)ve (B). O zaman kullanabiliriz \draw (A)--(B);veya\draw (A.120)--(B.center);

Asymptote için, @ g.kov cevabı pairfarklı resimlerdeki noktalar ( ) için işe yarar . Aşağıdaki, farklı ebatların sınır noktaları için testimdir object. Sözdizimi point(B,dir(45),t)bize dönüşümün eylemi altında , sınırındaki pairyönde bir verir . Pek çok şey beklendiği gibi çalışıyor. Ancak daha fazlasını test etmemiz gerekiyor, örneğin45object Bt

  1. unitsize(1cm) çalışmıyor, her komutta birimleri belirtmem gerekiyor;
  2. fill(circle(Y,2pt),red); // bir şey gördün mü
  3. dot(Y);// çalışmadı, yanlış pozisyon 4. çizimi (X .. kontrol X + dir (45) ve Y + dir (-50) .. Y, kırmızı, Ok); // düz bir satır verin `Kod

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