渐近线:如何 shift() * 一对 [][]?

渐近线:如何 shift() * 一对 [][]?

我正在尝试在 Asympote 中制作一个(小型)网络图。我不想使用 dot()。我绘制单位圆,并为每个单位圆跟踪它们的基点,我将其用作边的端口。

size(10cm,5cm);
int strech =5;
pair vrtl = (0,2)*strech;
pair hrzl = (2,0)*strech;

path uc = unitcircle ;
pair ucp[] = {};  // unit circle ports
int k=4;
for (int i : sequence(k)) { ucp.push(relpoint(uc,i/k));};  

pair c1p[] = shift(vrtl)*ucp;  // ports for a circle above the uc
pair c2p[] = shift(vrtl*2)*ucp;  // ports for a circle above the previous one
pair Xp[][] = {ucp, c1p, c2p};  // packing 
Xp.append(shift(hrzl)*Xp);  // <- this is where I have a compilation problem

我正在考虑覆盖 shift()* 运算符,但我不知道该怎么做。

答案1

如您所见,错误消息如下:

op.asy: 14.22: no matching function 'operator *(transform, pair[][])'

因此,您只需添加函数

pair[][] operator *(transform tr, pair[][] a){
    return map(new pair[](pair[] p){return tr*p;},a);
}

那么所有transform操作(如shiftrotate或任何自定义转换)将像往常一样使用pair[][]参数。

答案2

似乎shift不能pair[][]作为参数。您可以自己制作这样的函数。使用map例程可能的代码是

pair[] sh( pair[] a)
 {
 return shift(hrzl)*a;
 }
map (sh, Xp);
Xp.append(map(sh,Xp)); 

或者以紧凑的方式

Xp.append(map(new pair[] (pair[] a ){return shift(hrzl)*a;},Xp));

奥格

相关内容