मैं Asymptote में 2 चित्रों या अधिक के बीच कैसे आकर्षित कर सकता हूं?

Aug 18 2020

उदाहरण:

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

आउटपुट:

मुझे इसकी ही आवश्यकता थी:

मैं से लाइन कनेक्ट दो डॉट्स धराशायी आकर्षित कर सकते हैं pic1करने के लिए pic2, pic2करने के लिए pic3, ...?

जवाब

6 g.kov Aug 20 2020 at 01:03

शायद, transformउदाहरण के लिए, इस तरह ट्रैक करना और उपयोग करना अधिक सुविधाजनक होगा :

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

अपने प्रश्न और टिप्पणी के आधार पर, आप चित्रों को संदर्भित करके दो अलग-अलग चित्रों पर दो निर्देशांक के बीच एक रेखा खींचना चाहते हैं। मैं ऐसा करने के लिए एक सीधा रास्ता नहीं जानता, लेकिन शायद निम्नलिखित आपकी आवश्यकताओं के अनुरूप होगा।

मैं pic2 के ऑफसेट को एक जोड़ी के रूप में परिभाषित करता हूं। तब आप इस जोड़ी का उपयोग धराशायी लाइन समापन बिंदु को ऑफसेट करने के लिए भी कर सकते हैं।

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

याद रखें कि यह कार्य टीकज के साथ ड्राइंग में बहुत आसान है, दोनों बिंदुओं के लिए या nodeउनके सभी anchorबिंदुओं सहित । यदि वे वर्तमान चित्र के विभिन्न भागों में हैं, अर्थात् अलग-अलग हैं scope, तो बस इन नोड्स को कुछ नाम दें, कहें (A)और (B)। तब हम \draw (A)--(B);या उपयोग कर सकते हैं\draw (A.120)--(B.center);

Asymptote के लिए, @ g.kov का उत्तर pairविभिन्न चित्रों में बिंदुओं ( ) के लिए काम करता है । निम्नलिखित विभिन्न objectएस के सीमा बिंदुओं के लिए मेरा परीक्षण है । सिंटैक्स point(B,dir(45),t)हमें परिवर्तन की कार्रवाई के तहत, सीमा पर pairदिशा में एक देता है । कई चीजें उम्मीद के मुताबिक काम करती हैं। हालाँकि हमें अधिक परीक्षण करने की आवश्यकता है, जैसे,45object Bt

  1. unitsize(1cm) काम नहीं करता है, मुझे प्रत्येक कमांड में इकाइयों को निर्दिष्ट करना होगा;
  2. fill(circle(Y,2pt),red); // कुछ भी नहीं देखा
  3. dot(Y);// काम नहीं किया, गलत स्थिति 4. ड्रा (एक्स .. एक्स + डायर (45) और वाई + डायर (-50) को नियंत्रित करता है .. वाई, रेड, एरो); // एक कड़ी लाइन दे `कोड

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