Canvas Pfeil zeichnen



  • Hi,

    Also ich möchte mit Hilfe von Canvas einen Pfeil zwischen zwei Punkten zeichnen!
    Nun hänge ich an der Pfeilspitze.

    void cHyper::pfeil_spitze(double x,double y,double a,double b,double alpha)
    {
    ...
    }
    

    Also x,y scheinen klar zu sein!
    a ist die breite der Pfeilspitze und b die Länge.Mit Alpha möchte ich den Pfeil beliebig drehen können.
    Den Code den ich bis jetzt hatte zeichnet mir zwar die spitze,aber nicht im richtigen Winkel.

    Sofern jmd was damit anfangen kann:

    void cHyper::pfeil_spitze(double x,double y,double a,double b,double alpha)
    {
    double x2,x3,y2,y3,beta,c;
    
    c=sqrt(pow(b,2)+pow((a/2),2));
    beta=asin((a/2)/c);
    x2=x-c*sin(90-alpha-beta);
    y2=y-c*sin(alpha+beta);
    y3=y-c*sin(alpha-beta);
    x3=x-c*sin(90-alpha+beta);
    GraphForm->Graph->Canvas->MoveTo(x,y);
    GraphForm->Graph->Canvas->LineTo(x2,y2);
    GraphForm->Graph->Canvas->LineTo(x3,y3);
    GraphForm->Graph->Canvas->LineTo(x,y);
    }
    

    Vielleicht hat jmd ja ne andere Idee oder es gibt einfach schon ne Methode?!
    Ein weiteres Problem wird wohl die Beschriftung sein,da man Texte ja nicht in einem bestimmten Winkel drehen kann,oder?!

    Kann jeden Tip gut gebrauchen!

    MfG yellwnelly



  • TrueType-Fonts können in beliebigem Winkel ausgegeben werden.
    http://www.c-plusplus.net/forum/viewtopic-var-p-is-47817.html

    Der Rest ist eigentlich eher eine Frage fürs Mathe-Forum hier.



  • Vielen Dank für deinen Tip!

    Hab mal das mal ein wenig für mich umgeschrieben

    void cHyper::pfeil_text(char *str,int X, int Y, double Angle)
    {
    GraphForm->Graph->Canvas->Brush->Color=clWhite;
    
    int fontweight;
    DWORD fontitalic, fontunderline, fontstrikeout;
    // create font with specified angle
    // bold?
    if(GraphForm->Graph->Canvas->Font->Style.Contains(fsBold))
            fontweight = FW_BOLD;
    else
            fontweight = FW_NORMAL;
    // italic?
    if(GraphForm->Graph->Canvas->Font->Style.Contains(fsItalic))
            fontitalic = true;
    else
            fontitalic = false;
    // underline?
    if(GraphForm->Graph->Canvas->Font->Style.Contains(fsUnderline))
            fontunderline = true;
    else
            fontunderline = false;
    // strike out?
    if(GraphForm->Graph->Canvas->Font->Style.Contains(fsStrikeOut))
            fontstrikeout = true;
    else
            fontstrikeout = false;
    HFONT hFont = CreateFont(GraphForm->Graph->Canvas->Font->Height, 0, Angle*10, Angle*10, fontweight,
                    fontitalic, fontunderline, fontstrikeout, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
                    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                    GraphForm->Graph->Canvas->Font->Name.c_str());
    // assign created font to canvas
    SelectObject(GraphForm->Graph->Canvas->Handle, hFont);
    // create Rectangle
    TRect R(X,Y,X+GraphForm->Graph->Canvas->TextWidth(str),Y+GraphForm->Graph->Canvas->TextHeight(str));
    // draw text on canvas
    GraphForm->Graph->Canvas->TextRect(R, X, Y, str);
    // free font
    DeleteObject(hFont);
    }
    

    Also fast 1zu1 übernommen.
    Nun folgendes Problem:
    Bei einem Winkel von 90 Grad(vertikal),schreibt er mir einfach gar keinen Text mehr hin!Bei 0 Grad funktioniert es.
    Schriftart deklariere ich hier:

    GraphForm->Graph->Canvas->Font->Name="Bitstream Vera Sans";
    

    Sollte eigentlich ein ttf sein!

    Gruß



  • Stell dir den schrägen Text als Diagonale des zu übergebenden Rects vor.
    Entsprechend gross muss letzteres definiert werden (mindestens).



  • kk danke funzt jetzt 😃


Anmelden zum Antworten