2017-02-23 1 views
0

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; 
    } 
} 
+0

Ist [dies] (http://stackoverflow.com/q/42421988/560648) Ihr Klassenkamerad? ;) –

+0

Könnte sein, danke für den Link. – cl40

+0

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

Antwort

0

Du wirst die deCasteljau funktionieren Ihre Punkte müssen passieren, auch, weil das ist der ganze Grund de Casteljau-Algorithmus arbeitet (die Sie auch in Ihrem mathematischen Formel zeigen: es liest „den nächsten Punkt = die gewichtete Summe zweier vorheriger Punkte "). Da Sie eine lineare Interpolation zwischen den Punkten tun müssen, müssen Sie mit den Punkten arbeiten =)

In Pseudo-Code:

deCastestljau (t, points): 
    // the following code is destructive, so remember to be sensible 
    points = shallowCopy(points); 
    // de Casteljau's algorithm in four lines: 
    while points.length > 1: 
    for i=0 to points.length-2: 
     points[i] = (1-t) * points[i] + (t) * points[i+1] 
    points.pop() 
    // and we're done. 
    return points[0] 

Das Ende: Sie mit Ihrem Steuerpunkten beginnen, dann haben Sie eine lineare Interpolation Pass Sie erhalten also alle Punkte "zwischen aufeinanderfolgenden Koordinaten" im Entfernungsverhältnis t (zB wenn t 0,25 ist, dann finden Sie jede lineare Interpolation bei 1/4 der Entfernung von einem Punkt zum nächsten).

Diese Operation ergibt eine neue Menge von Punkten 1 weniger als zuvor. Dann machst du es wieder und wieder und wieder, bis du einen Punkt übrig hast. Das ist dein Kurvenpunkt. Dies funktioniert für jede Bestellung Bezier-Kurve.

Es hat auch so gut wie nichts damit zu tun, eine Kurve zu "zeichnen", de Casteljaus Algorithmus ist jedoch eine Möglichkeit, einzelne Punkte auf einer Kurve effizient zu berechnen, sie erhebt keinen Anspruch auf Zeichnung ganze Kurven. Das ist eine ganz andere Aufgabe, für die de Casteljaus Algorithmus nur eine von vielen Möglichkeiten ist, um alle Punkte zu finden, die Sie benötigen, um Ihren Zeichenalgorithmus zu aktivieren.

Verwandte Themen