ベジェ曲線,BSpline,NURBS

# 概要
ベジェ曲線
BSpline
NURBS

![diff.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/f6e93506-bfc6-dc13-5665-9109be35cf76.jpeg)


# ベジェ曲線
ベジェ曲線は、コンピュータグラフィックスにおける自由曲線の最も一般的な表現の1つです。 これらの曲線は、曲線の開発に重要な役割を果たした人物の一人であるPierre Bézierで名付けられました。

## 特徴
- ベジェ曲線は、制御点に適合する多項式曲線です。
- d（degree）のベジェ曲線は、d+1の制御点があります。
- 曲線は最初と最後の制御点のみを通過し、他の制御点は曲線の形状に影響を与えます。
- 一般に、複雑な曲線は、いくつかの低次のベジェ曲線で接続されています。

コンピュータグラフィックスでは、一般的に3次ベジェ曲線(d = 3)が使用されます
）。 Adobe Illustrator などの多くの一般的な画像処理のツールや、次のようなフォント表現スキーム。 
3次ベジェ曲線を用いたLATEXは、ベクトルグラフとして表示されます。 ベジェ曲線は、制御が簡単で、多くの優れた特性を持ち、非常に効率的なアルゴリズムを使用してそれらを処理できるため、コンピューターグラフィックスで非常に一般的に使用されます。

## サンプル

1. 曲線は、最初と最後の制御点のパラメーター u=0 と u=1 で補間されます
1. 曲線の始点(終点)の1次ガイドは、最初の2つ(最後の2つ)の制御点によって形成されるベクトルによって決定されます。微分の大きさは、これらの点間のベクトルに曲線の次数を掛けることによって計算されます。
1. 曲線の始点/終点の高次微分は、曲線の始点(終点)の一連の点から計算されます。 たとえば、n 次導関数は、開始点と後/終了後および前点の n+1 点に依存します。


例
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/86acee42-1c19-dcdd-33b1-89eea2229eef.jpeg)

Figure15.10は3次ベジェ曲線:
このベジェ曲線は ４つの制御点（d+1=4）があり。最初の制御点始点（P0）から、最後の制御点終点（P3）。始点の1次導関数は、二番目制御点と三番目制御点のベクトル(p1−p0)は比例します。f(0)=3(p1-p0)。同様に、終点1次導関数はf(1)=3(p3-p2)。曲線の2次導関数はp0,p1とp2から確定します。ベジェ曲線をパラメータ関数を確定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/ac156bec-db51-be20-d262-33e96d581f98.png)

マトリックスと式

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/43cd09c1-6956-0d15-b27f-7659c9012c21.png)

Bernstein basis polynomials
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/155b22d4-71e4-a680-08f8-77dbb1a13606.png)

nはベジェ曲線**阶数**、
kは第何番目ハイブリッド関数

式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/4145ca01-7a36-af2f-1514-c3b89c769971.png)

## 特徴
- 曲線は、制御点によって形成される凸包を超えません
- 直線がベジェ曲線と交差する回数は制御点を接続するセグメントのチェーンと交差する回数を超えない。これを劣化低減といいます。図15-12
- 曲線は対称で、終点から逆方向に描画すると、同じ曲線が得られますが、パラメータ化は元の曲線とは逆になります。
- 曲線はアフィンに依存しません。 つまり、カーブ上で平行移動、拡大縮小、回転などを行うことができ、制御点に直接適用した場合と同じ効果が得られます。
- ベジェ曲線をセグメントに細分化する単純なアルゴリズムがあり、細分化後もベジェ曲線のままです。

![15-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/aed4da00-c2df-8acd-b992-a0f585b10307.jpeg)

ベジェ セグメントを結合してスプラインを形成する場合、共有の端点が存在するため、曲線セグメント間の接続性も共有されます。ただし、曲線の導関数の連続性は、他の制御点の位置から計算する必要があります。したがって、ベジェスプラインは曲線の滑らかさを制御できます。G1連続性が必要な場合、最初の曲線セグメントの最後から2番目の点、共有点、2番目の曲線の2番目の点は同一線上にある必要があります。C1連続性が必要な場合は、3つの点の端点間の距離も等しくなければなりません。図15-13。
![15-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/17a46b2f-8011-007e-cb82-aeb7b6e87619.jpeg)

## 直感的理解
ベジェ曲線は、幾何学的原理と上記の代数的方法から導き出すことができます。 非常に直感的に感じることができる幾何学について話しましょう。
滑らかな曲線を作成する制御点のセットがあるとします。 まず第一に、点と点を単純に線でつなぐことはできません。 第二に、直接接続に鋭い角があるなら、鋭い角を切り落とすのはどうかと思うかもしれません。 これを繰り返すことで、図15-14に示すように、毎回より滑らかなポリゴンが得られます。
![15-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/9aecb905-55aa-1111-3f49-8947e22469cd.jpeg)



# BSpline
ベジェ曲線とは異なり、Bスプラインは任意の連続性を持つスプラインを生成することができます（制御点の数と同じ連続性を持つスプライン、すなわちn点Cnを生成することもできます）。したがって、コンピュータグラフィックスでは、Bスプラインは非常に滑らかな（連続性の高い）曲線を指定するのに適した方法です。曲線はBスプライン基底関数の線形結合として表現できる。 これらの基底関数はそれ自体がスプラインなので、曲線は基底スプラインまたはBスプラインと呼ばれます。各Bスプラインまたは基底関数は次式で与えられます。d + 1 の多項式で与えられます。グラフィックスでは、一般にBスプライン基底関数の線形結合をBスプライン曲線と呼びます。
関数を一連の関数の線形結合として表すと、その一般式は次のようになる：
![15-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/3bab8dba-a5fe-bbc5-1ecd-008a798cb4fa.jpeg)

piは係数、biは基底関数と呼ばれる。 係数が点（2次元ベクトル、3次元ベクトルなど）として表現される場合、それは制御点と呼ばれる。 Bスプラインの特性を実現するためには、基底関数biをうまく選ぶ必要がある。
Bスプラインの基底関数の選び方は非常に一般的である。

## 均一線形BSpline (均一一次BSpline)
BSpline基関数
![15-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/95cff89d-257f-98b5-b5fb-d68f50770445.jpeg)


## 2次Bスプライン

![15-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/9637a5da-e785-c867-bf73-bb0ae99caa54.jpeg)


## 3次BSpline

![15-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/baa64fd8-b2ee-4d0d-fefb-d846d1afd6e8.jpeg)

![15-181.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/5f6cdb6b-b97d-7902-1708-015341dc6ad2.jpeg)


# NURBS
Non Uniform Rational B-Spline
今説明したBスプライン曲線の一般性にもかかわらず、Bスプライン曲線では正確に表現できない関数、特に円錐曲線がある。 そのような曲線を表現するために、2つの非一様なBスプライン曲線の比を使って当てはめることができる。 この比では、分子と分母の両方が非一様Bスプラインで表されます。 これはBスプラインの最も一般的な形、非一様有理Bスプライン（NURBS）を生じさせる。NURBSは各制御点piに重み（スカラー）を与える h i は、分子と分母に同じBスプライン基底関数を使う：
![15-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445123/95e141be-891a-0049-37f3-0138f38159a8.jpeg)

# その他

## おすすめ本
1. The NURBS Book 2nd
1. An Introduction to NURBS

## Demo
http://nurbscalculator.in/
NURBS
https://mathweb.ucsd.edu/~sbuss/MathCG2/NurbsDemoJS/NurbsDemo.html
bezier
https://cubic-bezier.com/#.17,.67,.83,.67

## SourceCode
- https://sourceforge.net/projects/libnurbs/files/
- https://github.com/msteinbeck/tinyspline
- https://github.com/mcneel/opennurbs