Gå til innhold

får ikke helt til Bézier kurver....


Anbefalte innlegg

Vel, jeg bruker Bézier sin generelle formel for å kunne interpolere en Bézier-kurve med n punkter, men resultatet mitt blir feil, og jeg klarer ikke å se hvorfor....

 

private static float Interpolate(float ref_point, int count, int index, float t)
{
 int resign = count / 2;
 int c = 1;
 if (index <= resign)
c = index;[/indent]
 else if (index > resign)
c = (count / 2) - ((index) - (count / 2));
 return (c == 0 ? 1 : c * count) * ref_point * Pow(t, index) * Pow(1f - t, (count - 1) - index);
}

 

Som skal bli noe lignende Σindexcount ref_point tindex * (1 - t)count - index

 

Grunnen til at jeg trekker fra en på count, er fordi listen er null-basert.

 

I formelen er ref_point lik Pindex, og t er [0 -> 1]

 

Bézier

 

Kan noen se hva jeg har bommet på?

 

Resultatet blir slik

post-31659-1198333513.png

 

Og det er jo HELT feil....

Lenke til kommentar
  • 3 uker senere...
Videoannonse
Annonse
...

Som skal bli noe lignende Σindexcount ref_point tindex * (1 - t)count - index

...

 

Formelen for Bézier kurve ser feil ut, den skal være slik:

Σindexcount (indexcount)*ref_point*tindex * (1 - t)count - index

som er lik:

Σindexcount (index! / count!*(index-count)!)*ref_point*tindex * (1 - t)count - index

 

Vet ikke helt om du iterer over flere kontroll punkt utenfor interpolate() funksjonen din. Iallfall gitt din funksjon så tar den ikke hensyn til alle kontrollpunktene, kun den ene du har som parameter. Kode som "kan" fungere:

private static float Interpolate(float* ref_point, int index, float t)
{
float qu = 0.0f;
for(int count = 0; count < index; count++)
{
 qu +=  ref_point[count] * (factorial(index)/(factorial(count)*factorial(index-count)*Pow(t, index) * Pow(1f - t, (count - 1) - index);
}
return qu;
}

 

Men.. hvorfor bruker du ikke OpenGLs evaluator funksjoner istedet? Iallfall for tegning av bézier kurver funker det bra, eksempel:

 

Vec3 pControlPoints[4] = {{0,0,0},{50,-50,0},{100,50,0},{150,0,0};


glMap1f(GL_MAP1_VERTEX_3,0,1,3,4, (float*) &pControlPoints[0]);
glEnable(GL_MAP1_VERTEX_3);

glMatrixMode(GL_MODELVIEW);		
glLoadIdentity();
glTranslatef(10,winHeight/2,0);

glBegin(GL_LINE_STRIP);

for(int i = 0; i < 32; ++i)
{
 glEvalCoord1f(float(i)/32.0f);
}

glEnd();

Lenke til kommentar
  • 3 uker senere...

Anbefaler også å implementere tcb-kurver. Dette er kurver hvis kurve alltid går igjennom punktene på kurven, og så har man tre paramtere man kan justere på hvert punkt for å bestemme masse fancy.

 

for eks kan man sette sammen en samlign av tcb-kurver som går fra smooth til linær-kurver, bare ved å forandre på de tre instillingene på kurve-punktene.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...