2012-01-16 29 views
1

私は、フラグメントシェーダの円弧に沿ったテクスチャからサンプルを探しています。そのような種類の再帰的な方法は、thisのようなルールです。円弧分割アルゴリズム

私はこれを実現するには、いくつかの異なる方法が出ている:最も合理的なように見える2つは、(ラジアンとN位置に開始位置p、中央c、半径r = length(c-p)、角度(円弧範囲)thetaを考えると)されています

1)theta/NN倍〜約ベクターPCを回し:コストは、2つの三角関数、N 2x2の行列乗算、Nほどベクトル減算

である:これは、繰り返し使用される回転行列の構築を必要と

2)セクタを横断する1つのセグメントのコード長を探します。長さは2*r*sin(theta/2)です。私は最初のベクトルを持っていれば、それを回転させて前の位置に加えて、私の弧に沿って歩進することができます。この方法の問題は、私はまだ私の長さ2*r*sin(theta/2)ベクトルの方向を取得するための表現を知らないということです。私がしたとしても、それを構築するにはtrig関数が必要になるだろう。私はまだそれを回転させる必要があるので、回転行列を構築する必要があります。ああ。

他にも考えられる方法はありますか?

+0

「サンプルを円弧に沿ってサンプルする」ということを詳しく説明できますか?各ピクセルの周りの円(または円の一部)でサンプリングしますか?そして、アークはすべてのピクセル(同じ角度および/または半径)で同じになるでしょうか?または、他の何か?また、なぜあなたはこれをやろうとしていますか?ラジアルなぼかしを作り出そうとしていますか? – user1118321

+0

私は何をしているのか正確には明らかにしません。うまくいけば、あなたはいつかゲームでそれを見るでしょう。半径方向のボケに関しては、許容可能な結果は、通常、線に沿ってサンプリングすることによって得られる。 –

+0

これは、より多くのカーブしたぼかしです。剛体の動きに追従するぼかし、正確には、固定された中心(回転)と直線運動の周りの円運動の線形結合です –

答えて

3

サークルとアングルを使用し始めると、いくつかのtrig呼び出しが必要になると思います。 これを考えると、最初の方法はOKと思われます。私は、ポイント上で反復的に行動する場合、2D行列の乗算が必要ないことを私は見ていないことに留意したい。

void f(float cx, float cy, float px, float py, float theta, int N) 
{ 
    float dx = px - cx; 
    float dy = py - cy; 
    float r2 = dx * dx + dy * dy; 
    float r = sqrt(r2); 
    float ctheta = cos(theta/(N-1)); 
    float stheta = sin(theta/(N-1)); 
    std::cout << cx + dx << "," << cy + dy << std::endl; 
    for(int i = 1; i != N; ++i) 
    { 
     float dxtemp = ctheta * dx - stheta * dy; 
     dy = stheta * dx + ctheta * dy; 
     dx = dxtemp; 
     std::cout << cx + dx << "," << cy + dy << std::endl; 
    } 
} 

Nを考えると、あなたはいくつかのエラーがここで蓄積することを見つけるかもしれません。 Nおよびthetaを前提とすると、トリグの角度を近似することができます。

要約:指定された点数が必要で、アークを使用している場合、オプション1に近いものよりもはるかに少ない計算を行う方法を実際に見つけることはできません。

+0

回転行列と同じ操作を実行しているように見えます乗算が行われる。私は行列をやっていると思う。私が「N」と「theta」の私の価値を知っていれば、私は頂点シェーダでマトリックスを生成できます。しかし、ありがとう。 –

+0

これはうまくいきます。パフォーマンスも素晴らしいです。 –

+0

Fine!高速であり、数十または数千の円弧が描かれた場合などにも高速化が可能です。ポリゴンの丸い角。私はc/sthetasが完全な円(角度0-2PI)のためにその関数の外で計算され、カスタム停止基準を実装したバージョンを実装しました:描画はpx、pyから通常通り開始されますが、end coord 'ex'、' ey現在のxがexより大きくても小さくても終了します(上半分と下半分では異なる動作)。私はCCW/CW機能も追加しました(ポリゴンの描画に不可欠ですが、穴があります)。このスニペットをありがとう! –

関連する問題