2017-01-25 13 views
0

私はf(x)= sin(x)のような数学的関数をプロットするSFMLライブラリを使ってC++でプログラムを構築しています。あなたはプロットが滑らかではないとSFによる短い線で構成されて見ることができるようにSFMLで滑らかな曲線を描く

enter image description here

:ポイントをプロットするために使用されるコードは次のとおりです。

VertexArray curve(PrimitiveType::LineStrip, 100); 
for (int x = -50; x < 50; x++) 
{ 
    curve.append(Vertex(Vector2f(x,- sin(x)))); 
} 

このコードは、このプロットを作成します::ラインストップ。このプロットを(SFMLで)線図を短くするなど、スムーズにする方法はありますか? フィードバックは非常に高く評価されています:)。

+0

あなたは[ 'ContextSettings'](https://www.sfml-dev.org/documentation/2.0/を経由して、ウィンドウのためにアンチエイリアス有効にしみましたstructsf_1_1ContextSettings.php)? –

+2

あなたは「1」単位でプロットしています。曲線上のポイントを増やすには、小さい数字で増分してみてください。クイックテストとしてループを 'for(float x = -50.0f; x <50.0f; x + =。25f)'に変更することができます。 –

+0

@SimonKraemer私はちょうど試したが効果がないようだ。 – billy606

答えて

1

最も簡単なオプションは、線の解像度を高めることである - すなわちより小さい線を有します。これは達成するのが簡単で、ユースケースで受け入れられるかもしれません。コメント欄で

Sean Clineの例では、良い出発点でなければなりません:

for (float x = -50.0f; x < 50.0f; x += .25f) 
{ 
    curve.append(Vertex(Vector2f(x,- sin(x)))); 
} 

あなたは、簡単に範囲ステップを一般化した値で遊ぶことができます。

float min_range = -200.f; 
float max_range = 200.f; 
float step = 0.5f; 

for (float x = min_range; x < max_range ; x += step) 
{ 
    curve.append(Vertex(Vector2f(x,- sin(x)))); 
} 

最後に、これを素敵なインターフェイスの背後で抽象化することができます:

using precision = float; 

struct plot_params 
{ 
    precision _min_range; 
    precision _max_range; 
    precision _step; 
}; 

template <typename TFunction> 
auto plot(const plot_params pp, TFunction&& f) 
{ 
    assert(pp._min_range <= pp._max_range); 
    assert(pp._step > 0.f); 

    VertexArray curve(PrimitiveType::LineStrip, 
     std::ceil((pp._max_range - pp._min_range)/pp._step); 

    for (auto x = pp._min_range; x < pp._max_range; x += pp._step) 
    { 
     curve.append(Vertex(f(x))); 
    } 
} 

そして、次のようにplotを使用することができます。

const auto my_params = [] 
{ 
    plot_params pp; 
    pp._min_range = -200.f; 
    pp._max_range = 200.f; 
    pp._step = 0.5f; 
    return pp; 
})(); 

auto curve = plot(my_params, 
        [](auto x){ return Vector2f(x,- sin(x)); }); 
+0

私は最初のオプションを先に試しましたが、私のコードは機能しませんでした。しかし、@SeanClineはこの問題をforループで修正したようだ。 – billy606

+0

しかし、ベジェ曲線のリンクをありがとう。私はそれらについて研究します。 – billy606

+0

ベジェ曲線の使用はここで意味をなさない。なぜなら、実際の数式を使用するだけで補間する必要はないからです。とにかく頂点を計算/描画する必要がありますので、すぐに直してください。 – Mario

関連する問題