Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works
Anything · Lazarus or Delphi
Random projectRandom project

BezierConverter

View on GitHub

Member rating

No ratings yet.

Sign in to rate this project.

README

BezierConverter

任意の次数の多項式(多項式基底)をバーンスタイン多項式、つまりベジエ曲線へ基底変換します。

アルゴリズム

係数の配列さえあれば、In-place で計算することができる。

▼ 多項式基底 ⇒ バーンスタイン基底

pascal
function PolyToBezi( const P_:TDoubleND ) :TDoubleND;
var
   X, Y :Integer;
begin
     Result.DimN := P_.DimN;
     for X := 0 to Result.DimN-1 do Result[ X ] := P_[ X ] / Comb( DimN-1, X );
     for Y := 1 to Result.DimN-1 do
     begin
          for X := Result.DimN-1 downto Y do Result[ X ] := Result[ X ] + Result[ X-1 ];
     end;
end;

▼ バーンスタイン基底 ⇒ 多項式基底

pascal
function BeziToPoly( const P_:TDoubleND ) :TDoubleND;
var
   X, Y :Integer;
begin
     Result := TDoubleND.Create( P_ );
     for Y := 1 to Result.DimN-1 do
     begin
          for X := Result.DimN-1 downto Y do Result[ X ] := Result[ X ] - Result[ X-1 ];
     end;
     for X := 0 to Result.DimN-1 do Result[ X ] := Result[ X ] * Comb( DimN-1, X );
end;

任意次元のベクトルを扱う LUX.DN.TDoubleND レコード型を利用している。TDoubleND.DimN プロパティが次元数を示す。 Comb( n, k ) は 組合せ(Combination)数、つまり 二項係数 を返す関数。


Delphi Starter