BSplineSurface[{{p1,p2,…},…}]
制御点 piを持つ,不均一有理Bスプライン曲面を表す.
BSplineSurface
BSplineSurface[{{p1,p2,…},…}]
制御点 piを持つ,不均一有理Bスプライン曲面を表す.
詳細とオプション
- BSplineSurfaceは,基底スプライン曲面および不均一有理Bスプライン(NURBS)曲面としても知られている.
- BSplineSurface は通常,コンピュータ支援設計(CAD)およびコンピュータグラフィックスにおいて自由形状の曲面をモデル化するために用いられる.
- 制御点 piは,{x,y,z}のような通常の3次元座標である.
- BSplineSurfaceは幾何学領域およびグラフィックスプリミティブとして使用できる.
- グラフィックにおいて,点 piは Scaled式およびDynamic式とすることができる.
- グラフィックスの描画は,FaceForm,EdgeForm,Texture,Specularity,Opacityや色等の指示子の影響を受ける.
- FaceForm[front,back]は,3Dにおける曲面の表面と裏面に対して異なるスタイルを指定するために使用できる.
- 使用可能なオプション
-
SplineDegree Automatic 多項式基底の次数 SplineKnots Automatic 各次元の結び目の列 SplineWeights Automatic 制御点の重み SplineClosed False 曲面を閉じるかどうか - デフォルトで,BSplineSurfaceは次数
に当たる双三次スプラインを用いる. - オプションSplineDegree->d は各方向に最大次数 d を指定する.SplineDegree->{d1,d2}は曲面上の2つの方向に異なる最大次数を指定する.
- デフォルトで,ノットは一様になり曲面が配列の端で制御点に達するように選ばれる.
- SplineKnots->{list1,list2}は制御点の配列の行と列に使う結び目の列を指定する.
- SplineKnotsの明示的な設定では,多項式基底の次数は指定された結び目と制御点の数で決定される.
- SplineWeightsは,多項式Bスプライン曲面に対応するように,自動的に1になるように選ばれる.
例題
すべて開く すべて閉じる例 (3)
Graphics3D[BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}]]reg = BSplineSurface[IconizedObject[«[image]»]];Area[reg]RegionBounds[reg]Graphics3D[{MaterialShading["Gold"], BSplineSurface[IconizedObject[«[image]»]]}, ...]スコープ (26)
基本的な用法 (5)
Graphics3D[BSplineSurface[{{{0, 0, 0}, {2, 0, 0}}, {{0, 1, 0}, {2, 1, 0}}}]]Graphics3D[BSplineSurface[IconizedObject[«[image]»]]]Graphics3D[BSplineSurface[IconizedObject[«[image]»]]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {False, True}]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {False, True}]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {True, True}]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {False, True}]]Graphics3D /@ {BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {True, False}], BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {True, False}]}BSplineSurfaceは位相円板を表すことができる:
Graphics3D[BSplineSurface[IconizedObject[«[image]»]]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {True, False}]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {False, True}]]Graphics3D[BSplineSurface[IconizedObject[«[image]»], SplineClosed -> True]]BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}]指定 (3)
双二次Bスプラインパッチは,3×3の制御点配列を必要とする:
Graphics3D[BSplineSurface[(| | | |
| --------- | --------- | --------- |
| {0, 0, 0} | {0, 4, 4} | {0, 8, 3} |
| {4, 0, 4} | {4, 4, 0} | {4, 8, 0} |
| {8, 0, 1} | {8, 4, 0} | {8, 8, 3} |)]]双三次Bスプラインパッチは,4×4の制御点の配列を必要とする:
Graphics3D[BSplineSurface[(| | | | |
| --------- | --------- | --------- | --------- |
| {0, 0, 0} | {3, 0, 2} | {5, 0, 2} | {8, 0, 1} |
| {0, 3, 2} | {3, 3, 2} | {5, 3, 1} | {8, 3, 1} |
| {0, 5, 3} | {3, 5, 2} | {5, 5, 1} | {8, 5, 1} |
| {0, 8, 3} | {3, 8, 2} | {5, 8, 2} | {8, 8, 3} |)]]一般に,単純な d 次Bスプラインパッチは,(d-1)×(d-1)の制御点配列を必要とする:
pts = (| | | | | |
| --------- | --------- | --------- | --------- | --------- |
| {0, 0, 0} | {1, 0, 1} | {2, 0, 0} | {3, 0, 1} | {4, 0, 0} |
| {0, 1, 1} | {1, 1, 2} | {2, 1, 1} | {3, 1, 2} | {4, 1, 1} |
| {0, 2, 0} | {1, 2, 1} | {2, 2, 0} | {3, 2, 1} | {4, 2, 0} |
| {0, 3, 1} | {1, 3, 2} | {2, 3, 1} | {3, 3, 2} | {4, 3, 1} |
| {0, 4, 0} | {1, 4, 1} | {2, 4, 0} | {3, 4, 1} | {4, 4, 0} |);deg = Take[Dimensions[pts], 2] - 1;BSplineSurface[pts, SplineDegree -> deg]Graphics3D[%]BSplineSurface[Take[pts, 1 ;; 3, 1 ;; 3], SplineDegree -> deg]Graphics3D[%]Graphics3D[{BSplineSurface[IconizedObject[«[image]»]]}]Graphics3D[{BSplineSurface[IconizedObject[«[image]»], SplineClosed -> True]}]Graphics3D[{BSplineSurface[IconizedObject[«[image]»], SplineClosed -> #]}]& /@ {{True, False}, {False, True}}グラフィックス (12)
Table[Graphics3D[{c, BSplineSurface[IconizedObject[«[image]»]]}], {c, {RGBColor[0.93, 0.27, 0.27], RGBColor[0.14, 0.8, 0.14], RGBColor[0.4, 0.6, 1]}}]FaceFormを使って曲面の表と裏に異なる特性が指定できる:
Graphics3D[{FaceForm[RGBColor[0.93, 0.27, 0.27], RGBColor[0.14, 0.8, 0.14]], BSplineSurface[IconizedObject[«[image]»]]}]EdgeFormを使って曲面の境界辺のスタイルが指定できる:
Graphics3D[{EdgeForm[{Red, Thick, Dashed}], BSplineSurface[IconizedObject[«[image]»]]}]Table[Graphics3D[{EdgeForm[{StandardYellow, Thick}], BSplineSurface[IconizedObject[«[image]»], SplineClosed -> closed]}, Lighting -> "Accent"], {closed, {False, True}}]Table[Graphics3D[{Black, Specularity[White, n], BSplineSurface[IconizedObject[«[image]»]]}, Lighting -> "Accent"], {n, {5, 20, 100}}]Opacityは表面の透過性を指定する:
Table[Graphics3D[{Opacity[o], BSplineSurface[IconizedObject[«[image]»]]}], {o, {0.1, 0.5, 0.9}}]Table[Graphics3D[{Glow[c], BSplineSurface[IconizedObject[«[image]»]]}, Lighting -> None], {c, {RGBColor[0.93, 0.27, 0.27], RGBColor[0.14, 0.8, 0.14], RGBColor[0.4, 0.6, 1]}}]これをLightingと一緒に使って微妙な陰影を作成する:
Table[Graphics3D[{Glow[glow], GrayLevel[0.4], BSplineSurface[IconizedObject[«[image]»]]}, Lighting -> "Accent"], {glow, {RGBColor[0.93, 0.27, 0.27], RGBColor[0.14, 0.8, 0.14], RGBColor[0.4, 0.6, 1]}}]Textureを曲面に適用する:
Graphics3D[{Texture[[image]], BSplineSurface[IconizedObject[«[image]»]]}, Lighting -> "Neutral"]Table[Graphics3D[{s, BSplineSurface[IconizedObject[«[image]»]]}, Lighting -> "Accent"], {s, {StippleShading[0.6], ToonShading[Red], GoochShading[]}}]物理ベースの材料を用いた表面の描画には,MaterialShadingを使用する:
Table[Graphics3D[{MaterialShading[mat], BSplineSurface[IconizedObject[«[image]»]]}, Lighting -> "ThreePoint"], {mat, {"Gold", "Satin", "Velvet"}}]BSplineSurfaceはGraphicsComplexで使うことができる:
Graphics3D[{GraphicsComplex[{{0, 0, 0}, {0, 10, 12}, {0, 20, 9}, {10, 0, 12}, {10, 10, 0}, {10, 20, 0}, {20, 0, 3}, {20, 10, 0}, {20, 20, 9}}, BSplineSurface[{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}]]}]pts = IconizedObject[«[image]»];Table[Graphics3D[{BezierSurface[pts]}, PlotRange -> {{0, pr}, {0, pr}, {0, pr}}], {pr, {1, 2, 4}}]Scaledを使って制御点をPlotRangeと相対的に指定する:
scaled = Map[Scaled, pts, {2}];Table[Graphics3D[{BezierSurface[scaled]}, PlotRange -> {{0, pr}, {0, pr}, {0, pr}}], {pr, {1, 2, 4}}]座標はDynamicでよい:
DynamicModule[{z = 0, pts},
pts = {{Dynamic[{0, 0, z}], {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}};
{Slider[Dynamic[z], {0, 4}], Graphics3D[{BSplineSurface[pts]}]}]領域 (6)
reg = BSplineSurface[{{{Indexed[a, {1}], Indexed[a, {2}], Indexed[a, {3}]}, {Indexed[a, {4}], Indexed[a, {5}], Indexed[a, {6}]}, {Indexed[a, {7}], Indexed[a, {8}], Indexed[a, {9}]}}, {{Indexed[b, {1}], Indexed[b, {2}], Indexed[b, {3}]}, {Indexed[b, {4}], Indexed[b, {5}], Indexed[b, {6}]}, {Indexed[b, {7}], Indexed[b, {8}], Indexed[b, {9}]}}, {{Indexed[c, {1}], Indexed[c, {2}], Indexed[c, {3}]}, {Indexed[c, {4}], Indexed[c, {5}], Indexed[c, {6}]}, {Indexed[c, {7}], Indexed[c, {8}], Indexed[c, {9}]}}}];RegionEmbeddingDimension[reg]RegionDimension[reg]reg = BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}];{RegionMember[reg, {0, 0, 0}], RegionMember[reg, {1, 2, 3}]}reg = BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}];{Area[reg], RegionMeasure[reg]}c = RegionCentroid[reg]Show[Region[reg], Graphics3D[{Black, Point[c]}]]reg = BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}];{RegionDistance[reg, {0, 0, 0}], RegionDistance[reg, {1, 1, 0}]}Show[Region[reg], ContourPlot3D[Evaluate@RegionDistance[reg, {x, y, z}], {x, 0, 8}, {y, 0, 8}, {z, -4, 8}, Contours -> {1, 2, 3, 4}, ...], Boxed -> True, Axes -> True]reg = BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}];{SignedRegionDistance[reg, {0, 0, 0}], SignedRegionDistance[reg, {1, 1, 0}]}reg = BSplineSurface[{{{0, 0, 0}, {0, 4, 4}, {0, 8, 3}}, {{4, 0, 4}, {4, 4, 0}, {4, 8, 0}}, {{8, 0, 1}, {8, 4, 0}, {8, 8, 3}}}];BoundedRegionQ[reg]bb = CoordinateBoundingBox[reg]Show[Region[reg], Graphics3D[{Opacity[0.1], EdgeForm[Dashed], AmbientLight[White], Cuboid@@bb}]]オプション (7)
SplineDegree (2)
デフォルトで,4×4以上の制御点を持つBSplineSurfaceは次数3を使う:
pts = Table[{i, j, (-1) ^ (i * j)}, {i, 7}, {j, 7}];{BSplineSurface[Take[pts, 4, 4]], BSplineSurface[Take[pts, 7, 7]]}{BSplineSurface[Take[pts, 2, 2]], BSplineSurface[Take[pts, 3, 3]]}SplineDegreeを使ってより低い次数を使うように指定する:
BSplineSurface[pts, SplineDegree -> 1]BSplineSurface[pts, SplineDegree -> 6]pts = Table[{i, j, (-1) ^ (i * j)}, {i, 9}, {j, 9}];Region[BSplineSurface[pts, SplineDegree -> #]]& /@ {2, {2, 8}, {8, 2}}SplineKnots (3)
デフォルトで,結び目は曲面が全体的に滑らかになるように生成される:
pts = IconizedObject[«[image]»];Graphics3D[{BSplineSurface[pts]}, Boxed -> False]knots = {{0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2}, {0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2}};Graphics3D[{BSplineSurface[pts, SplineKnots -> knots]}, Boxed -> False]"Clamped"は曲面が制御点を補間するように結び目を生成する:
pts = IconizedObject[«[image]»];Graphics3D[{BSplineSurface[pts, SplineKnots -> "Clamped"], {...}}, Boxed -> False]d 次曲面の場合,これは最初と最後の結び目の値が d+1回繰り返されることに相当する:
knots = {{0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4}, {0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4}};Graphics3D[{BSplineSurface[pts, SplineKnots -> knots], {...}}, Boxed -> False]"Unclamped"は,曲線がコーナーの制御点を補間しないような一様結び目を生成する:
pts = IconizedObject[«[image]»];Graphics3D[{BSplineSurface[pts, SplineKnots -> "Unclamped"], {...}}, Boxed -> False]n×n 個の制御点を持つ d 次曲面の場合,これは長さ n+d+1の連続する列に対応する:
knots = {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}};Graphics3D[{BSplineSurface[pts, SplineKnots -> knots], {...}}, Boxed -> False]SplineWeights (1)
pts = IconizedObject[«[image]»];Graphics3D[{BSplineSurface[pts, SplineWeights -> #]}, Boxed -> False]& /@ {Automatic, ConstantArray[1, Take[Dimensions[pts], 2]]}weights1 = Table[{1, 0, 0, 1}, 4];weights2 = Table[{1, 10, 10, 1}, 4];Graphics3D[{BSplineSurface[pts, SplineWeights -> #]}, Boxed -> False]& /@ {weights1, weights2}SplineClosed (1)
pts = IconizedObject[«[image]»];Graphics3D[{BSplineSurface[pts]}]Graphics3D /@ {BSplineSurface[pts, SplineClosed -> {True, False}], BSplineSurface[pts, SplineClosed -> {False, True}]}Graphics3D[{BSplineSurface[pts, SplineClosed -> True]}]アプリケーション (4)
モデリング (3)
pts = IconizedObject[«[image]»];Graphics3D[{Map[Line, Join[pts, Transpose[pts]]], Point[Join@@pts]}, Boxed -> False]このケージを結び目および重みと一緒に使ってパイプのBスプライン曲面を指定する:
weights = ConstantArray[{1, 1 / 2, 1 / 2, 1, 1 / 2, 1 / 2, 1}, 6];
uknots = {0, 0, 0, 1 / 4, 1 / 2, 3 / 4, 1, 1, 1};
vknots = {0, 0, 0, 1 / 4, 1 / 2, 1 / 2, 3 / 4, 1, 1, 1};surface = BSplineSurface[pts, SplineKnots -> {uknots, vknots}, SplineDegree -> 2, SplineWeights -> weights, SplineClosed -> {False, True}]Graphics3D[{
FaceForm[MaterialShading["Copper"], MaterialShading["Rubber"]],
surface}, Boxed -> False, Lighting -> "ThreePoint"]Graphics3D[{MaterialShading["Pewter"], BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {True, False}]}, ...]Graphics3D[{MaterialShading["Gold"], BSplineSurface[IconizedObject[«[image]»], SplineClosed -> {True, False}]}, ...]補間 (1)
data = BlockRandom[Table[{i, j, RandomReal[4]}, {i, 8}, {j, 8}], RandomSeeding -> 30];Graphics3D[{FaceForm[{RGBColor[0.880722, 0.611041, 0.142051], Specularity[GrayLevel[1], 3]}], BSplineSurface[data, SplineDegree -> 2]}, ...]SplineDegreeを上げるとノイズの多いデータがより滑らかにフィットされる:
Graphics3D[{FaceForm[{RGBColor[0.880722, 0.611041, 0.142051], Specularity[GrayLevel[1], 3]}], BSplineSurface[data, SplineDegree -> #]}, ...]& /@ {2, 4, 6}特性と関係 (11)
1次の単純なBSplineSurfaceはPolygonに等しい:
pts = {{{0, 0, 1}, {2, 0, 0}}, {{0, 2, 2}, {2, 2, 1}}};Graphics3D /@ {BSplineSurface[pts], Polygon[Join[First[pts], Reverse[Last[pts]]]]}BezierSurfaceはBSplineSurfaceの特殊ケースである:
Graphics3D /@ {BezierSurface[IconizedObject[«[image]»]], BSplineSurface[IconizedObject[«[image]»]]}d 次のベジエパッチからなる合成BezierSurfaceは,単一のd 次BSplineSurfaceと特定のSplineKnotsで表すことができる:
knots = {{0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2}, {0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2}};Graphics3D /@ {BezierSurface[IconizedObject[«[image]»]], BSplineSurface[IconizedObject[«[image]»], SplineKnots -> knots]}RegionConvertを使って任意のBezierSurfaceを同等のBSplineSurfaceに変換する:
bezier = BezierSurface[IconizedObject[«[image]»]];
bspline = RegionConvert[bezier, "Spline"];Graphics3D /@ {bezier, bspline}BSplineCurveは,制御点のリストを取るBSplineSurfaceの低次元の形式である:
pts = {{-3, 0}, {6, 5}, {-6, -5}, {3, 0}};Graphics[BSplineCurve[pts]]BSplineSurfaceの境界辺は4本のBスプライン曲線から形成される:
pts = IconizedObject[«[image]»];bc = Map[BSplineCurve, {pts[[1]], pts[[-1]], pts[[All, 1]], pts[[All, -1]]}];Graphics3D[{BSplineSurface[pts], Thick, StandardRed, bc}]BSplineSurface上のアイソパラメトリック曲線はすべて,有効なBスプライン曲線である:
uc = Table[BSplineCurve[Map[#[u]&, Map[BSplineFunction, pts]]], {u, 0, 1, 1 / 5}];
vc = Table[BSplineCurve[Map[#[v]&, Map[BSplineFunction, Transpose[pts]]]], {v, 0, 1, 1 / 5}];Graphics3D[{BSplineSurface[pts], Thick, RGBColor[0.14, 0.8, 0.14], uc, RGBColor[0.4, 0.6, 1], vc}]Bスプライン曲面パッチは,そのコーナーにある4つの制御点を常に補間する:
pts = IconizedObject[«[image]»];
corners = {pts[[1, 1]], pts[[-1, 1]], pts[[-1, -1]], pts[[1, -1]]};RegionMember[BSplineSurface[pts], corners]Graphics3D[{BSplineSurface[pts], Red, PointSize[Medium], Point[corners]}]opts = Complement[Join@@pts, corners];RegionMember[BSplineSurface[pts], opts]//Counts3Dに埋め込まれたDiskは同等のBSplineSurfaceとして表すことができる:
pts = IconizedObject[«[image]»];knots = {{0, 0, 0, 1, 1, 2}, {0, 0, 0, 1, 1, 2}};weights = {{1, (1/Sqrt[2]), 1}, {(1/Sqrt[2]), 1, (1/Sqrt[2])}, {1, (1/Sqrt[2]), 1}};Graphics3D[BSplineSurface[pts, SplineKnots -> knots, SplineWeights -> weights], PlotRange -> {Automatic, Automatic, {-1, 1} / 4}]BSplineSurfaceは,コーナーにある4つの制御点を常に補間する:
pts = IconizedObject[«[image]»];
corners = {pts[[1, 1]], pts[[-1, 1]], pts[[-1, -1]], pts[[1, -1]]};RegionMember[BSplineSurface[pts], corners]Graphics3D[{BSplineSurface[pts], Red, PointSize[Medium], Point[corners]}]opts = Complement[Join@@pts, corners];RegionMember[BSplineSurface[pts], opts]//Countspts = IconizedObject[«[image]»];Show[Region[BSplineSurface[pts]], Graphics3D[{Opacity[0.1], EdgeForm[Directive[Dashed]], ConvexHullRegion[Join@@pts]}]]BSplineFunctionは,2つのパラメータの特定の値に対応するBSplineSurface上の位置を与える:
pts = IconizedObject[«[image]»];bfunc = BSplineFunction[pts]positions = Join@@Table[bfunc[u, v], {u, 0, 1, 1 / 10}, {v, 0, 1, 1 / 10}];Graphics3D[{BSplineSurface[pts], StandardRed, PointSize[0.02], Point[positions]}]Bスプライン曲面は,基底関数を用いてその制御点の加重和を取ることで構築できる:
pts = IconizedObject[«[image]»];knots = {0, 0, 0, 0, 1, 1, 1, 1};bspline[u_, v_] := Sum[BSplineBasis[{3, knots}, j, v] * BSplineBasis[{3, knots}, i, u] * pts[[i + 1, j + 1]], {j, 0, 3}, {i, 0, 3}]GraphicsRow[{ParametricPlot3D[bspline[u, v], {u, 0, 1}, {v, 0, 1}], Graphics3D[BSplineSurface[pts], Axes -> True]}, ImageSize -> Medium]pts = IconizedObject[«[image]»];A = AffineTransform[{(| | | |
| -- | - | - |
| 0 | 1 | 0 |
| -1 | 0 | 0 |
| 0 | 0 | 2 |), {1, 2, 3}}];Graphics3D[#, Axes -> True]& /@ {GeometricTransformation[BSplineSurface[pts], A], BSplineSurface[A[pts]]}SubdivisionRegionは,制御パッチからではなく制御メッシュから滑らかな曲面を生成する:
Graphics3D /@ {SubdivisionRegion[[image]], BSplineSurface[IconizedObject[«[image]»]]}関連するガイド
-
▪
- スプライン ▪
- グラフィックスオブジェクト
テキスト
Wolfram Research (2008), BSplineSurface, Wolfram言語関数, https://reference.wolfram.com/language/ref/BSplineSurface.html.
CMS
Wolfram Language. 2008. "BSplineSurface." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/BSplineSurface.html.
APA
Wolfram Language. (2008). BSplineSurface. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/BSplineSurface.html
BibTeX
@misc{reference.wolfram_2026_bsplinesurface, author="Wolfram Research", title="{BSplineSurface}", year="2008", howpublished="\url{https://reference.wolfram.com/language/ref/BSplineSurface.html}", note=[Accessed: 08-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_bsplinesurface, organization={Wolfram Research}, title={BSplineSurface}, year={2008}, url={https://reference.wolfram.com/language/ref/BSplineSurface.html}, note=[Accessed: 08-August-2026]}