Вот пример трехмерной геометрии.
dat=Import["ExampleData/747.3ds.gz", ImageSize -> Medium]
Теперь, если кто-то хочет получить функцию BSplineFunction для этой трехмерной геометрии, какой самый простой способ сделать это?
Я вижучасти в Mathematica, используя следующую команду.
parts = Length[(dat // First // Last)];
и вот идут 3D-точки после извлечения.
ListPointPlot3D[Flatten[Map[((dat // First // Last)[[#]] /.
GraphicsComplex[a_, b_] -> List[a]) &, Range[parts]], 1]]
Я надеюсь, что есть общий метод, чтобы мы могли сформировать функцию BSplineиз любого комплекса трехмерной графики.Полагаю, что общий метод сможет преобразовывать трехмерные представления Mathematica в непрерывное представление 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]
Итак, я делаю здесь некоторую концептуальную ошибку?