2017-01-25 7 views
0

나는 f (x) = sin (x)와 같은 수학 함수를 나타내는 SFML 라이브러리를 사용하여 C++로 프로그램을 작성합니다. 포인트를 플롯하는 데 사용되는 코드는 다음과 같습니다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']를 통해 윈도우 antialising 수 있도록하는 것을 시도했다 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

- 즉 , 작은 라인을 가지고있다. 이는 달성하기가 쉽고 사용 사례에 적합 할 수 있습니다.

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)))); 
} 
코멘트에

Sean Cline의 예는 좋은 출발점이되어야한다

마지막으로 멋진 인터페이스 뒤에서이를 추상화 할 수 있습니다.

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