
Estoy tratando de dibujar elFoliación del arrecife. Hasta ahora tengo el código y la imagen a continuación. El problema es que una superficie sobresale ligeramente de la que está delante (a través de la superficie frontal). Deben encajarse cada uno completamente dentro del anterior, como maceteros curvos.
settings.outformat="pdf";
settings.prc=false;
settings.render=4;
import graph;
import graph3;
import three;
size(12cm,0);
real rcutoff=.8;
real rinner=1;
real router=2;
currentprojection=orthographic(1,-2,1);
currentlight=(1,-1,0.5);
real f(pair z) {return 1/(1-abs(z)^2);}
// We change variables so that the unit cylinder x^2+y^2<1 gets mapped to the torus.
triple changevariables(triple X)
{
return (
(router+rinner*X.x)*cos(X.z),
(router+rinner*X.x)*sin(X.z),
rinner*X.y
);
}
// g returns the location of a point on a ``paraboloid'' inside the unit cylinder with given angle and radius above the unit disk in the (x,y) plane.
triple g(pair p){
real x=p.x*cos(p.y), y=p.x*sin(p.y);
return (x,y,f((x,y)));
}
triple h(pair p){
return changevariables(g(p));
}
real anglestep=10;
for (int z = 0; z <= 20; ++z) {
draw(
rotate(-anglestep*z,Z)*surface(
h,
(0,0),
(rcutoff,2*pi),Spline
),lightgray+opacity(1)
);
// real zz=f((rcutoff,0));
// triple cent=changevariables((0,0,zz));
// draw(
// rotate(-anglestep,Z)*
// circle(c=cent, r=rcutoff,normal=(-router*sin(zz),router*cos(zz),0)),
// white
// );
}
Quizás el problema sea aún más claro si solo dibujo las dos superficies finales, en diferentes colores:
Respuesta1
Se debe únicamente a la aproximación numérica de su superficie con los parches de Bézier. Por defecto tienes 10 mallas (o 10x10). Dependiendo de tu PC podrás aumentar de forma independiente el número de mallas con respecto a las dos variables. Aquí probé las dos últimas superficies finales con
draw(
rotate(-anglestep*z,Z)*surface(
h,
(0,0),
(rcutoff,2*pi),nu=16,nv=10,Spline
),lightgreen+opacity(1)
);
y parece estar bien.