将 FitCurve.c 移植到 JavaScript
Graphics Gems 1 にある AN ALGORITHM FOR AUTOMATICALLY FITTING DIGITIZED CURVES という
アルゴリズムをC言語で書いた FitCurve.c とソースがあります。
それを2024年12月22日に JavaScript に移植したときのログのような記事です。
移植前を手元に用意して本記事をご覧ください。
Graphics Gems 1 中的 AN ALGORITHM FOR AUTOMATICALLY FITTING DIGITIZED CURVES
算法被用C语言改写为 FitCurve.c 源码。
这是2024年12月22日将其移植到 JavaScript 时的日志式文章。
请先准备好移植前的版本再阅读本文。
ソースが書かれたのが1990年で且つC言語なので、全体的に少しだけ直す必要があります。
源码写于1990年且为C语言,因此整体上只需稍作修正即可。
・return (a) の括弧を外しました。 ・メソッド名は camelCase に変更した。e.g. GenerateBezier -> generateBezier ・変数名は大文字で始まろうともそのままにしました。 ・変数のスコープを狭くしても良いものはスコープを狭くしました。
・去掉了 return (a) 的括号。
・方法名改为 camelCase,例如 GenerateBezier → generateBezier
・变量名若以大写字母开头则保持不变。
・对变量作用域进行了收紧,能收紧的都收紧了。
・malloc(sizeof(T) * n) は new Array(n) で置き換えました。
・malloc(sizeof(T) * n) 被替换为 new Array(n)。
空配列で初期化しようとも考えたが new Array(n) だとメモリの再割り当ても無いだろうと判断しました。
虽然也曾考虑用空数组初始化,但判断 new Array(n) 不会带来内存重新分配。
・ベクトルの演算は Vector2 のメソッドで代替しました。
・ベクトルの演算は Vector2 のメソッドで代替しました。
それでは関数ごとに見ていきたいと思います。
それでは関数ごとに見ていきたいと思います。
・FitCurve -> fitCurves と camelCaseにしただけではなく、Curve -> Curves と複数形に変更しました。 ・FitCurve のメソッド内メソッドとしてほとんどの関数を作成しました。
・FitCurve -> fitCurves と camelCaseにしただけではなく、Curve -> Curves と複数形に変更しました。 ・FitCurve のメソッド内メソッドとしてほとんどの関数を作成しました。
curves というベジェ曲線配列を作成。ベジェ曲線が確定した時点でこの配列に格納していきます。
curves というベジェ曲線配列を作成。ベジェ曲線が確定した時点でこの配列に格納していきます。
static fitCurves(d, error) { const curves = []; const nPts = d.length; const tHat1 = computeLeftTangent(d, 0); const tHat2 = computeRightTangent(d, nPts - 1); fitCubic(d, 0, nPts - 1, tHat1, tHat2, error); return curves; }
static fitCurves(d, error) { const curves = []; const nPts = d.length; const tHat1 = computeLeftTangent(d, 0); const tHat2 = computeRightTangent(d, nPts - 1); fitCubic(d, 0, nPts - 1, tHat1, tHat2, error); return curves; }
・FitCubic の uPrime は for文のスコープとしました。
・将 FitCubic 的 uPrime 放入 for 语句的作用域内。
function fitCubic(d, first, last, tHat1, tHat2, error) { let bezCurve, u, maxError, splitPoint; const nPts = last - first + 1; const maxIterations = 4; const iterationError = error...