我正在尝试求渐近线中四个圆的并集:
unitsize(1mm);
import graph;
pair o1 = (0, 0);
pair o2 = (10, 0);
pair o3 = (10, 10);
pair o4 = (0, 10);
path c1 = Circle(o1, 10);
path c2 = Circle(o2, 10);
path c3 = Circle(o3, 10);
path c4 = Circle(o4, 10);
draw(c1^^c2^^c3^^c4, black);
显然这不是正确的方法:
使用 inkscape 我可以得到想要的效果:
@g.kov 的回答部分解决了这个问题,但如果路径不是连续相交,那么buildcycle
将不起作用:
unitsize(1mm);
import graph;
pair o1 = (0, 0);
pair o2 = (10, 0);
pair o3 = (10, 10);
pair o4 = (0, 10);
path c1 = Circle(o1, 8);
path c2 = Circle(o2, 8);
path c3 = Circle(o3, 1);
path c4 = Circle(o4, 1);
guide[] gg=c1^^c2^^c3^^c4;
guide g=gg[0];
for(int i=1;i<gg.length;++i){
g=buildcycle(g,gg[i]);
}
draw(g,black);
这没有输出任何内容,而我想要的是这个(来自 inkscape 的输出):
我检查渐近线的原因是它是一种编程语言,并且当路径数量增加到更高阶时它会更加强大。
答案1
buildcycle
在这种情况下可以使用后续命令:
unitsize(1mm);
import graph;
pair o1 = (0, 0);
pair o2 = (10, 0);
pair o3 = (10, 10);
pair o4 = (0, 10);
path c1 = Circle(o1, 10);
path c2 = Circle(o2, 10);
path c3 = Circle(o3, 10);
path c4 = Circle(o4, 10);
guide[] gg=c1^^c2^^c3^^c4;
guide g=gg[0];
for(int i=1;i<gg.length;++i){
g=buildcycle(g,gg[i]);
}
filldraw(g,palegreen,deepblue);
编辑:
好吧,第二种情况比原来的情况稍微复杂一些。这个修改后的代码似乎在这种情况下有效:
unitsize(1mm);
import graph;
pair o1 = (0, 0);
pair o2 = (10, 0);
pair o3 = (10, 10);
pair o4 = (0, 10);
path c1 = Circle(o1, 8);
path c2 = Circle(o2, 8);
path c3 = Circle(o3, 1);
path c4 = Circle(o4, 1);
guide[] gg=c1^^c2^^c3^^c4;
int[] ind2del;
int j=0;
bool flag=true;
while(flag){
flag=false;
ind2del.delete();
for(int i=j+1;i<gg.length;++i){
if(intersect(gg[j],gg[i]).length>0){
gg[j]=buildcycle(gg[j],gg[i]);
ind2del.push(i);
flag=true;
}
}
for(int i=ind2del.length-1;i>=0;--i)gg.delete(ind2del[i]);
++j;
if(j<gg.length){
flag=true;
}else{
j=0;
}
}
filldraw(gg,palegreen,deepblue);