C++에서 베 지어 곡선을 렌더링하려고하므로 직접 구현하기 시작했습니다. 지금은 매우 효율적 일 필요는 없습니다. 내 코드는 어떻게 든 가까운 결과를 산출하지만 그 곡선은 정확하지 않습니다. (dvec2
두 배의 값의 벡터이다.) 현재왜 베지에 곡선 구현에 편향이 있습니까?
list<dvec2> bezier(list<dvec2> const &points, int resolution)
{
list<dvec2> samples;
double step = 1.0/resolution;
for (double time = 0.0; time <= 1.0; time += step) {
list<dvec2> sliders = points;
while (sliders.size() > 1)
sliders = slide(sliders, time);
samples.push_back(sliders.front());
}
return samples;
}
list<dvec2> slide(list<dvec2> const &points, double time)
{
list<dvec2> result;
auto current = points.begin();
dvec2 last = *current;
for (++current; current != points.end(); ++current)
result.push_back(last * time + *current * (1.0 - time));
return result;
}
, I는 시간에 기초하므로, 제 2와 제 세 번째와 두 번째 및 보간하여 커브의 n-1 개의 점을 만들 티. 그런 다음, 같은 알고리즘으로이 새로운 세트의 포인트를 다시 축소합니다. 그 때까지 내가 그릴 수있는 포인트가 하나 남았습니다. 나는이 접근법이 효과가 있다고 생각한다.
렌더링 된 이미지에서 렌더링 된 여러 곡선에서 알고리즘 결과를 볼 수 있습니다.
예를 들어, 아래에서 화상의 좌측의 두 대향 곡선 대칭으로 생각한다. 내 것은 방향으로 치우쳐있다. 또한, 완전히 둘러싸인 커브는 t = 0.5에 대해 중심점을 적어도 그려야합니다. 이 원인은 무엇입니까?
비 const 참조를 사용한다는 사실은 코드를 읽을 때 매우 짜증스럽고 혼란 스럽습니다. 나는 당신이 함수의 목록을 돌연변이시키고 있다고 확신했지만, 사실 당신은 그렇지 않다 ... 그리고 벡터 대신 목록을 사용하는 이유가 있는가? 목록은 거의 모든 유스 케이스 시나리오에서 느립니다. – leemes
@leemes 조언 해 주셔서 감사합니다. 나는 그들을 추가 할 것입니다. – danijar