Ich weiß mit De Casteljaus Algorithmus ist nicht der beste Weg, um eine Bezier-Kurve zu zeichnen, aber ich muss es für eine Zuweisung implementieren Ich definiere meinen Algorithmus auf der Grundlage der folgenden Gleichungen (von Drexel).Wie spezifiziere ich die spezifischen Kontrollpunkte in einem De Casteljau-Algorithmus, wenn ich geschachtelte for-Schleifen verwende, um zu iterieren?
Wo:
die Kontrollpunkte definiert.
Ich versuche, die Funktion zu definieren, um den Algorithmus zu tun, aber kämpfe mit wo/wie die Kontrollpunkte zu integrieren. Die Kontrollpunkte werden vom Benutzer definiert; Wenn sie mit dem Programm interagieren, fügt ein Linksklick einen neuen Kontrollpunkt hinzu. Meine Funktion sieht derzeit wie folgt:
2Dpoint deCast(float t)
{
2Dpoint tempDC // Temporary value of point passed back to OpenGL draw function
tempDC.x = 0; tempDC.y = 0 // Initialize temporary value
int r,i;
int n = C->B.size(); // C is pointer to B vector, which is where the control points are stored in a 2D vector
for (r = 1; r<n, r++)
{
for (i = 0; i<n-r; i++)
{
// Calculation of deCast points goes here
}
}
}
Wo 2Dpoint
ist nur eine Struktur, die durch eine Header-Datei definiert, C
ist ein Zeiger auf die Position der Kontrollpunkte, die gespeichert sind, in ein 2Dpoint
struct B
genannt (dh die i
Wert des Kontrollpunktvektors wird durch C -> B[i].x
und C -> B[i].y
zugegriffen). t
wird der Funktion zur Verfügung gestellt, wenn sie in meiner draw
Funktion implementiert ist, wie unten gezeigt.
void draw()
{
glColor3f(0.0f, 1.0f, 0.0f);
glLineWidth(2.0f);
glBegin(GL_LINE_STRIP);
float DCiter = 0;
while (DCiter <= 1.0)
{
2Dpoint DC = decast(DCiter);
glVertex2f(DC.x, DC.y);
DCiter = DCiter + 0.01;
}
}
Ist [dies] (http://stackoverflow.com/q/42421988/560648) Ihr Klassenkamerad? ;) –
Könnte sein, danke für den Link. – cl40
1. Sie verpassen 'glEnd()' nach der while-Schleife. 2. Warum hast du zwei verschachtelte '' s? 3. Sie benötigen Temp, um die Kopie Ihrer Kontrollpunkte zu speichern (wie sie sich ändern würden), andernfalls würden Sie Ihre ursprünglichen Kontrollpunkte nach der Berechnung des ersten Punktes auf der Kurve verfälschen. Fügen Sie also eine lokale Kopie von 'B' hinzu und reduzieren Sie bei jeder Iteration von' for' die Anzahl der Punkte um eins, bis nur noch eins übrig bleibt, was Ihr Ergebnis ist (keine Notwendigkeit für 'tempDC') – Spektre