GeirGrusom Skrevet 22. desember 2007 Rapporter Del Skrevet 22. desember 2007 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 Og det er jo HELT feil.... Lenke til kommentar
tresko Skrevet 8. januar 2008 Rapporter Del Skrevet 8. januar 2008 ...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
GeirGrusom Skrevet 11. januar 2008 Forfatter Rapporter Del Skrevet 11. januar 2008 Takker for svar Grunnen til at jeg ikke bruker OpenGL til dette, er fordi dette skal ikke brukes til grafikk, men til bevegelser, og lignende. Dessuten bruker grafikkmotoren Direct3D. Lenke til kommentar
_vamecum Skrevet 28. januar 2008 Rapporter Del Skrevet 28. januar 2008 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå