Implementacja krzywej beziera

0

Witam
Napisałem/popełniłem implementacje krzywej beziera.
Jednak uważam, że to co napisałem działa źle ... sam nie wiem.
Moglibyście zobaczyć czy to ma jakiś sens?
Oto kod:

#include <iostream>
#include <cmath>
using namespace std;
float bezier(float x2, float y2, float x3, float y3, float t)
{
	if(t > 1)t = 1;
	else if (t < 0)t = 0;
	float x1, y1 = 0; 
	float x4, y4 = 1;
	//float wynik = (pow((1-t), (1 / 3.0))*x1) + (pow((1-t), (1 / 2.0))*x2*(3*t))+ ((3*pow((t), (1 / 2.0)))*(1-t)*x3)+(pow((t), (1 / 3.0))*x4);
	std::cout << "x: " << (pow( (1-t),( 1 / 3.0 ) )*x1)+(3*(pow( (1-t),( 1 / 2.0 ) ))*t*x2)+(3*(t-1)*(pow( t,( 1 / 2.0 ) ))*x3)+((pow( t,( 1 / 3.0 ) ))*x4) << std::endl;
	std::cout << "y: " <<(pow( (1-t),( 1 / 3.0 ) )*y1)+(3*(pow( (1-t),( 1 / 2.0 ) ))*t*y2)+(3*(t-1)*(pow( t,( 1 / 2.0 ) ))*y3)+((pow( t,( 1 / 3.0 ) ))*y4) << std::endl;
	std::cout << "t: " << t << std::endl;
}
int main() {
	for(float t = 0; t <= 1.1; t+=0.1)
	bezier(0, 0, 1, 1, t);
	return 0;
}

Link do ideone -> https://ideone.com/LYSQWS
Sugerowałem się tymi stronami:
http://corel.wodip.opole.pl/krzywe_beziera/krzywe_beziera.htm
http://www.algorytm.org/podstawy-grafiki/krzywa-beziera.html
http://cubic-bezier.com/#0,0,1,1
http://www.w3schools.com/cssref/css3_pr_animation-timing-function.asp
Na początek chciałbym uzyskać funkcje liniową żebym mógł sprawdzić czy wartości są poprawne bo jeśli P1 = 0 a P4 = 1 to t=0.5 da wynik funkcji liniowej też 0.5 jednak takiego nie otrzymuje stąd wiem, że funkcja nie działa poprawnie.

0

Na pewno źle masz wykładniki przy potęgach, bo w krzywej bieziera one zawsze są naturalne.
Na wikipedii masz bardzo przejrzysty wzór
user image

0

Już działa, a przynajmniej tak sądzę.
Oto kod:

#include <iostream>
#include <cmath>
using namespace std;
float bezier(float x2, float y2, float x3, float y3, float t)
{
	if(t > 1)t = 1;
	else if (t < 0)t = 0;
	float x1, y1 = 0; 
	float x4, y4 = 1;
	std::cout << "x: " << ((x1*(pow ((1-t), 3.0)))+(3*x2*t*(pow ((1-t), 2.0)))+(3*x3*(pow (t, 2.0))*(1-t))+(x4*(pow ((t), 3.0)))) << std::endl;
	std::cout << "y: " << ((y1*(pow ((1-t), 3.0)))+(3*y2*t*(pow ((1-t), 2.0)))+(3*y3*(pow (t, 2.0))*(1-t))+(y4*(pow ((t), 3.0)))) << std::endl;
	std::cout << "t: " << t << std::endl;
}
int main() {
	for(float t = 0; t <= 1.1; t+=0.1)
	bezier(0, 0, 1, 1, t);
	return 0;
}

Kod do ideone -> https://ideone.com/FawTez
Jeśli mógłbyś to zerknij na to czy jest dobrze.

0
    float x1, y1 = 0; 
    float x4, y4 = 1;

to nie nadaje wartości zmiennym x1, x4.
sama formuła wygląda teraz poprawnie

0

Wiem jak to wkleiłem w GCC to mnie ostrzegł, już poprawiłem :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1