BSplineCurve[{p1,p2,…}]
制御点 ptiを持つ,一様ではない有理Bスプライン曲線を表す.
BSplineCurve
BSplineCurve[{p1,p2,…}]
制御点 ptiを持つ,一様ではない有理Bスプライン曲線を表す.
詳細とオプション
- BSplineCurveは,基底スプライン曲線,あるいは非一様有理Bスプライン(NURBS)曲線としても知られている.
- BSplineCurveは通常,補間,コンピュータグラフィックス,CADモデリングに用いられる.
- 制御点 piは,{x,y}や{x,y,z}のような通常の座標である.
- BSplineCurveは幾何学領域およびグラフィックスプリミティブとして使用可能である.
- グラフィックスにおいて,点 piは Scaled,Offset,ImageScaled,Dynamicの式でよい.
- グラフィックスの描画は,Thickness,Dashing,JoinForm,CapFormや色のような指示子の影響を受ける.
- 使用可能なオプション
-
SplineDegree Automatic 多項式基底の次数 SplineKnots Automatic スプラインの結び目の列 SplineWeights Automatic 制御点の重み SplineClosed False 曲線を閉じるかどうか - デフォルトで,BSplineCurveは三次スプラインを使う.
- オプション設定のSplineDegree->d はもとになっている多項式基底が最大次数 d を持つように指定する.
- デフォルトで,結び目はパラメータ空間で一様に選ばれ,曲線が最初の制御点で始まり最後の制御点で終るように追加的な結び目が加えられる.
- SplineKnotsを明示的に設定した場合,多項式基底の次数は,指定された結び目の数および制御点の数によって決定される.
- デフォルト設定のSplineWeights->Automaticでは,すべての制御点は多項式Bスプライン曲線に対応する等しい重みを持つように選択される.
例題
すべて開く すべて閉じる例 (2)
pts = {{0, 0}, {1, 1}, {2, -1}, {3, 0}, {4, -2}, {5, 1}};Graphics[{BSplineCurve[pts], Dashed, Gray, Line[pts], Red, Point[pts]}]pts = {{0, 0, 0}, {1, 1, 1}, {2, -1, 1}, {3, 0, 2}, {4, 1, 1}};Graphics3D[{BSplineCurve[pts], Dashed, Gray, Line[pts], Red, Point[pts]}]reg = BSplineCurve[{{0, 0}, {1, 1}, {2, -1}}];ArcLength[reg]RegionBounds[reg]スコープ (26)
基本的な用法 (3)
Graphics[BSplineCurve[{{0, 0}, {2, 1}}]]Graphics[BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]]Graphics[BSplineCurve[CirclePoints[4]]]Graphics[BSplineCurve[CirclePoints[4], SplineClosed -> True]]BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]指定 (5)
Graphics[BSplineCurve[{{-1, 0}, {0, 2}, {1, 0}}]]Graphics3D[BSplineCurve[{{-1, 0, 0}, {0, 2, 1}, {1, 0, 0}}]]Graphics[BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]]Graphics3D[BSplineCurve[{{-3, -1, 0}, {6, 5, 5}, {-6, -5, -5}, {3, 1, 0}}]]一般に,d 次Bスプライン曲線は少なくとも(d+1)個の制御点を必要とする:
pts = {{0, 0}, {(1/3), (Sqrt[3]/2)}, {(2/3), (Sqrt[3]/2)}, {1, 0}, {(4/3), (Sqrt[3]/2)}, {(5/3), (Sqrt[3]/2)}, {2, 0}};deg = Length[pts] - 1;BSplineCurve[pts, SplineDegree -> deg]Graphics[%]BSplineCurve[Take[pts, 4], SplineDegree -> deg]Graphics[%]Graphics[{BSplineCurve[CirclePoints[3]]}]Graphics[{BSplineCurve[CirclePoints[3], SplineClosed -> True]}]pts = {{0, 0}, {0, 4}, {2, 6}, {4, 0}, {6, 6}, {8, 4}, {8, 0}};Table[Graphics[BSplineCurve[pts, SplineKnots -> knots]], {knots, {Automatic, {0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2}}}]pts = {{0, 0}, {1, 1}, {2, -1}, {3, 0}};Graphics[{#, Gray, Dashed, Line[pts], Red, Point[pts]}]& /@ Table[BSplineCurve[pts, SplineWeights -> w], {w, {Automatic, {1, 10, 10, 1}}}]グラフィックス (12)
Table[Graphics[{c, BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {c, {RGBColor[0.93, 0.27, 0.27], RGBColor[0.14, 0.8, 0.14], RGBColor[0.4, 0.6, 1]}}]Table[Graphics[{Thickness[i], BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {i, {Tiny, Small, Medium, Large}}]Table[Graphics[{t, BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {t, {Thin, Thick}}]PlotRangeと相対的にスケールされた太さ:
Table[Graphics[{Thickness[i], BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {i, {.005, .05, .1}}]Table[Graphics[{AbsoluteThickness[i], BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {i, {1, 5, 10}}]Table[Graphics[{Dashing[i], BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {i, {Tiny, Small, Medium, Large}}]Table[Graphics[{d, BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {d, {Dotted, Dashed, DotDashed}}]Opacityは曲線の透過性を決定する:
Table[Graphics[{Opacity[o], BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]}], {o, {0.1, 0.5, 0.9}}]FilledCurveの境界として使われる場合は,EdgeFormを使って曲線のスタイルが指定できる:
Graphics[{EdgeForm[{StandardBlue, Thick}], Opacity[0.1], FilledCurve[BSplineCurve[CirclePoints[4]]]}]BSplineCurveは,2DのArrowの曲線として使うことができる:
Graphics[{Arrowheads[Large], Arrow[BSplineCurve[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}]]}]Graphics3D[{Arrowheads[Large], Arrow[BSplineCurve[{{-3, -1, 0}, {6, 5, 5}, {-6, -5, -5}, {3, 1, 0}}]]}, Rule[...]]3Dでは,BSplineCurveはTubeの曲線として使うことができる:
Graphics3D[{Tube[BSplineCurve[{{-3, -1, 0}, {6, 5, 5}, {-6, -5, -5}, {3, 1, 0}}], 0.1]}]Graphics3D[{Arrowheads[0.2], Arrow[Tube[BSplineCurve[{{-3, -1, 0}, {6, 5, 5}, {-6, -5, -5}, {3, 1, 0}}], 0.1]]}]BSplineCurveはGraphicsComplexと一緒に使うことができる:
Graphics[{GraphicsComplex[{{-3, 0}, {6, 5}, {-6, -5}, {3, 0}}, BSplineCurve[{1, 2, 3, 4}]]}]pts = {{0, 0}, {(1/4), 1}, {(3/4), 1}, {1, 0}};Table[Graphics[{BSplineCurve[pts]}, Frame -> True, PlotRange -> {{0, pr}, {0, pr}}], {pr, {1, 2, 4}}]Scaledを使って制御点をPlotRangeと相対的に指定する:
Table[Graphics[{BSplineCurve[Map[Scaled, pts]]}, Frame -> True, PlotRange -> {{0, pr}, {0, pr}}], {pr, {4, 8, 16}}]ImageScaledを使って2Dの画像領域全体と相対的に制御点を指定する:
Table[Graphics[{BSplineCurve[Map[ImageScaled, pts]]}, Frame -> True, PlotRange -> {{0, pr}, {0, pr}}], {pr, {4, 8, 16}}]Offsetを使って2Dの制御点に絶対オフセットを適用する:
pts = {{0, 0}, {(1/4), 1}, {(3/4), 1}, {1, 0}};offsets = {{-80, 0}, {0, 0}, {80, 0}};Graphics[{Table[BSplineCurve[Map[Offset[offset, #]&, pts]], {offset, offsets}]}, PlotRange -> {{-1.4, 2.4}, {-0.1, 1}}, ImageSize -> 250]制御点はDynamicでよい:
DynamicModule[{z = 0, pts},
pts = {{Dynamic[{0, z}], {1, 2}, {3, 2}, {4, 0}}};
{Slider[Dynamic[z], {0, 4}], Graphics[{BSplineCurve[pts]}]}]領域 (6)
reg = BSplineCurve[{{Subscript[c, 1], Subscript[c, 2]}, {Subscript[c, 3], Subscript[c, 4]}, {Subscript[c, 5], Subscript[c, 6]}}];RegionEmbeddingDimension[reg]RegionDimension[reg]reg = BSplineCurve[{{0, 0}, {1, 2}, {3, 2}, {4, 0}}];{RegionMember[reg, {0, 0}], RegionMember[reg, {0, 1}]}reg = BSplineCurve[{{0, 0}, {1, 2}, {2, 0}}];{ArcLength[reg], RegionMeasure[reg]}c = RegionCentroid[reg]Show[Region[reg], Graphics[{LightDarkSwitched[Black, White], Point[c]}]]reg = BSplineCurve[{{-1, -1}, {0, 1}, {1, -1}}];{RegionDistance[reg, {-1, -1}], RegionDistance[reg, {2, 2}]}Show[Region[reg], ContourPlot[Evaluate@RegionDistance[reg, {x, y}], {x, -4, 4}, {y, -4, 3}, Contours -> {1, 2, 3}, ...], Frame -> True]reg = BSplineCurve[{{-1, -1}, {0, 1}, {1, -1}}];{SignedRegionDistance[reg, {-1, -1}], SignedRegionDistance[reg, {2, 2}]}reg = BSplineCurve[{{-1, -1}, {0, 1}, {1, -1}}];BoundedRegionQ[reg]bb = CoordinateBoundingBox[reg]Show[Region[reg], Graphics[{Opacity[0.1], EdgeForm[Dashed], Cuboid@@bb}]]オプション (7)
SplineDegree (1)
デフォルトで,4つ以上の制御点を持つBSplineCurveは次数3を使う:
pts = Table[{i, (-1) ^ i}, {i, 10}];{BSplineCurve[Take[pts, 4]], BSplineCurve[Take[pts, 10]]}{BSplineCurve[Take[pts, 2]], BSplineCurve[Take[pts, 3]]}SplineDegreeを使ってより低い次数を使うように指定する:
BSplineCurve[pts, SplineDegree -> 1]BSplineCurve[pts, SplineDegree -> 9]SplineKnots (4)
デフォルトで,結び目は曲線が全体的に滑らかになるように生成される:
pts = {{0, 0}, {0, 2}, {2, 3}, {4, 0}, {6, 3}, {8, 2}, {8, 0}};Graphics[{BSplineCurve[pts, SplineKnots -> Automatic], Dashed, Gray, Line[pts], Red, Point[pts]}]knots = {0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2};Graphics[{BSplineCurve[pts, SplineKnots -> knots], Dashed, Gray, Line[pts], Red, Point[pts]}]"Clamped"は曲線が最初と最後の制御点を補間するように結び目を生成する:
pts = {{0, 0}, {0, 2}, {2, 3}, {4, 0}, {6, 3}, {8, 2}, {8, 0}};Graphics[{BSplineCurve[pts, SplineKnots -> "Clamped"], Dashed, Gray, Line[pts], Red, Point[pts]}]d 次曲線では,これは最初と最後の結び目の値が d+1回繰り返されることに相当する:
knots = {0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4};Graphics[{BSplineCurve[pts, SplineKnots -> knots], Dashed, Gray, Line[pts], Red, Point[pts]}]"Unclamped"は,曲線が端点を補間しないような一様結び目を生成する:
pts = {{0, 0}, {0, 2}, {2, 3}, {4, 0}, {6, 3}, {8, 2}, {8, 0}};Graphics[{BSplineCurve[pts, SplineKnots -> "Unclamped"], Dashed, Gray, Line[pts], Red, Point[pts]}]n 個の制御点を持つ d 次曲線の場合,これは長さ n+d+1の連続するシーケンスに相当する:
knots = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};Graphics[{BSplineCurve[pts, SplineKnots -> knots], Dashed, Gray, Line[pts], Red, Point[pts]}]クランプされていない結び目をSplineClosedと組み合せると,一様周期Bスプライン曲線が作成される:
pts = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};Graphics[{BSplineCurve[pts, SplineClosed -> True, SplineKnots -> "Unclamped"], Dashed, Gray, Line[Append[pts, pts[[1]]]], Red, Point[pts]}]SplineWeights (1)
pts = {{0, 0}, {1, 1}, {2, -1}, {3, 0}};Graphics[{BSplineCurve[pts, SplineWeights -> #], Dashed, Gray, Line[pts], Red, Point[pts]}]& /@ {Automatic, {1, 1, 1, 1}}制御点により大きい重みを与えると,曲線はその点に引き寄せられる:
Graphics[{BSplineCurve[pts, SplineWeights -> #], Dashed, Gray, Line[pts], Red, Point[pts]}]& /@ {{1, 0, 0, 1}, {1, 20, 20, 1}}SplineClosed (1)
pts = {{0, -(1/2)}, {(Sqrt[3]/2), -(1/2)}, {(Sqrt[3]/2), (1/2)}, {0, (1/2)}, {-(Sqrt[3]/2), (1/2)}, {-(Sqrt[3]/2), -(1/2)}};Graphics[{BSplineCurve[pts]}]SplineClosedを使って曲線を閉じる:
Graphics[{BSplineCurve[pts, SplineClosed -> True]}]特性と関係 (13)
次数1のBSplineCurveはLineに等しい:
pts = {{0, -1}, {2, 1}, {4, -1}, {6, 1}, {8, -1}};Graphics /@ {BSplineCurve[pts, SplineDegree -> 1], Line[pts]}単純なBezierCurveは,同じ次数のデフォルトのBSplineCurveに等しい:
pts = {{-3, 0}, {6, 5}, {-6, -5}, {3, 0}};Graphics /@ {BezierCurve[pts], BSplineCurve[pts]}合成BezierCurveは特定のSplineKnotsを持ったBSplineCurveで表すことができる:
pts = {{0, 0}, {3, 9}, {7, 9}, {10, 0}, {13, 9}, {17, 9}, {20, 0}};knots = {0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2};Graphics /@ {BezierCurve[pts], BSplineCurve[pts, SplineKnots -> knots]}BSplineSurfaceは,制御点の矩形配列を取るBSplineCurveのより高次元の形式である:
pts = (| | | |
| --------- | --------- | --------- |
| {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} |);Graphics3D[{BSplineSurface[pts]}]BSplineSurfaceの境界辺はBスプライン曲線によって形成される:
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}]Circleは等価のBSplineCurveとして表すことができる:
pts = {{0, -1}, {1, -1}, {1, 1}, {0, 1}, {-1, 1}, {-1, -1}, {0, -1}};weights = {1, 1 / 2, 1 / 2, 1, 1 / 2, 1 / 2, 1};knots = {0, 0, 0, 1 / 4, 1 / 2, 1 / 2, 3 / 4, 1, 1, 1};Graphics /@ {BSplineCurve[pts, SplineDegree -> 2, SplineKnots -> knots, SplineWeights -> weights], Circle[]}pts = {{0, 0}, {3, 4}, {6, 0}, {9, -4}, {13, 0}, {16, 4}, {19, 0}};Graphics[{BSplineCurve[pts], Red, Point[{First[pts], Last[pts]}]}]pts = {{0, -1}, {2, 1}, {4, -1}, {6, 1}, {4, 2}, {6, 2}};hull = ConvexHullMesh[pts, MeshCellStyle -> {0 -> Red, 2 -> Opacity[0.25]}];Show[hull, Region[BSplineCurve[pts]]]3Dでは,共面の制御点を持つBスプライン曲線はその点と同じ平面にある:
pts = {{0, -1, 0}, {1, 6, 0}, {2, -6, 0}, {3, 6, 0}, {4, -1, 0}};pts//CoplanarPointsGraphics3D[{InfinitePlane[Take[pts, 3]], BSplineCurve[pts]}, Lighting -> "Accent", ViewPoint -> #]& /@ {2{1, -1, 1}, Front, Top}BSplineFunctionは,特定のパラメータ値に相当するBSplineCurve上の点を与える:
pts = {{0, 0}, {0, 3}, {3, 3}, {5, 0}, {8, 0}, {8, 3}};bfunc = BSplineFunction[pts]samples = Table[bfunc[u], {u, 0, 1, 1 / 10}];Graphics[{BSplineCurve[pts], StandardRed, PointSize[0.02], Point[samples]}]Bスプライン曲線はその制御点を加重和を取る基底関数を使って構築できる:
pts = {{0, -1}, {1, 2}, {2, -2}, {3, -2}, {4, 2}, {5, -1}};knots = {0, 0, 0, 1 / 4, 1 / 2, 3 / 4, 1, 1, 1};bspline[t_] := Sum[BSplineBasis[{2, knots}, i, t] * pts[[i + 1]], {i, 0, 5}]GraphicsRow[{ParametricPlot[bspline[t], {t, 0, 1}, Frame -> True, Axes -> False], Graphics[BSplineCurve[pts, SplineKnots -> knots], Frame -> True]}, ImageSize -> 400]BSplineBasisを使って各制御点の重みを曲線に沿って可視化する:
weights = Table[BSplineBasis[{2, knots}, i, t], {i, 0, 5}];Plot[weights, {t, 0, 1}, PlotLegends -> {"SubscriptBox[p, 1]", "SubscriptBox[p, 2]", "SubscriptBox[p, 3]", "SubscriptBox[p, 4]", "SubscriptBox[p, 6]", "SubscriptBox[p, 7]"}]knots2 = {0, 0, 0, 1 / 4, 1 / 4, 3 / 4, 1, 1, 1};weights = Table[BSplineBasis[{2, knots2}, i, t], {i, 0, 5}];Plot[weights, {t, 0, 1}, PlotLegends -> {"SubscriptBox[p, 1]", "SubscriptBox[p, 2]", "SubscriptBox[p, 3]", "SubscriptBox[p, 4]", "SubscriptBox[p, 6]", "SubscriptBox[p, 7]"}]pts = {{0, -2}, {2, 2}, {4, -4}, {6, 1}, {8, -2}};A = AffineTransform[{{{1, 1}, {0, 2}}, {1, 2}}];{Graphics[GeometricTransformation[BSplineCurve[pts], A], Frame -> True],
Graphics[BSplineCurve[A[pts]], Frame -> True]}2本のBスプライン曲線の制御点を平均することは曲線そのものを平均することに等しい:
pts1 = {{0, -1}, {2, 1}, {4, 2}, {6, 2}, {8, 3}};
pts2 = {{2, -1}, {3, 1}, {4, -1}, {6, 0}, {8, -1}};Graphics[{Thick, RGBColor[0.4, 0.6, 1], BSplineCurve[pts1], RGBColor[0.98, 0.56, 0.17], BSplineCurve[pts2], RGBColor[0.93, 0.27, 0.27], BSplineCurve[Mean[{pts1, pts2}]]}, Frame -> True]ParametricPlot[{BSplineFunction[pts1][t], BSplineFunction[pts2][t], Mean[{BSplineFunction[pts1][t], BSplineFunction[pts2][t]}]}, {t, 0, 1}, Frame -> True, Axes -> False, PlotStyle -> {RGBColor[0.4, 0.6, 1], RGBColor[0.98, 0.56, 0.17], RGBColor[0.93, 0.27, 0.27]}]Bスプライン曲線はより高い次数の同等の曲線に引き上げられる:
quadratic = BSplineCurve[{{0, 0}, {2, 3}, {4, 0}}, SplineDegree -> 2];cubic = BSplineCurve[{{0, 0}, {(4/3), 2}, {(8/3), 2}, {4, 0}}, SplineDegree -> 3];Graphics /@ {quadratic, cubic}SubdivisionRegionは,制御点ではなく制御メッシュから滑らかな曲面を生成する:
Region /@ {SubdivisionRegion[[image]], BSplineCurve[IconizedObject[«[image]»]]}関連するガイド
-
▪
- スプライン ▪
- グラフィックスオブジェクト
テキスト
Wolfram Research (2008), BSplineCurve, Wolfram言語関数, https://reference.wolfram.com/language/ref/BSplineCurve.html.
CMS
Wolfram Language. 2008. "BSplineCurve." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/BSplineCurve.html.
APA
Wolfram Language. (2008). BSplineCurve. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/BSplineCurve.html
BibTeX
@misc{reference.wolfram_2026_bsplinecurve, author="Wolfram Research", title="{BSplineCurve}", year="2008", howpublished="\url{https://reference.wolfram.com/language/ref/BSplineCurve.html}", note=[Accessed: 11-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_bsplinecurve, organization={Wolfram Research}, title={BSplineCurve}, year={2008}, url={https://reference.wolfram.com/language/ref/BSplineCurve.html}, note=[Accessed: 11-August-2026]}