![在 Asymptote 中绘制具有抛物线边缘的 3D 填充三角形](https://linux22.com/image/354982/%E5%9C%A8%20Asymptote%20%E4%B8%AD%E7%BB%98%E5%88%B6%E5%85%B7%E6%9C%89%E6%8A%9B%E7%89%A9%E7%BA%BF%E8%BE%B9%E7%BC%98%E7%9A%84%203D%20%E5%A1%AB%E5%85%85%E4%B8%89%E8%A7%92%E5%BD%A2.png)
我需要绘制一个内部弯曲的填充 3D 三角形。我希望三角形内部有抛物线边缘和平滑的 NURBS 呈现,而不是小三角形的集合。我掌握的三角形信息是三个角和三个中边的 (x,y,z) 位置。任何建议都将不胜感激!
import three;
settings.render=8;
size(10cm);
currentprojection=perspective(50,80,50);
// Rational Bezier patch: // udegree=3, vdegree=3, nu=4, nv=4;
real[] uknot={0,0,0,0,1,1,1,1};
real[] vknot={0,0,0,0,1,1,1,1};
triple[][] P=scale3(20)*octant1.P;
// Optional weights:
real[][] weights=array(P.length,array(P[0].length,1.0));
write("P=");
write(P);
draw(P,uknot,vknot,weights,gray);
以上是我从网上找到并编辑的示例代码,生成了如下所示的图像。我打印了“P”变量数据,但我不明白它的含义。
P=
(20,0,0) (20,0,11.0456949966159) (11.0456949966159,0,20) (0,0,20)
(20,11.0456949966159,0) (20,11.0456949966159,11.0456949966159) (11.0456949966159,6.10036889791324,20) (0,0,20)
(11.0456949966159,20,0) (11.0456949966159,20,11.0456949966159) (6.10036889791324,11.0456949966159,20) (0,0,20)
(0,20,0) (0,20,11.0456949966159) (0,11.0456949966159,20) (0,0,20)
这些点是 Nurbs 曲面的控制点吗?我想要显示的问题是提供一个像该示例中那样的弯曲三角形,但我只需要使用三角形的角点和中边点。如能得到任何帮助,我将不胜感激!
谢谢,乔
答案1
定义triple[][] P
贝塞尔曲面片的控制点。对于您的问题,角点和中边点不足以定义唯一的贝塞尔曲面片。我尝试使用 Asymptote 例程回答,其精神与八分圆定义相同(请参阅three_surface.asy
)。使用path3
长度 =<4(并且没有任何内部点,可选)的 ,可以构造曲面。
这是一个尝试
import three;
settings.render=8;
size(10cm);
currentprojection=perspective(50,80,50);
triple A=(0,1,0);
triple B=(1,0,0);
triple MAB=(.6,.6,0); //mid-edge (AB)
triple C=(0,0,1);
triple MAC=(0,.6,.6); // mid-edge
triple MBC=(.7,0,.7); //mid-edge
path3 gc1=(A..MAB..B); //to avoid computation
path3 gc2=(B..MBC..C); // I use asymptote path3 routine
path3 gc3=(C..MAC..A);
// I recover the different tangents in A, B, C
// to construct a cycle-path3 of length 3.
path3 gc=point(gc1,0){dir(gc1,0)}..{dir(gc1,2)}point(gc1,2){dir(gc2,0)}
..{dir(gc2,2)}point(gc2,2){dir(gc3,0)}..{dir(gc3,2)}point(gc3,2)..cycle;
draw(surface(patch(gc)),lightgray);
draw(gc1^^gc2^^gc3);
dot((gc1^^gc2^^gc3),red);
请测试并改进代码。
奥格