oliczanie kątowe casu wskazówek

oliczanie kątowe casu wskazówek
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

minute i sekunde łatwo policzyć
s - sekunda
m-minuta
g-godzina
x,y,lewa górna strona tekstury
128 od środka bo jest 256*256
sr i mr i gr promień sekundy i minuty i godziny

int g,m,s,sr,mr,gr;
int sx,sy,mx,my,gx,gy;
sr=100;
mr=80;
gr=120;

	 Clock cl;
	
	 cl.GetTime(g,m,s);

sx=x+128+sr*sin(((60-s)*6+180)3.141592658/180);
sy=y+128+sr
cos(((60-s)*6+180)3.141592658/180);
mx=x+128+mr
sin(((60-m)*6+180)3.141592658/180);
my=y+128+mr
cos(((60-m)*6+180)*3.141592658/180);

jak policzyć godzine
w tym miejscu bo teraz jest uskokowo tzn do pełnej godziny
gx=x+128+gr*sin(((360-g)*360/12+180)3.141592658/180);
gy=y+128+gr
cos(((360-g)*360/12+180)*3.141592658/180);

jak doliczyć do kąta godziny kąt minuty , wzór ?

godzin 12 czyli po 30 stopni na godzine + minuta ?

Color3iT(255,0,255);
PutLine(x+128,y+128,sx,sy);

Color3iT(255,0,0);
PutLine(x+128,y+128,mx,my);

Color3iT(0,0,0);
PutLine(x+128,y+128,gx,gy);

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 540
0

Kąt godziny + 1/60/12*minuty ?

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Z 20 lat temu coś takiego robiłem w Borlandzie 6 :) Jest to część kodu, ale może Ci pomoże.

Kopiuj
SYSTEMTIME stCzas;
double     dGodzina,
           dMinuta,
           dSekunda;
int        iGodzina,
           iMinuta,
           iSekunda;
//
bmp->Canvas->Pen->Color=tcTlo;
bmp->Canvas->Brush->Color=tcTlo;
bmp->Canvas->Ellipse(cx-d/2,cy-d/2,cx+d/2,cy+d/2);  /* Tarcza zegara*/
//
GetLocalTime(&stCzas);
iGodzina=stCzas.wHour;
iMinuta=stCzas.wMinute;
iSekunda=stCzas.wSecond;
//
  if((iMinuta == 0) && (iSekunda == 0))
   PlaySound("WAVE_KUK",HInstance,SND_ASYNC | SND_RESOURCE);
//
dSekunda=iSekunda*2*M_PI/60.0;
dMinuta=iMinuta*2*M_PI/60.0;
dGodzina=(iGodzina*2*M_PI/12.0)+(dMinuta/12);
//
bmp->Canvas->Pen->Color=tcKropki;
bmp->Canvas->Brush->Color=tcKropki;  /* Kropki */
  for(int i=0;i<12;i++)
  {
   double dia,
          pv=(i*(double)(2*M_PI/12.0)),
          px=cx+((d/2-5)*(double)sin(pv)),
          py=cy-((d/2-5)*(double)cos(pv));
   ((i%3) == 0) ? dia=3.5 : dia=2.5;  /* Wielkosc kropek */
   bmp->Canvas->Ellipse((int)(px-dia),(int)(py-dia),(int)(px+dia),(int)(py+dia));
  }
//
bmp->Canvas->Pen->Color=tcWskazowki;  /* Wskazowki */
bmp->Canvas->Pen->Width=2;
int mx=(int)(cx+50*sin(dMinuta)),  /* Dlugosc wskazowki */
    my=(int)(cy-50*cos(dMinuta));  /* Dlugosc wskazowki */
bmp->Canvas->MoveTo(cx,cy);
bmp->Canvas->LineTo(mx,my);
//
bmp->Canvas->Pen->Width=3;
int hx=(int)(cx+30*sin(dGodzina)),
    hy=(int)(cy-30*cos(dGodzina));
bmp->Canvas->MoveTo(cx,cy);
bmp->Canvas->LineTo(hx,hy);
//
bmp->Canvas->Pen->Width=1;
int sx=(int)(cx+55*sin(dSekunda)),
    sy=(int)(cy-55*cos(dSekunda));
bmp->Canvas->MoveTo(cx,cy);
bmp->Canvas->LineTo(sx,sy);
//
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

za dużo tych parametrycznych mozna jakoś łatwiej tzn tak rysowania kropek i wskazówek i koła zegara nie potrzebuje bo mam teksture 256 na 256 do rysowanie linii bedzie od srodka tzn
128na128 do 256 na 256 oczywiscie jesli promien bedzie mial 128 długosci w pikselach , bo jest tak

dMinuta=iMinuta2M_PI/60.0;
dGodzina=(iGodzina2M_PI/12.0)+(dMinuta/12);
int hx=(int)(cx+30*sin(dGodzina)),

ja tego nie rozumiem mozna łatwiej policzyc godziny jakoś np
alpha= .. //liczenie kątowe dla godziny
xw=x+połowaX+R * sin(alphaPI/180)
yw=y+polowaY+R * cos(alpha
PI/180)
gdzie xw i yw to pozycja konca strzałki na obwodzie tarczy

no widze to MoveTo(cx,cy) i LineTo(mx,my) , początek i koniec lini strzałki

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Jak za dużo, to patrz tylko na funkcje MoveTo i LineTo. Może i można łatwiej. Jak sam dojdziesz jak, to będziesz miał większą satysfakcję. Ja napisałem tylko jeden z działających przykładów.

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

ja nie rozumiem tej arytmetyki którą napisałes, przepraszam ale za trudne to dla mnie jak możesz to sprawdz i zapodaj to:
alpha= .. //liczenie kątowe dla godziny
xw=x+połowaX+R * sin(alpha * PI / 180)
yw=y+polowaY+R * cos(alpha * PI /180)
gdzie xw i yw to pozycja konca strzałki na obwodzie tarczy
x i y pozycja przesunięcia a połowa to wartosc od srodka tekstuy do tarczy

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Niestety nie jestem matematykiem, a do szkoły chodziłem prawie 30 lat temu. Moje chyba wzorowałem na jakimś przykładzie z internetu. W google jest wszystko :)

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

są w google jakies dziwne algorytmy ale konkretu to prawie wcale

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

wie ktos jak sobie z tym poradzic?

alpha= .. //liczenie kątowe dla godziny z zmiennych
xw=x+połowaX+R * sin(alpha * PI / 180)
yw=y+polowaY+R * cos(alpha * PI /180)
gdzie xw i yw to pozycja konca strzałki na obwodzie tarczy
x i y pozycja przesunięcia a połowa to wartosc od srodka tekstuy do tarczy
R oznacza promien czyli długość strzałki

Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2202
3

jak doliczyć do kąta godziny kąt minuty , wzór ?

godzin 12 czyli po 30 stopni na godzine + minuta ?

Ja bym operował w sekundach względem czasu 00:00
1m = 60s (jeden obrót wskazówki sekundowej)
1h = 3600s (jeden obrót wskazówki minutowej)
12h = 43200s (jeden obrót wskazówki godzinowej

np.

Kopiuj
// czasWzgledemZero w sekundach

KAT_SEKUND = (czasWzgledemZero % 60)  / 60.0 * 2*PI  
KAT_MINUT = (czasWzgledemZero % 3600)  / 3600 * 2*PI
KAT_GODZIN = (czasWzgledemZero % 43200)  / 43200 * 2*PI

A pozycja wskazówki to potem tylko sin i cos z odpowiednia korekta konta

overcq
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 402
0

U mnie dzielę tarczę na osiem części i w funkcji E_main_I_draw_Z_angle_line dodaję x i y względem środka zegara w zależności od przypadku (1 z 8).

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
5
Kopiuj
struct ClockHandsInRadians {
    double hours;
    double minutes;
    double seconds;
};

ClockHandsInRadians makeSharpClockHandsFrom(std::tm t)
{
    std::mktime(&t);
    return {
        2 * std::numbers::pi / 12 * (t.tm_hour % 12),
        2 * std::numbers::pi / 60 * (t.tm_min % 60),
        2 * std::numbers::pi / 60 * (t.tm_sec % 60),
    };
}

ClockHandsInRadians makeSmoothClockHandsFrom(std::tm t)
{
    std::mktime(&t);
    return {
        2 * std::numbers::pi / (60 * 12) * ((t.tm_hour * 60 + t.tm_min) % (60 * 12)),
        2 * std::numbers::pi / 3600 * ((t.tm_min * 60 + t.tm_sec) % 3600),
        2 * std::numbers::pi / 60 * t.tm_sec,
    };
}

https://godbolt.org/z/oMoGcxs8T

Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2202
0

@MarekR22: zawszę jak oglądam Twój kod coś się uczę
chciałbym zobaczyć jakiś Twój duży projekt , coś publicznie jest dostępne ?

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

ok mam tak
g oznacza godzine od 00 :00 do 24 : 00
float PI=3.141592658;
float alpha=((360-g) * 30+180); ...// + minuty tylko co wpisac
gx=x+128+gr * sin(alpha * PI / 180);
gy=y+128+gr * cos(alpha * PI / 180);

360 / 12 = 30 stopni na godzine * godzina aktualna

jest 360-g poniewaz strzałki obracały się w drugą strone tzn z powrotem a + 180 bo trzeba było obrócić o połowe do przodu bo pokazywalo by godizne 9:00 zamiast 3:00
bo np sekundy jak i minuty alpha licze tak alpha=((60 - s ) * 6+180) albo ((60 - m) * 6+180)
6 dlatego ze 6 stopni liczy sie jedna sekunda kątowo jak i minuta bo sekund jak i minut jest po 60 czyli 60*6=360 stopni pełne koło
teraz rozumiecie zabawę w sinusa i cosinusa?

screenshot-20250209033742.png
przepraszam ale ja nie rozumiem waszych wypowiedzi względem arytmetyki jakiej zapodaliście

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

bo sin i cos jak podaz dwa rózne promienie o tym samym kącie to mozna polczyc rzutowanie grafiki prostopadle-prostokątne a twierdzeniem talesa rzutowanie pesrpektywistyczne , fajna sprawa 😀

BR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 32
0

Jak się potoczyła sprawa zegara? Jakieś postępy? Czytając sam zainteresowałem się zrobieniem zegara. Sądziłem że to będzie łatwiejsze i szybsze ale się pomyliłem. Wyszło co wyszło z estetycznego i technicznego punktu widzenia ale może się czegoś nauczyłem.

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

ja moze dzisiaj bede mial fragment kodu alpha do tej zmiennej jak doliczyc minuty to zamieszcze info.. postem

BR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 32
0

Jakby to miało pomóc to przesyłam to co mnie się udało zrobić. Tragedii chyba nie ma. Liczb brakuje ale to może jeszcze dorobię.

Kopiuj
#include <cmath>
#include <memory>
#include <chrono>
#include <numbers> 

#include <raylib.h>

const Color DARKGREEN_DIM {0, 117, 44, 96};
const Color DARKBLUE_DIM {0, 82, 172, 128};
const Color MAGENTA_DIM {255, 0, 255, 64};

struct Point2D
	{
	double x;
	double y;

	Vector2 toVector2() const
		{
		return Vector2(static_cast<double>(x), static_cast<double>(y));
		}
	};

class Clock
	{
	struct Hand
		{
		Point2D position;
		Point2D guide;
		double angle;
		double length;
		double resolution;
		};

	struct Hands
		{
		Hand hours;
		Hand minutes;
		Hand seconds;
		};

	struct Ticks
		{
		std::vector<Point2D> major {};
		std::vector<Point2D> minor {};
		};

	const Point2D face_origin;
	const double radius;
	std::chrono::microseconds time;
	Ticks ticks;
	Hands hands;

	void calculateHands()
		{
		for(auto hand : {&hands.hours, &hands.minutes, &hands.seconds})
			{
			hand->angle = (std::numbers::pi / hand->resolution) * (time.count() / 1e6);
			hand->position.x = face_origin.x + (radius * hand->length * std::sin(hand->angle));
			hand->position.y = face_origin.y + (radius * hand->length * -std::cos(hand->angle));
			hand->guide.x = face_origin.x + (radius * std::sin(hand->angle));
			hand->guide.y = face_origin.y + (radius * -std::cos(hand->angle));
			}
		}

	void calculateTicks()
		{
		for(double angle {0}; angle <= 2 * std::numbers::pi; angle += std::numbers::pi / 6)
			{
			ticks.major.emplace_back(face_origin.x + (radius * std::sin(angle)), face_origin.y + (radius * -std::cos(angle)));
			}

		for(double angle {0}; angle <= 2 * std::numbers::pi; angle += std::numbers::pi / 30)
			{
			ticks.minor.emplace_back(face_origin.x + (radius * std::sin(angle)), face_origin.y + (radius * -std::cos(angle)));
			}
		}

	void draw() const
		{
		DrawCircleLines(face_origin.x, face_origin.y, radius, RAYWHITE);
		DrawCircleLines(face_origin.x, face_origin.y, radius + 1, RAYWHITE);
		drawTicks();
		drawHands();
		}

	void drawTicks() const
		{
		for(auto& tick : ticks.major)
			{
			DrawCircle(tick.x, tick.y, 5, GOLD);
			}

		for(auto& tick : ticks.minor)
			{
			DrawCircle(tick.x, tick.y, 2.5, GOLD);
			}
		}

	void drawHands() const
		{
		DrawLineEx(face_origin.toVector2(), hands.hours.position.toVector2(), 7, DARKGREEN);
		DrawLineEx(face_origin.toVector2(), hands.hours.guide.toVector2(), 1, DARKGREEN_DIM);
		DrawLineEx(face_origin.toVector2(), hands.minutes.position.toVector2(), 5, DARKBLUE);
		DrawLineEx(face_origin.toVector2(), hands.minutes.guide.toVector2(), 1, DARKBLUE_DIM);
		DrawLineEx(face_origin.toVector2(), hands.seconds.position.toVector2(), 3, MAGENTA);
		DrawLineEx(face_origin.toVector2(), hands.seconds.guide.toVector2(), 1, MAGENTA_DIM);
		}

	public:
	Clock(Point2D origin, double radius) : face_origin(origin), radius(radius)
		{
		calculateTicks();
		hands.hours.length = 0.6;
		hands.hours.resolution = 21600;
		hands.minutes.length = 0.85;
		hands.minutes.resolution = 1800;
		hands.seconds.length = 0.98;
		hands.seconds.resolution = 30;
		}

	void refresh()
		{
		using namespace std::chrono;
		time = floor<microseconds>(zoned_time{current_zone(), system_clock::now()}.get_local_time() - floor<days>(zoned_time{current_zone(), system_clock::now()}.get_local_time()));
		calculateHands();
		draw();
		}
	};

int main()
	{
	SetConfigFlags(FLAG_WINDOW_RESIZABLE);
	InitWindow(50, 50, "raylib - clock");
	SetWindowSize(GetMonitorWidth(0) / 2, GetMonitorHeight(0) / 2);
	SetWindowPosition(GetMonitorWidth(0) / 4, GetMonitorHeight(0) / 4);

	std::unique_ptr<Clock> clock = std::make_unique<Clock>(Point2D(GetScreenWidth() / 2.0, GetScreenHeight() / 2.0), GetScreenHeight() * 0.42);

	while(!WindowShouldClose())
		{
		BeginDrawing();
		ClearBackground(BLACK);
		if(IsWindowResized())
			{
			clock = std::make_unique<Clock>(Point2D(GetScreenWidth() / 2.0, GetScreenHeight() / 2.0), (GetScreenHeight() > GetScreenWidth() ? GetScreenWidth() : GetScreenHeight())  * 0.42);
			}
		if(clock.get() != nullptr) clock->refresh();
		EndDrawing();
		}
	CloseWindow();
	return 0;
	}

Chciałem dać w załączniku ale go odrzucał bo nie jest .cpp a przecież jest. Nie wiem o co chodzi i nie mam czasu się zastanawiać.

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

psia mać doszedłem liczenie kąta alhpa dla godziny na podstawie zmiennej godziny i minuty to cały wzór:
float PI=3.141592658;
float alpha=(360 - g * 30 +180)-float(m) * 6 / 360 * 30;
gx=x+128+gr * sin(alpha * PI / 180);
gy=y+128+gr * cos(alpha * PI / 180);

tego kawałka szukałem "-float(m) * 6 / 360 * 30"

jak dodam akceleracje zeby nie muliło do projektu DrawConsole to zapodam przykład z tym zegarkiem

wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

void DrawClock(int x,int y)
{
int g,m,s,sr,mr,gr;
int sx,sy,mx,my,gx,gy;
sr=120;
mr=85;
gr=75;
DrawObiectImage(x,y,id_zegar);

	 Clock cl;
	
	 cl.GetTime(g,m,s);
	
	 sx=x+128+sr*sin(((60-s)*6+180)*3.141592658/180);
	 sy=y+128+sr*cos(((60-s)*6+180)*3.141592658/180);
	 mx=x+128+mr*sin(((60-m)*6+180)*3.141592658/180);
	 my=y+128+mr*cos(((60-m)*6+180)*3.141592658/180);

	 float PI=3.141592658;
	 float alpha=(360-g*30+180)-float(m)*6/360*30;
	 gx=x+128+gr * sin(alpha * PI / 180);
	 gy=y+128+gr * cos(alpha * PI / 180);
	
	 Color3iT(0,255,0);
	 PutLine(x+128,y+128,sx,sy);
     
	 Color3iT(255,0,0);
	 PutLine(x+128,y+128,mx,my);

	 Color3iT(0,0,0);
	 PutLine(x+128,y+128,gx,gy);
 }

 zrobiłem dwa zegary jeden 256x256 a drugi duży 512x512
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

screenshot-20250211045635.png

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.