我正在使用 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));