GeirGrusom Skrevet 22. desember 2007 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....
tresko Skrevet 8. januar 2008 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();
GeirGrusom Skrevet 11. januar 2008 Forfatter 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.
_vamecum Skrevet 28. januar 2008 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.
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å