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.
-
ausnahmsweise:
http://rapidshare.com/files/171525685/Uhr.zip.html