PolyBezier?????????



  • Tag,

    kennt sich irgendjemand mit der Funktion CDC::PolyBezier aus (um Splinefunktionen zu zeichnen)und kann mir zum Einen sagen was genau der 2.Parameter darstellen soll(MSDN hat mir nix geholfen!) und warum die Funktion keine Punkte mit negativen Werten akzeptiert
    (Rückgabewert = 0 =>Fehler)?



  • Was heißt die MSDN hat dir nichts geholfen? Die Funktion zeichnet nach der Funktionen von Bezier Kurven. Du übergibst ein Array von POINT-Strukturen die die Startpunkte enthalten, der besagte zweite Parameter gibt die Anzahl dieser POINT-Elemente im Array an.

    MfG SideWinder



  • Das mit dem 2.Parameter hab ich nochmal nachgeschaut (Anzahl der Point-Elemente). Nur akzeptiert die Bezierfunktion keine negativen Point Elemente.
    Geht das gar nicht?



  • Slayer schrieb:

    Das mit dem 2.Parameter hab ich nochmal nachgeschaut (Anzahl der Point-Elemente). Nur akzeptiert die Bezierfunktion keine negativen Point Elemente.
    Geht das gar nicht?

    Hmm, keine Ahnung, kann das der MSDN nicht entnehmen.

    Allerdings kann es sein, dass PolyBezier() immer MM_TEXT als Koordinatensystem heranzieht was uA bedeutet: Es gibt keine negativen Koordinaten am Screen ;).

    MfG SideWinder



  • Also ich hab jetzt mal manuell Werte (auch negative) von einer X^2 Funktion eingegen und das funktioniert (jedoch nicht richtig).
    Es zeichnet zwar die Funktion im negativen Bereich aber im positiven Bereich verbindet es den letzten Wert mit dem Ausgangswert. Vielleicht mal selber ausprobieren. Unten ist der Code.
    Warum tut die Funktion das, wie kann ich es verhindern?
    (Wie kann ich mit dem BezierSpline eine Quadratfunktion optimal zeichnen?)

    CClientDC dc(this);
    	CRect rect;
    	GetClientRect(rect);
    	dc.SetViewportOrg(rect.Width()/2,rect.Height());
    	dc.SetMapMode(MM_ANISOTROPIC);
    	dc.SetViewportExt(rect.Width(),rect.Height());
    	dc.SetWindowExt(rect.Width()/100,rect.Height()/100);
    
    	CPoint points[10];
    
             points[0].x = -2;
    	points[0].y = -4;
    	points[1].x = -1;
    	points[1].y = -1;
    	points[2].x = 0;
    	points[2].y = 0;
    	points[3].x = 1;
    	points[3].y = -1;
    	points[4].x = 2;
    	points[4].y = -4;
    
    	dc.PolyBezier(points,10);
    


  • Also nimmt es ja eh negative Werte?

    Eventuell hast du damit Mist gebaut:

    Each subsequent curve in the sequence needs exactly three more points: the ending point of the previous curve is used as the starting point, the next two points in the sequence are control points, and the third is the ending point.

    Wenns nicht geht, einfach einen Pen in Hintergrundfarbe erstellen und vom Startpunkt wieder zurück zum Endpunkt zeichnen *dirty* ;).

    MfG SideWinder



  • Also irgendwie kapier´ ich jetzt bald überhaupt nichts mehr.
    Ich hab nochmal ein bißchen gebastelt und hab herausgefunden das ich zu viele Elemente reserviert habe 10 statt 5. Hab das dann entsprechend geändert und hab herausgefunden, dass die Bezierfunktion den Spline nur dann zeichnet wenn ich den 2. Parameter der ja die Anzahl der Points angibt auf 10 setze, was aber irgenwie unsinnig ist, wenn ich nur 5 Elemente im Feld habe!
    Außerdem zeichnet die Funktion nun ein noch komischeres Gebilde als vorher , da sie die irgeine verdrehte Funktion die nach unten zeigt ansetzt.

    Den abgeänderten Code hab ich unten (vielleicht probiert´s ja einer mal bei sich noch?)

    CClientDC dc(this);
    	CRect rect;
    	GetClientRect(rect);
    	dc.SetViewportOrg(rect.Width()/2,rect.Height());
    	dc.SetMapMode(MM_ANISOTROPIC);
    	dc.SetViewportExt(rect.Width(),rect.Height());
    	dc.SetWindowExt(rect.Width()/100,rect.Height()/100);
    
    	CPoint points[5];
    
    	points[0].x = -2;
    	points[0].y = -4;
    	points[1].x = -1;
    	points[1].y = -1;
    	points[2].x = 0;
    	points[2].y = 0;
    	points[3].x = 1;
    	points[3].y = -1;
    	points[4].x = 2;
    	points[4].y = -4;
    
    	dc.PolyBezier(points,10);
    


  • Bei der angegebenen Anzahl musst du auch aufpassen:

    Specifies the number of points in the lppt array. This value must be one more than three times the number of curves to be drawn, because each Bézier curve requires two control points and an endpoint, and the initial curve requires an additional starting point.

    Hast du da richtige Werte angegeben?

    MfG SideWinder



  • Was meinst du welchen Wert ich in diesem Falle angeben sollte?
    Ich hab ja 5 Points, dann müsste der Parameter(Anzahl der Punkte) doch 5 sein?! Oder?


Anmelden zum Antworten