Analoge Uhr zeichen. Koordinaten der Zeige berechnen?!



  • Hallo,
    Ich versuche im mom
    mit Borland C++ 2007
    eine Uhr zu zeichnen.
    Mein problem ist es die Postition des Stundenzeigers auszurechnen.

    int Winkel;
      x = 0;
      y = 0;
      int x1=0;
      int y1 = 0;
      int x2 = 100;
      int y2 = 100;
      int hour;
      int Maximum = 12;
      int Minimum = 0;
      int Differenz = Maximum - Minimum;
      hour = 3;
      pi = 3.14159265;
      int maxWinkel = 360;  //(FBreite) - ((FBreite + (FBreite*0.2))/2);
      int minWinkel = 0; //minWinkel * (-1);
      float Ergebnis = 0.0;
      Winkel = Cos(minWinkel/maxWinkel);
      Winkel = Winkel * pi / 180; //180 statt 360
      Ergebnis = ((hour - Minimum) /Differenz) * ((180-Winkel) - Winkel) + Winkel;
    
      Ergebnis = Ergebnis * 3.14159265 / 180; //180
      x =  (x2) + (y2) * Cos(Ergebnis);
      //x = (x2) - x;  //Darstellung umkehren//Spiegeln
      y = (y2) + (x2) * Sin(Ergebnis);
      //y = (y2) - y;  //Darstellung umkehren//Spiegeln
    
      Image1->Picture->Bitmap->Canvas->MoveTo(Image1->Picture->Bitmap->Width/2,     Image1->Picture->Bitmap->Height/2);
      Image1->Picture->Bitmap->Canvas->LineTo(x, y);
    

    Ähm jaa klappt überhaupst nicht 😞
    Kann mir jemand helfen?



  • ??? Was'n das ???

    double anghour;
    int xm,ym;
    int lhour;
    anghour=[b]hour [/b]* M_PI / 6.0;
    xm=Image1->Picture->Bitmap->Width / 2;
    ym=Image1->Picture->Bitmap->Height / 2;
    lhour=0.35 * min(Image1->Picture->Bitmap->Width,Image1->Picture->Bitmap->Height);
    x=xm + lhour * sin(anghour);
    y=ym - lhour * cos(anghour));
    Image1->Picture->Bitmap->Canvas->MoveTo(xm,ym); 
    Image1->Picture->Bitmap->Canvas->LineTo(x, y);
    

    Gruss
    Frank



  • Hallo
    Du musst die vergangenen Minuten addieren:

    float alpha=(30*stunde-90)+(0.5*minute)
    

    wNw



  • Ok, ich habe eine analoge Uhr als Zeitvertreib prorammiert:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    #include <math.h>
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    Graphics::TBitmap *Bmp = new Graphics::TBitmap;
    
    float groesse=180;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    FarbenLaden->Execute();
    Form1->Width=groesse*2;
    Form1->Height=groesse*2;
    Bmp->Width=Form1->ClientWidth;
    Bmp->Height=Form1->ClientHeight;
    
    HRGN EHandle=CreateEllipticRgn(0,0,groesse*2+1,groesse*2+1);// Hintergrund
    HDC hdc=GetDC(Form1->Handle);
    SetWindowRgn(Form1->Handle,EHandle,true);
    ReleaseDC(Form1->Handle,hdc);
    }
    //---------------------------------------------------------------------------
    
    void DrawCircle(int x,int y,int rad, TColor farbe)
    {
    TRect Punkt;
    Bmp->Canvas->Brush->Color = farbe;
    Bmp->Canvas->Pen->Color = farbe;
    Punkt.Left=x-rad;
    Punkt.Top=y-rad;
    Punkt.Right=x+rad;
    Punkt.Bottom=y+rad;
    Bmp->Canvas->Ellipse(Punkt);
    }
    //---------------------------------------------------------------------------
    void SekundenZeiger(int sec)
    {
    float alpha=6*sec-90, rad=0, pi=(3.1415), radius=groesse*0.9;
    rad=(alpha*pi)/180;
    for (int i=0;i<radius;i++)
    {
    DrawCircle(groesse+cos(rad)*i,groesse+sin(rad)*i,2,Form1->SekZei);
    }
    DrawCircle(groesse,groesse,4,Form1->ZBlattMitte);    //Mittelpunkt zeichnen
    Form1->Caption=sec;
    }
    //---------------------------------------------------------------------------
    
    void MinutenZeiger(int minute)
    {
    float alpha=6*minute-90, rad=0, pi=(3.1415), radius=groesse*0.7;
    rad=(alpha*pi)/180;
    for (int i=0;i<radius;i++)
    {
    DrawCircle(groesse+cos(rad)*i,groesse+sin(rad)*i,9,Form1->MinZei);
    }
    }
    //---------------------------------------------------------------------------
    void StundenZeiger(int stunde, int minute)
    {
    float alpha=(30*stunde-90)+(0.5*minute), rad=0, pi=(3.1415), radius=groesse*0.5;
    rad=(alpha*pi)/180;
    for (int i=0;i<radius;i++)
    {
    DrawCircle(groesse+cos(rad)*i,groesse+sin(rad)*i,9,Form1->StuZei);
    }
    }
    //---------------------------------------------------------------------------
    void Ziffernblatt()
    {
    float rad=0, pi=(3.1415);
    DrawCircle(groesse,groesse,groesse,Form1->ZBlattRand);     // Aussenkreis
    DrawCircle(groesse,groesse,groesse*0.98,Form1->ZBlattBg); // Innenkreis
    
    int co=0;                                        // Ziffern
    for (int n=0;n<360;n=n+30)
    {
    rad=((n-60)*pi)/180;
    co=co+1;
    Bmp->Canvas->Font->Size=25;
    Bmp->Canvas->Font->Color=Form1->Zahlen;
    Bmp->Canvas->TextOutA((groesse+cos(rad)*groesse*0.75)-4,(groesse+sin(rad)*groesse*0.75)-6,IntToStr(co));
    }
    
    for (int i=0;i<360;i=i+6)                  // Punkte
    {
    rad=(i*pi)/180;
    DrawCircle(groesse+cos(rad)*(groesse*0.9)+1,groesse+sin(rad)*(groesse*0.9),4,Form1->ZBlattPunkte);
    }
    for (int n=0;n<360;n=n+30)                 // Stundenstriche
    {
    rad=(n*pi)/180;
      for (int i=groesse*0.85;i<groesse*0.9;i++)
      {
      DrawCircle(groesse+cos(rad)*i+1,groesse+sin(rad)*i,5,Form1->StuStr);
      }
    }
    }
    //---------------------------------------------------------------------------
    void UhrZeigen()
    {
    unsigned short stunde, minute, sekunde, millisekunde;
    TDateTime::CurrentDateTime().DecodeTime(&stunde, &minute, &sekunde, &millisekunde);
    Ziffernblatt();
    StundenZeiger(stunde,minute);
    MinutenZeiger(minute);
    SekundenZeiger(sekunde);
    Form1->Canvas->Draw(0,0,Bmp);
    }
    
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    UhrZeigen();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    Ende->Execute();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    if (Key==VK_ESCAPE)
    Ende->Execute();
    if (Key==83)
    Setup->Execute();
    
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::EndeExecute(TObject *Sender)
    {
    delete Bmp;
    Application->Terminate();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    
    UhrZeigen();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
        if (Button==mbLeft)
        {   ReleaseCapture();
            SendMessage(Form1->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::SetupExecute(TObject *Sender)
    {
    //ShowMessage("test");
    frmSetup->Show();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FarbenLadenExecute(TObject *Sender)
    {
      TStringList* file = new TStringList;
      file->LoadFromFile("Prefs.txt");
      SekZei = StringToColor(file->Strings[0]);
      MinZei = StringToColor(file->Strings[1]);
      StuZei = StringToColor(file->Strings[2]);
      ZBlattBg = StringToColor(file->Strings[3]);
      ZBlattRand = StringToColor(file->Strings[4]);
      ZBlattPunkte = StringToColor(file->Strings[5]);
      ZBlattMitte = StringToColor(file->Strings[6]);
      StuStr = StringToColor(file->Strings[7]);
      Zahlen = StringToColor(file->Strings[8]);
      delete file;
      }
    //----------------------------------------
    

    Dazu gehört noch ein weiteres Form zum Einstellen der Farben
    sorry für die eine globale Variable
    wNw



  • @ wnw

    Kannst du mal das Programm (möglichst acuh mit quellcode) in ein zip stecken, bei rapidshare o.Ä. hochladen und dann den link posten?



  • Jetzt ist schon Kopieren und Einfügen zu anstrengend!?
    Der Quellcode steht doch da.




Anmelden zum Antworten