渐近线:画一个圆环,上面有 6 个孔

渐近线:画一个圆环,上面有 6 个孔

我正在使用 Asymptote 生成一个带有 6 个孔的圆环的 3D 图像。

我不知道如何将孔洞与表面融合。

我只能用圆柱体来近似它,因此交叉点非常粗糙。

有没有更好的方法?谢谢。

size(200);
import graph3;
real r1 = 1;
real r2 = 0.25;
real ri = 0.1;
bool allow(pair t) {
  return hypot(sin(t.x)*(r1+r2*cos(t.y)),r2*sin(t.y))>ri*0.8;
}
bool nearboundary(pair t) {
  return hypot(sin(t.x)*(r1+r2*cos(t.y)),r2*sin(t.y))<ri*1.2;
}
triple f(pair t) {
  real tx=t.x;
  if(t.x<0&&nearboundary(t+(pi/3/50,0))||t.x>0&&nearboundary(t-(pi/3/50,0))){
    real x0 = asin(sqrt(ri^2-(r2*sin(t.y))^2)/(r1+r2*cos(t.y)));
    if(t.x>=0){
      tx=x0;
    }else{
      tx=-x0;
    }
  }
  return (cos(tx),sin(tx),0)*(r1 + r2*cos(t.y))+ r2*(0,0,sin(t.y));
}
surface s1=surface(f,(-pi/6,0),(pi/6,2pi),50,50,Spline,allow);
material whitem =  material(diffusepen=white);
surface s=surface(s1,shift((r1-r2,0,0))*scale(2r2,ri,ri)*align(X)*unitcylinder);
draw(s,whitem,render(merge=true));
draw(rotate(60,Z)*s,whitem,render(merge=true));
draw(rotate(120,Z)*s,whitem,render(merge=true));
draw(rotate(180,Z)*s,whitem,render(merge=true));
draw(rotate(240,Z)*s,whitem,render(merge=true));
draw(rotate(300,Z)*s,whitem,render(merge=true));

在此处输入图片描述

相关内容