渐近线中的路径并集

渐近线中的路径并集

我正在尝试求渐近线中四个圆的并集:

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

在此处输入图片描述

相关内容