Как я могу рисовать между 2 или более изображениями в Asymptote?

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

Напомним, что эта задача очень проста в рисовании с помощью TikZ, как для точек, так и для точек, nodeвключая все их anchorточки. Если они находятся в разных частях текущего изображения, то есть в разных scope, просто дайте этим узлам некоторые имена, скажем (A)и (B). Тогда мы можем использовать \draw (A)--(B);или\draw (A.120)--(B.center);

Для Asymptote ответ @ g.kov работает для точек ( pair) на разных изображениях. Ниже приведен мой тест для граничных точек разных objects. Синтаксис point(B,dir(45),t)дает нам pairнаправление 45на границе object Bпод действием преобразования t. Многие вещи работают, как ожидалось. Однако нам нужно проверить больше, например,

  1. unitsize(1cm) не работает, я должен указывать единицы в каждой команде;
  2. fill(circle(Y,2pt),red); // ничего не видел
  3. dot(Y);// не сработало, 4. отрисовка неправильной позиции (X .. управляет X + dir (45) и Y + dir (-50) .. Y, red, Arrow); // даем четкую строку `Код

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