2016年4月19日火曜日

内分点の計算

骨にロール用のジョイントを追加したい場合に使用する公式、内分点について。

直線ABをm:nに分けると云うやつですね。


公式は、こんなんだけれど、どうスクリプトに起こすのか?
m:nっていうのが難所。

とりあえず図解。


これをm:nを使わずに表現したい。

計算する場合、たいていaとbは設定できます。
そのa-b間の特定の座標が知りたいわけなので、
こんな感じの図になりました。

コレを使って内分点の式を書き換えると、


これでスクリプトにする事ができそうな気がします。

引数は
  • 開始位置
  • 終了位置
  • 割合
の3つ。

global proc vector calcDividingPoint(
    vector $sp,                         // 開始位置
    vector $ep,                         // 終了位置
     float $rate )                      // 割合
{
    float $length=mag( $sp-$ep );
    float $m=$length * $rate;

    return ( ( ($length-$m) * $sp + $m * $ep ) / $length );

}


ま、ここで終わっても使えないことは無いのですが、よく見ると $length を掛けたり
割ったりしまくっています。

$rate そもそも百分率なので、$length でなく 1.0 とすれば良いわけです。
なので、

global proc vector calcDividingPoint(
    vector $sp,                         // 開始位置
    vector $ep,                         // 終了位置
     float $rate )                      // 割合
{
    return ( (1.0-$rate) * $sp + $rate * $ep );

}


これで十分。

ちなみに $rate に1以上を設定すると外分点になります。


0 件のコメント:

コメントを投稿