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

산출:

이것이 내가 필요한 것입니다.

난에서 라인을 연결 두 개의 점을 점선 그릴 수 pic1pic2, pic2pic3, ...?

답변

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점을 포함하여 점 또는 s 모두에 대해 TikZ로 그리기가 매우 쉽다는 것을 상기하십시오 . 경우가있다 다른에서 현재 사진의 다른 부분에있는 scope, 바로 이러한 노드 몇 가지 이름을주고, 말을 (A)하고 (B). 그런 다음 \draw (A)--(B);또는\draw (A.120)--(B.center);

Asymptote의 경우 @ g.kov의 대답은 pair다른 그림의 점 ( )에 대해 작동합니다 . 다음은 다른 경계점에 대한 나의 테스트입니다 object. 구문 point(B,dir(45),t)은 우리에게 변환의 동작에 따라 의 경계 pair에 대한 방향 45을 제공합니다 . 많은 것들이 예상대로 작동합니다. 그러나 우리는 더 많은 테스트가 필요합니다.object Bt

  1. unitsize(1cm) 작동하지 않으면 각 명령에서 단위를 지정해야합니다.
  2. fill(circle(Y,2pt),red); // 아무것도 봤다
  3. dot(Y);// 작동하지 않음, 잘못된 위치 4. draw (X .. 제어 X + dir (45) 및 Y + dir (-50) .. Y, red, Arrow); // stright line`코드

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