Run Code
|
API
|
Code Wall
|
Misc
|
Feedback
|
Login
|
Theme
|
Privacy
|
Patreon
Часы (graphics.h)...
#include <graphics.h> #include <iostream.h> #include <math.h> #include <dos.h> #include <conio.h> #include <time.h> #include <stdlib.h> struct TPoint{ double x, y; }; /*ФУНКЦИЯ ПОВОРОТА ТОЧКИ T ВОКРУ O НА angle градусов*/ void rotate(TPoint& T, const TPoint& O, double angle){ angle = angle * M_PI / 180; TPoint temp = T; temp.x = (T.x - O.x) * cos(angle) - (T.y - O.y) * sin(angle) + O.x; //считаем X после поворота на angle градусов temp.y = (T.x - O.x) * sin(angle) + (T.y - O.y) * cos(angle) + O.y; //считает Y поcлt поворота на anglу градусов T = temp; } /*КЛАСС ДЛЯ РИСОВАНИЯ СТРЕЛКИ*/ class Narrow{ TPoint start; //Координата начала int h, w, h2; //Высота самой стрелки, ширина (w) и высота (h2) острия TPoint end, end_; //Конец стрелки. Дублирующая точка для сохранения значения стартогого положения конца TPoint left, right; //левый и правый края острия стрелки int color; public: Narrow(const TPoint& start_, const int h_, const int w_, const int h2):start(start_), h(h_), w(w_){ end.x = start_.x; end.y = start.y - h; end_ = end; //Запоминаем стартовое положение конца. Этот end_ не будем менять, //он нужен только для ориентации на точку, от которой будем поворачивать //при установке времени в произвольный момент работы left.x = end.x - w_; //вычисляем левую точку острия left.y = end.y + h2; right.x = end.x + w; //вычисляем правую точку острия right.y = end.y + h2; } void draw(const int color){ int old_color = getcolor(); //запоминаем текущий цвет setcolor(color); //устанавливаем новый line(start.x, start.y, end.x, end.y); //соединяем точки стрелки линиями line(end.x, end.y, left.x, left.y); line(end.x, end.y, right.x, right.y); line(left.x, left.y, right.x, right.y); setcolor(old_color); //возвращаем предыдущий цвет на место this->color = color; } TPoint get_start() const{ return start; } void rotate(const TPoint& O, const int angle){ //<---- вот эта — это в комментариях эта функция ::rotate(start, O, angle); //такое двоеточие означает обращение к глобальной функции rotate ::rotate(end, O, angle); //эта функция имеет то же имя, что и функция вне класса ::rotate(left, O, angle); //поэтому компилятор без явного указания глобального пространства ::rotate(right, O, angle); //не может сориентироваться правильно } /*ФУНКЦИЯ ДЛЯ УСТАНОВКИ СТРЕЛКИ НА ЧАСОВОМ ЦИФЕРБЛАТЕ*/ double set(const double value, const int step){ end.y = end_.y; //обращаемся к точке-отметке "12 часов" (для этого в Narrow была //создана та end_ (с подчеркиванием) ::rotate(end, start, value * step); //value — это та отметка, на которую ставим ::rotate(left, start, value * step); //step'ом находится угол, который получается при повороте часовой или минутной стрелки ::rotate(right, start, value * step); //Отметка на 3 часах = 3 * часовой угол; отметка на 3 минутах = 3 * минутный угол //1 поворот = номер деления * поворачиваемый градус return value; } int get_color() const{ return color; } }; /*КЛАСС ДЛЯ РИСОВАНИЯ ЦИФЕРБЛАТА*/ class Ciferblat{ TPoint O; //центр циферблата (Он же — центр вращения) int radius; //радиус циферблата int color; //цвет для линий, рисующих циферблат public: Ciferblat(const TPoint& O_, const int radius_, const int color_):O(O_), radius(radius_), color(color_){}; void draw(); //Простой способ рисования void draw(const int radius_, const int step); //Рисование с мелкими наворотами (придаёт красоту) double get_radius() const { return radius; //радиус циферблата будет нужен позже } TPoint get_center() const{ return O; } int get_color() const{ return color; } }; void Ciferblat::draw(){ int old_color = getcolor(); setcolor(color); circle(O.x, O.y, radius); setcolor(old_color); } void Ciferblat::draw(const int r, const int step=6){ TPoint temp; //Точка, которая будет использоваться для движения по коружности temp.x = O.x; //Подбираю координаты из точки на отметке "12 часов". (Просто сверху окружности) temp.y = O.y - radius; int old_color = getcolor(); setfillstyle(SOLID_FILL, color); //устанавливаю способ заливки круга for (int i=0; i<360; i+= step){ //цикл проходит по делениям, поэтому каждый шаг — это угол, получаемый делением 360 градусов окружности на число делений fillellipse(temp.x, temp.y, r, r); //рисую залитый эллипс rotate(temp, O, step); //двигаю точку на следующую позицию, чтобы там нарисовать ещё один эллипс } setfillstyle(EMPTY_FILL, old_color); } void ciferblat_text(const Ciferblat& c, const int count_label, int angle, const int start_, const int color){ TPoint zero_label = c.get_center(); //zero_label — Точка отметки 12 часов, 00 минут, 00 (начало часового отсчёта) temp.y = temp.y - c.get_radius() - 20; //определяю её положение на циферблате temp.x = temp.x - 3; char TEXT[3]; //Это только для перевода int в char* фуенкцией itoa int old_color = getcolor(); setcolor(color); for (int i=0; i<360 ; i+=360. / count_label){ //<---- Вот этот цикл я не смог довести до ума outtextxy(temp.x, temp.y, itoa( i / angle, TEXT, 10)); //<---- Тут я пытаюсь получить номер поворота (номер поворота = часовая отметка) rotate(temp, c.get_center(), 360. / count_label); } setcolor(old_color); } int main(){ int gr = DETECT, gm; initgraph(&gr, &gm, ""); TPoint A; A.x = 170; //A — это будет точка вращения A.y = 190; int csr = 55; //ciferblat_sec radius int cmr = 60; //ciferblat_min radius int chr = 105; //ciferblat_hour radius int sh = csr; //secund high int mh = cmr; //minut high int hh = chr; //hour high int sr = 3; //sec radius int mr = 2; //min radius int hr = 0; //hour radius Narrow sec_narrow(A, sh - mr * 2 - 3, 5, 10); //Настраиваю стрелки (Точка начала стрелки, высота, ширина острия, высота острия) Narrow min_narrow(A, mh - mr * 2 - 3, 5, 10); Narrow hour_narrow(A, hh - hr * 2 - 3, 5, 10); Ciferblat cifer_sec(A, csr, GREEN); //Рисую циферблаты отдельно для каждой стрелки (Центр циферблата, радиус, цвет заливки) Ciferblat cifer_min(A, cmr, GREEN); Ciferblat cifer_hour(A, chr, RED); int sec_value = 0; //Это данные для получения текущего состояния секунд и минут int min_value = 0; int hour_value = 0; /*БЛОК ПОЛУЧЕНИЯ СИТСЕМНОГО ВРЕМЕНИ*/ time_t now = time(NULL); struct tm *tm_struct = localtime(&now); int s = tm_struct -> tm_sec; //zapomiaem secundi dly secundoy strelki int m = tm_struct -> tm_min; //zapominaem minuti int h = tm_struct -> tm_hour; //вообще s m и h можно задать проще: (h = 11), (m = 30), (s = 20) будет означать 11 часов 30 минут 20 секунд, //они просто подбираются тут из системного времени /*КОНЕЦ БЛОКА*/ sec_value = sec_narrow.set(s, 360/60); //Поворачиваем секундую стрелку на угол, соответствующий углу секундной стрелки из ситсемного времени min_value = min_narrow.set(m, 360/60); //Поворчачиваем минутную стрелку hour_value = hour_narrow.set(h, 360/12);//Поворачиваем часовую стрелку int i = 0; while (!kbhit()){ cifer_sec.draw(); //Циферблат для секунд рисуем максимально просто cifer_min.draw(mr); //Циферблат для минут рисуем покрасивее (второй аргумент по умолчанию равен 360/60 [см в параметрах функции], его можно не указывать) cifer_hour.draw(hr, 360/12); //Циферблат для часов тоже рисуем покрасивее (углы поворота минутной и часовой стрелки отличаются) hour_narrow.draw(RED); //Рисуем стрелки min_narrow.draw(YELLOW); sec_narrow.draw(GREEN); ciferblat_text(cifer_hour, 12, 360/12, 12, hour_narrow.get_color()); ciferblat_text(cifer_min, 60/5, 360/60, 0, min_narrow.get_color()); delay(1000); //Задержка в одну секунду (чтобы в эту секунду лицезреть часы) cleardevice(); //очищаем экран sec_narrow.rotate(sec_narrow.get_start(), 360/60); //Поворачиваем секундную стрелку на секундный угол sec_value = (sec_value + 1) % 60; //наращиваем секундное значение if (!sec_value){ //если секундная стрелка достигла 60, то min_narrow.rotate(min_narrow.get_start(), 360/60); //поворачиваем минутную стрелку min_value = (min_value + 1) % 60; //наращиваем минутное значение if (!min_value){ //если при повороте минутная достигла 60 hour_narrow.rotate(hour_narrow.get_start(), 360/12); //поворачиваем часовую стрелку hour_value = (hour_value + 1) % 24; } } } closegraph(); return 0; }
run
|
edit
|
history
|
help
0
Cvičenie -č.6-UDP
Kód
VKI_Mihalyk_3_3
Bubles: secuencia descenciente de números
Projdi si to
cv3
Punteros: creación espacio para un int
Vzdalenost makro inline
pattern1
salida