---
title: 興味のあるパス弄り
date: 2022-10-11T08:58:22.000Z
updated: 2026-01-23T06:04:15.192Z
tags:
  - study
url: https://baku89.com/%E8%88%88%E5%91%B3%E3%81%AE%E3%81%82%E3%82%8B%E3%83%91%E3%82%B9%E5%BC%84%E3%82%8A
---

# 興味のあるパス弄り

## PPW Curves

```
1 - 2 - 3
    2 - 3 - 4
        3 - 4 - 5
```

みたいに Quadratic curve を書いて、その重なりをblending functionで補間するスプライン\
C^2連続が保証されている

- [PPW Curves: a C2 Interpolating Spline with Hyperbolic Blending of Rational Bézier Curves](https://www.jstage.jst.go.jp/article/transinf/E105.D/10/E105.D_2022PCP0006/_article/-char/ja/)
  - Seung-Tak NOH, Hiroki HARADA, Xi YANG, Tsukasa FUKUSATO, [Takeo IGARASHI](/Takeo_IGARASHI)

これの改良版

- [A Class of C2 Interpolating Splines](https://dl.acm.org/doi/epdf/10.1145/3400301)
  - [Cem Yuksel](/Cem_Yuksel)

これを実装したお絵描きツールが存在する by [折登 樹](/%E6%8A%98%E7%99%BB_%E6%A8%B9)

[Aquamarine Painter](https://github.com/MatchaChoco010)

![](https://github.com/MatchaChoco010/AquamarinePainter/raw/main/README/weight.gif)

## 異なる次数のベジェ曲線

- N次数のベジェは必ず複数のセグメントからなる(N-1)次のベジェで近似できる

- 逆に言えば、いくつもの変曲点からなる曲線も、十分に高次なベジェ曲線によって1つのセグメントとして表現できる

- [Higher Order Interpolation for Variable Font - Underware](https://www.underware.nl/case-studies/hoi/)

- **[Trigonometric Bezier curve](https://www.sciencedirect.com/science/article/pii/S0893965908001262)**（三角関数を用いたベジェ曲線）

  - N次のベジェ曲線を雰囲気で捉えると、N+1個の制御点を0≤t≤1の範囲で重み付けを変えながら混ぜ合わせていくことで得られる。このとき

    - 最初と最後の制御点を通る: b∗0(0)=0, w∗N−1(1)=1
    - 制御点を逆順に入れ替えても同じ曲線が得られるw∗k(t)=w∗N−k−1(1−t)
    - 重み付けの総和は常に1 ∑\_k=0Nwk(t)=1

  - 通常のベジェ曲線の場合、この重み付け関数はバーンスタイン多項式によって定義されるが、それを三角関数に置き換えてやったのがTrigonometric Bézier。

    - 3次の場合

      - w0(t)=(1−sinπ2t)2(1−λsinπ2t)
      - w1(t)=sinπ2t(1−sinπ2t)(2+λ−λsinπ2t)
      - w2(t)=cosπ2t(1−cosπ2t)(2+μ−μcosπ2t)
      - w0(t)=(1−cosπ2t)2(1−μcosπ2t)

    - こんなグラフになります:

    - ![](https://ars.els-cdn.com/content/image/1-s2.0-S0893965908001262-gr1.jpg)

  - 恐らく、円弧や正弦波のような形を近似ではなくちゃんと再現出来るんじゃないかなと思います

## 緩和曲線

- 「2点の位置、接線、曲率を指定したとき、いずれの曲率も下回らないG2連続な最短経路を描け」たら便利じゃないですか？（一意に定まるかどうかはさておき）

- **パスのオフセット**

  - ...ができるHoudiniアセットがあればいいですよね
    - qLibのql Offsetはあまり賢くない
  - [An offset algorithm for polyline curve](https://seant23.files.wordpress.com/2010/11/anoffsetalgorithm.pdf): これが最も確実そう。(始点, 円弧の角度) のタプルからなる円弧と直線に近似してオフセットする
    - 円弧での近似はこちらが参考に: [Approximating Bézier curves with circular arcs](https://pomax.github.io/bezierinfo/#arcapproximation)
  - [paperjs-offset](https://github.com/glenzli/paperjs-offset): こちらは何のアルゴリズムかわからない
  - <https://pomax.github.io/bezierinfo/#offsetting>: セグメントを分割してオフセットする方法

- **Gコードを逆にグラフィックとして読み込む**

- **『角を丸める』の一般化**

  - ポリラインはかんたん: [Houdiniアセット](https://github.com/baku89/nops#round-corners-sop)
  - ベジェ曲線の角を丸めるってムズいですよね
  - [Illustratorはすごい](https://x.com/_baku89/status/1387405019184394247)
  - 線の交点の角を丸める

- **非線形なトランスフォームってどうやるの**
  - ジグザグ、正弦波

- **変な曲線**

  - [Dubin's Path](/Dubin's_Path): 向きと位置を与えられた2点間をある曲率以上の最小距離でつなぐ
  - [Reeds-Shepp Curves](/Reeds-Shepp_Curves): 「バックによる切り返し」を許したDubins Path
  - [Arc Pen Tool](https://x.com/_baku89/status/1440259895375261712?s=20\&t=9vX3IMkz2vzOQLPf6sPJSQ)
  - Plexus的なグラフ構造に、Wavefunction Collapseを適用して、面白げな「結び目」をつくる
