1

この件に関してここで見つけることができるすべてを読みましたが、コードの一部を理解できる単純なpythonに変換することはできません。

de Casteljauのアルゴリズムのこの非常に良い説明に基づいて、私はこれを得ました:

def divideCurve(p0, cp0, cp1, p1, t):
    # p0 and p1 are the start/end points of the bezier curve,
    # cp0 and cp1 are the control points
    # all points are tuples of their coordinates: p0 = (10, 15)

    Ax = ( (1 - t) * p0[0] ) + (t * cp0[0])
    Ay = ( (1 - t) * p0[1] ) + (t * cp0[1])
    Bx = ( (1 - t) * cp0[0] ) + (t * cp1[0])
    By = ( (1 - t) * cp0[1] ) + (t * cp1[1])
    Cx = ( (1 - t) * cp1[0] ) + (t * p1[0])
    Cy = ( (1 - t) * cp1[1] ) + (t * p1[1])

    Dx = ( (1 - t) * Ax ) + (t * Bx)
    Dy = ( (1 - t) * Ay ) + (t * By)
    Ex = ( (1 - t) * Bx ) + (t * Cx)
    Ey = ( (1 - t) * By ) + (t * Cy)

    Px = ( (1 - t) * Dx ) + (t * Ex)
    Py = ( (1 - t) * Dy ) + (t * Ey)

    print Px, Py

for T in range(0, 11, 1):
    t = T*0.1
    divideCurve(p0, cp0, cp1, p1, t)

しかし、これは曲線に沿って点を不均等に分配します。

ここに考えられる解決策があると思いますが、アーク長関数の逆関数のコードや、それを python に変換する方法を完全に理解していません。ここで別のアプローチを見つけましたが、これは別のアプローチを取っていると思いますが、これもPythonで実装するには十分に理解できていません。

誰かがこれを単純な python に明確化してくれるなら、それは素晴らしいことです。

4

1 に答える 1

3

はじめに: これはシンボリックな解決策がない問題です。つまり、ベジエ曲線に対して "length-for-t" 関数 ( t値で...、曲線の長さは X) を使用して反転することはできません。 「t-for-length」を取得します(私が全長Xの...%の長さにいる場合、どのt値にいますか)。したがって、これで見つかるすべての実装は、テーマのバリエーションです

  1. 曲線全体の長さを決定し、
  2. 曲線に沿ってさまざまなt値の参照長を決定し、
  3. 参照値と正確に一致しない値については、その近くにある 2 つのt値を見つけて補間します。

一部の実装では、このために曲線を平坦化します (ベジエ曲線を一連の直線に変換します)。他の実装では、t に対する距離のルックアップ テーブル (LUT) を構築します。一部の実装では、既知の参照値の間で線形補間を行います (平坦化された曲線を効果的にエミュレートします)。他の実装では、円弧補間を使用して、2 つの既知の値の間の各セグメントを (円形の) 円弧のセクションとして近似します。これらの実装のすべてについて、最終的には、実行距離は選択によって異なりますが、連続するt値間の距離を小さくするほど、「実際の」結果に近づきます。

最も簡単で、通常は最速の方法は、連続するt値の間の「十分に小さい」ステップサイズで LUT を作成し、補間を気にせず、代わりに実際の長さに最も近いtポイントを選択することです。ステップサイズが 1 ピクセル以下のセグメント長につながる限り、表示目的ではそれ以上のものは必要ありません。より高い解像度は実際には「より良い」ポイントにはつながらないため、それらは同じピクセル上にあります。距離基準点をより正確にする場合。

これについては、 http://pomax.github.io/bezierinfo/#tracingでコードを使用して説明しています。これは Python ではなく Javascript で記述されていますが、アルゴリズムの説明を考えると、書き上げるのは比較的簡単なはずです。既に持っているコードに基づく Python。

于 2013-04-28T14:29:15.217 に答える