ベジェ曲線とデザイン幾何学(フォント・UIの数理)
「制御点を引っ張ると曲線が曲がる理由」線分内分が創り出す美しきグラフィックス
- 1
- ベジェ曲線とデザイン幾何学(フォント・UIの数理)の本質的な定義と直感的ビジュアルをシミュレーターで体験できる。
- 2
- 公式や証明の背景にある数学的意味と、厳密な導出ステップを解説。
- 3
- 実社会における工学応用(SVG・CSSレンダリングエンジンおよびフォント描画ラスタライザ)のTypeScript実装コードを収録。
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
フランスの自動車会社ルノーの技師ピエール・ベジェが、自動車のボディをコンピュータ上で滑らかに設計するために考案した幾何学アルゴリズム。
身につく武器・思考力
高校数学の「線分の内分」だけで、IllustratorのペンツールやCSSアニメーションの滑らかな曲線を自在にデザイン・実装できるようになる。
実社会・ITでの活躍現場
- •CSSアニメーションの cubic-bezier() イージング(滑らかな加減速)
- •Adobe Illustrator / Figma / SVG のベクターパス・曲線描画ツール
- •TrueType / OpenType など、すべてのコンピュータフォントの文字輪郭レンダリング
- •3DCGモデリング(Blender/Maya)やCADソフトウェアの曲面生成
Layer 1 — 直感・シミュレーター
4つの制御点()を画面上でドラッグして動かしてみよう。スライダー を動かすと、制御点同士の内分点が結ばれ、その交点上に滑らかな3次ベジェ曲線が描かれる「ド・カステリョのアルゴリズム」が視覚的に理解できます。さらに、CSSの `cubic-bezier` アニメーションのイージングプレビューも試せます。
Layer 2 — 定義・受験・証明
定義
ベジェ曲線(Bézier Curve)とは、少数の制御点 を用いて滑らかな曲線を表現するパラメトリック曲線である。 3次ベジェ曲線(Cubic Bézier)上の点 ()は、バーンスタイン基底関数を用いて次のように定義される:
これは、線分 を比 で内分する操作を再帰的に繰り返すことと完全に等価である(ド・カステリョのアルゴリズム)。
公式・数理モデル
証明・導出
内分点の幾何学的導出(ド・カステリョのアルゴリズム): 1段階目の内分点:
2段階目の内分点:
3段階目の内分点(最終的な曲線上の点):
代入して展開整理すると:
二項定理 の展開項がそれぞれの制御点の重み係数(バーンスタイン多項式)として現れる。これにより、曲線は常に制御点の凸包(Convex Hull)の内部に収まるという極めて安定した数値特性を持つ。
押さえておきたいポイント
- Adobe Illustratorのペンツール、フォント(TrueType/OpenType)、SVGのパスはすべてベジェ曲線
- CSSアニメーションの `transition-timing-function: cubic-bezier(x1, y1, x2, y2)` も3次ベジェ曲線そのもの
- 「内分」という高校数学の基本操作を繰り返すだけで、コンピュータ上に究極に滑らかな曲線が生成される
- 微積分を用いれば曲線の接線ベクトル(微分)や曲率も瞬時に計算可能
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
SVG・CSSレンダリングエンジンおよびフォント描画ラスタライザ
2DグラフィックスライブラリやCanvas描画エンジンで使われる3次ベジェ曲線のサンプリング・点計算アルゴリズム。
1export interface Point2D {2 x: number;3 y: number;4}56// 3次ベジェ曲線の座標計算(媒介変数 t: 0〜1)7export function getCubicBezierPoint(8 p0: Point2D,9 p1: Point2D,10 p2: Point2D,11 p3: Point2D,12 t: number13): Point2D {14 const u = 1 - t;15 const tt = t * t;16 const uu = u * u;17 const uuu = uu * u;18 const ttt = tt * t;1920 const x = uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x;21 const y = uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y;2223 return { x, y };24}2526// CSS cubic-bezier(...) 文字列の生成27export function toCssCubicBezier(p1: Point2D, p2: Point2D): string {28 // P0=(0,0), P3=(1,1) の正規化座標系29 return `cubic-bezier(${p1.x.toFixed(2)}, ${p1.y.toFixed(2)}, ${p2.x.toFixed(2)}, ${p2.y.toFixed(2)})`;30}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元