我正在尝试在 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
操作(如shift
,rotate
或任何自定义转换)将像往常一样使用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));
奥格