这是一个示例 3D 几何。
dat=Import["ExampleData/747.3ds.gz", ImageSize -> Medium]
现在,如果想为这个 3D 几何获得 BSplineFunction,那么最简单的方法是什么?
我可以使用以下命令查看 Mathematica 中的部件。
parts = Length[(dat // First // Last)];
这里是提取后的 3D 点。
ListPointPlot3D[Flatten[Map[((dat // First // Last)[[#]] /.
GraphicsComplex[a_, b_] -> List[a]) &, Range[parts]], 1]]
我希望有一个通用的方法,这样我们就可以从任何 3D 图形复合体中形成一个 BSpline 函数。我想一般方法将能够将 Mathematica 3D 表示转换为连续 BSplines 表示。
现在我们将根据贝利撒留给出的例子进行详细说明。
v={{0,0,0},{2,0,0},{2,2,0},{0,2,0},{1,1,2}};
i={{1,2,5},{2,3,5},{3,4,5},{4,1,5}};
Graphics3D[{Opacity[.5],GraphicsComplex[v,Polygon[i]]}]
对于这个例子,我们可以简单地形成 BSpline 曲面的输入。
dat = Table[Map[v[[#]] &, i[[j]]], {j, 1, Length[i]}];
现在让我们看看如果我们考虑底层顶点出现的表面。
Show[
(* Vertices *)
ListPointPlot3D[v,PlotStyle->{{Black,PointSize[.03]}}],
(* The 3D solid *)
Graphics3D[{Opacity[.4],GraphicsComplex[v,Polygon[i]]}],
(* The BSpline surface *)
Graphics3D[{Opacity[.9],FaceForm[Red,Yellow],
BSplineSurface[dat, SplineDegree-> {1,2},SplineClosed->{True,False}]}
],
Boxed-> False,Axes-> None
]
一旦形成了这个表面,我认为可以以某种方式制作 BSplineFunction。但我得到的与上面的表面完全不同。
func = BSplineFunction[dat, SplineDegree -> {1, 2},SplineClosed -> {True, False}];
Plot3D[func[x, y], {x, 0, 1}, {y, 0, 1}, Mesh -> None,PlotRange -> All]
那么我在这里犯了一些概念上的错误吗?