2009-06-24 12 views
4

現在、私は、さまざまな鋭さ(または感度)を適用するための機能を追加する必要があるコントロールを持っています。問題は、最良の画像として示されている:単純なグラフの問題のように見える

Graph http://img87.imageshack.us/img87/7886/control.png

あなたが見ることができるように、私は両方の100の任意の限界を持っているXとY AXESS持っている - この説明で十分です。現在のところ、私のコントロールは赤い線(線形の振る舞い)ですが、他の3つの曲線(またはそれ以上)の能力を追加したいと思います。つまり、コントロールがより敏感な場合、設定は線形の設定を無視し、 3行のうちの開始点は常に0になり、終了点は常に100になります。

私は指数関数があまりにも急であることを知っていますが、今後の道のりは分かりません。何か提案してください?

+0

なぜC#タグですか?あなたのソリューションは、最終的にはC#かもしれませんが、私はC#で問題は何も見えません。タグを削除する... – abelenky

+0

必要な動作を説明してください。 (開始点/エンドポイントの他に)指数関数的ですか?多項式?対数? 0に近い勾配が線形で、終点を満たすために必要に応じて上方向にズームするように見えます。 –

+0

...または線形と何かの間の補間。 –

答えて

3

あなたが描いたカーブは、カーブがgamma correctionとよく似ています。考えられるのは、範囲の最小値と最大値は入力値と同じにとどまっていますが、グラフの中にあるように中央が曲がっています(ではありません。ではなく、余弦インプリメンテーション)。お使いのxの値は0から1の範囲であった場合は、

...機能をここに、インスピレーションとしてそれで、だから、

alt text http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/GammaFunctionGraph.svg/200px-GammaFunctionGraph.svg.png

数学です:

グラフィカルには、それはこのようになりますむしろ単純である:

y = f(x, gamma) = x^gamma 

(すなわち、X = 0〜100)をスケーリングするためのXMAX値を追加し、関数は次のようになる。

y = f(x, gamma) = ((x/xmax)^gamma) * xmax 

または代わり:

y = f(x, gamma) = (x^gamma)/(xmax^(gamma - 1)) 

あなたはゼロ以外XMINを追加したい場合は、さらに一歩これを取ることができます。

ガンマが1の場合、線は常に完全に線形です(y = x)。 xが1未満の場合、カーブが上に曲がります。 xが1より大きい場合、カーブは下に曲がります。ガンマの逆数は元の値に戻ります(x = f(y、1/g)= f(f(x、g)、1/g)

ガンマの値を自分の好みやアプリケーションのニーズに合わせて調整することができます。ユーザーに「感度向上」の複数のオプションを提供したいので、-4(最小感度)から0変更なし)を4(最も感度が高い)に設定し、内部のガンマ値をパワー関数でスケーリングします。つまり、(-4、-3、-2、-1、0,1,2,3 。

0:4)が、(5.06、3.38、2.25、1.50、1.00、0.67、0.44、0.30、0.20)のガンマ値にそれを翻訳し

C#でそれをコーディングすると、このようになります。

これを使用するには、新しいSensitivityAdjusterを作成し、ユーザーの設定に応じて感度レベルを設定します(コンストラクタまたはメソッドを使用して-4〜4がおそらく妥当なレベル値になります)。Adjust(x)を調整された出力値を取得します。合理的なレベルの幅を広げたり狭めたりしたい場合は、SetSensitivityLevelsメソッドでその1.5の値を減らすか増やします。もちろん、100はあなたの最大x値を表します。

+0

これは解決策でした(私にとってはとにかく)。私はこれを試して、それが働いて、私が必要としたすべてを達成しました。私はあなたが十分なポール、私は犬のようになっていた "これは尾を追いかけている"ことはできません。再度、感謝します! – user68528

0

あなたはおそらくpolynomial interpolationのようなものを探しています。 2次/ 3次/ 4次の補間は、あなたがその問題に示す種類の曲線を与えるべきです。あなたが示している3つの曲線の違いは、おそらく係数(間接的に急峻さを決定する)を調整することによって達成できます。

+0

私はそれを見ており、補間はカーブフィッティングのように、あなたが結合しようとしているいくつかの離散点を持っている場合です.v次に、m = change in x/change in y差別化する。 私のケースは、ユーザーが変数を入力することを許可するか、Steep、Average、およびMild(私が知っているひどい名前)を持つ列挙型から選択して、カーブの急峻さを選択できるようにする単純なケースです。トラックのトラクションコントロールをオフにして、ポイントを補間しないようにしてください。私はそれらを生成する必要があります。 – user68528

+1

ベジェ曲線を試してみてください:http://en.wikipedia.org/wiki/Bézier_curve –

+0

ありがとう、私はこれとAakashMの提案を試してみます。 – user68528

0

xのグラフは、0から1までの範囲で0から1までの範囲で変化します。pから1(赤い線を引く)が上になります。 pが増加すると、カーブはますます「押し込まれる」ようになります。 pは整数である必要はありません。

(あなたが100に0を取得するために拡張する必要があるでしょうが、私はあなたがそれをうまくできると確信している)

+0

x^pここで、p> 1は、0の近くに0の傾きを与えます。これは、描画した曲線のようには見えません。 –

1

私は(私は信じている)は、あなたの要件をキャプチャするという単純な式を提案します。あなたの極端なケースである完全な「四半期円」を得るためには、(1-cos((x*pi)/(2*100)))*100を使用します。

y = xとy =(1-cos((x * pi)/(2 * 100)))* 100の加重平均を取ることをお勧めします。例えば、リニア(99%リニア)に非常に近い持っている、取る:

y = 0.99*x + 0.01*[(1-cos((x*pi)/(2*100)))*100] 

以上、一般的には、直線性のレベルがLであると言う、そしてそれは区間でだ[0、1]、あなたの式はなりますである:

y = L*x + (1-L)*[(1-cos((x*pi)/(2*100)))*100] 

EDIT:COSの範囲であることが結果を[1,0] X [0、PI/2]としない[0の範囲でなければならないので、私は、cos((x*pi)/(2*100))cos(x/100)を変更、1]、最初の間違いをおかけして申し訳ありません。

+0

私は簡単なフォーラムを愛しています。私は証明するためにこれは明日だった。 ありがとうございます! – user68528

0

私は1つの変形例で、ラックスOlgudの一般的な考え方に投票:

y = alpha * x + (1-alpha)*(f(x/100)*100) 

alt text http://www4c.wolframalpha.com/Calculate/MSP/MSP4501967d41e1aga1b3i00004bdeci2b6be2a59b?MSPStoreType=image/gif&s=6

F(0)= 0、F(1)= 1、F(x)は超線形である

、しかし、私はこの四半期円のアイデアがどこから来たのか、なぜ1-cos(x)が良い選択になるのか分かりません。あなた&、α= 0の勾配の所望degreを与えるどんなK = 2、3、4、5は、固定としてkの値をピック

Iは、Fをお勧めしたい(X)= X K次に、αを変更して、特定の曲線を選択します。

+0

私はRax Olgudが四分円と円形関数を選択したと考えています。循環関数は、ある軸の近くにあるときはゆっくり移動し、もう一方の軸の近くのときは最も速く移動するからです。 – Nosredna

0

このような問題については、曲線からいくつかの点を得て、それをカーブフィッティングプログラムにスローします。そこにはたくさんの人がいる。 Here's one with a 7-day free trial.

私はさまざまなモデルを試して多くのことを学びました。しばしば、あなたの曲線に近づくようなきわめて単純な表現を得ることができます。

関連する問題