Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 11.10.2019
Сообщений: 16
1

Электронные семисегментные часы

17.12.2019, 21:39. Показов 1830. Ответов 4
Метки с++ (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно с помощью библиотек SFML создать электронные семисегментные часы, которые идут в настоящее время.
Библиотека подключена к Visual Studio 2019.

Вот код, но ошибок много(думаю что я не подключила какие-то библиотеки или вообще такое не используется в SFML)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include<SFML/Graphics.hpp>
#include<iostream>
#include<istream>
#include<string>
void TForm1::segments()  // and dots
{
    BYTE i;
    Canvas->Brush->Color = Color;
    Canvas->Pen->Color = clBlack;
    for (i = 0; i < 6; i++)
    {
        Canvas->Rectangle(dif + 2 * dif * i, dif, 2.5 * dif + 2 * dif * i, 5 * dif);
        Canvas->MoveTo(dif + 2 * dif * i, 3 * dif);
        Canvas->LineTo(2.5 * dif + 2 * dif * i, 3 * dif);
    }
    Canvas->Brush->Color = clBlack;
    Canvas->Pen->Color = clBlack;
    for (i = 0; i < 2; i++)
    {
        Canvas->Ellipse(4.7 * dif + 4 * dif * i, 1.95 * dif, 4.8 * dif + 4 * dif * i, 2.05 * dif);
        Canvas->Ellipse(4.7 * dif + 4 * dif * i, 3.95 * dif, 4.8 * dif + 4 * dif * i, 4.05 * dif);
    }
}
//---------------------------------------------------------------------------
void TForm1::lines(BYTE num, BYTE pos)
{
    const w = 2;
    Canvas->Brush->Color = clBlue;
    Canvas->Pen->Color = clBlue;
    switch (num)
    {
    case 1:
        Canvas->Rectangle(1 * dif + 2 * dif * (pos - 1), dif - w, 2.5 * dif + 2 * dif * (pos - 1), dif + w);
        break;
    case 2:
        Canvas->Rectangle(2.5 * dif + 2 * dif * (pos - 1) - w, dif, 2.5 * dif + 2 * dif * (pos - 1) + w, 3 * dif);
        break;
    case 3:
        Canvas->Rectangle(2.5 * dif + 2 * dif * (pos - 1) - w, 3 * dif, 2.5 * dif + 2 * dif * (pos - 1) + w, 5 * dif);
        break;
    case 4:
        Canvas->Rectangle(1 * dif + 2 * dif * (pos - 1), 5 * dif - w, 2.5 * dif + 2 * dif * (pos - 1), 5 * dif + w);
        break;
    case 5:
        Canvas->Rectangle(1 * dif + 2 * dif * (pos - 1) - w, 3 * dif, 1 * dif + 2 * dif * (pos - 1) + w, 5 * dif);
        break;
    case 6:
        Canvas->Rectangle(1 * dif + 2 * dif * (pos - 1) - w, 1 * dif, 1 * dif + 2 * dif * (pos - 1) + w, 3 * dif);
        break;
    default:
        Canvas->Rectangle(1 * dif + 2 * dif * (pos - 1), 3 * dif - w, 2.5 * dif + 2 * dif * (pos - 1), 3 * dif + w);
    }
}
//---------------------------------------------------------------------------
void TForm1::digits(BYTE num, BYTE pos)
{
    switch (num)
    {
    case 0:
        lines(1, pos);
        lines(2, pos);
        lines(3, pos);
        lines(4, pos);
        lines(5, pos);
        lines(6, pos);
    case 1:
        lines(2, pos);
        lines(3, pos);
        break;
    case 2:
        lines(1, pos);
        lines(2, pos);
        lines(4, pos);
        lines(5, pos);
        lines(7, pos);
        break;
    case 3:
        lines(1, pos);
        lines(2, pos);
        lines(3, pos);
        lines(4, pos);
        lines(7, pos);
        break;
    case 4:
        lines(2, pos);
        lines(3, pos);
        lines(6, pos);
        lines(7, pos);
        break;
    case 5:
        lines(1, pos);
        lines(3, pos);
        lines(4, pos);
        lines(6, pos);
        lines(7, pos);
        break;
    case 6:
        lines(1, pos);
        lines(3, pos);
        lines(4, pos);
        lines(5, pos);
        lines(6, pos);
        lines(7, pos);
        break;
    case 7:
        lines(1, pos);
        lines(2, pos);
        lines(3, pos);
        break;
    case 8:
        lines(1, pos);
        lines(2, pos);
        lines(3, pos);
        lines(4, pos);
        lines(5, pos);
        lines(6, pos);
        lines(7, pos);
        break;
    default:
        lines(1, pos);
        lines(2, pos);
        lines(3, pos);
        lines(4, pos);
        lines(6, pos);
        lines(7, pos);
    }
}
//---------------------------------------------------------------------------
void TForm1::watches()
{
    TDateTime now = Time();
    digits(HourOf(now) / 10, 1);
    digits(HourOf(now) % 10, 2);
    digits(MinuteOf(now) / 10, 3);
    digits(MinuteOf(now) % 10, 4);
    digits(SecondOf(now) / 10, 5);
    digits(SecondOf(now) % 10, 6);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject * Sender)
{
    // ClientHeight = 300;
    // ClientWidth = 675;
    // Timer1->Interval = 1000;
    // Timer1->Enabled = 1;
    segments();
    watches();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject * Sender)
{
    Refresh();
}
Добавлено через 47 минут
Пишу на с++
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2019, 21:39
Ответы с готовыми решениями:

Электронные семисегментные часы
Не могу сделать электронные семисегментые часы с изпользованием библиотеки graphics.h. Нужна помощь...

Семисегментные часы
Здравствуйте, уважаемые! :) Задача такая : Написать часы, которые отображают текущее время в виде...

Семисегментные часы
Здравствуйте, нужно сделать семисегментные (цифровые) часы на c#. Варианты реализации с помощью...

Семисегментные часы на Паскале
Товарищи! Помогие пожалуйста! Как можно вывести цифры в виде семисегментных индикаторов для часов?...

4
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
17.12.2019, 22:54 2
Где здесь SFML, кроме включения заголовочного файла?
Каким образом Вы код для C++Builder запихнули в VS?
0
0 / 0 / 0
Регистрация: 11.10.2019
Сообщений: 16
17.12.2019, 23:09  [ТС] 3
Я написала , что думаю что таке вообще там не используется. Сюда пишу потому что с графики вообще ничего не могу.
0
случайный прохожий
2934 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,160
17.12.2019, 23:12 4
Действительно, копируя код, хотя бы нужно смотреть, для какой он среды разработки.
Изобразить на экране электронные часы с цифровым семисегментный индикатором
0
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
18.12.2019, 09:21 5
lizaaa_b,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <SFML/Graphics.hpp>
 
class Segment : public sf::Drawable, public sf::Transformable
{
 
public:
 
    Segment(sf::Uint16 height, sf::Uint16 width, sf::Uint16 offset)
    {
        float dx = static_cast<float>(offset);
        float w = static_cast<float>(width);
        float h = static_cast<float>(height);
        float hh = static_cast<float>(height / 2);
 
        points[0] = sf::Vector2f{ dx, hh };
        points[1] = points[0].position + sf::Vector2f{ hh, -hh };
        points[3] = points[0].position + sf::Vector2f{ w, 0.f };
        points[2] = points[3].position + sf::Vector2f{ -hh, -hh };
        points[4] = points[2].position + sf::Vector2f{ 0, h };
        points[5] = points[1].position + sf::Vector2f{ 0, h };
        points[6] = points[0];
 
        setOrigin(0.f, hh);
    }
 
private:
 
    void draw(sf::RenderTarget& target, sf::RenderStates states) const override
    {
        states.transform *= getTransform();
        target.draw(points, states);
    }
 
    sf::VertexArray points{ sf::LineStrip, 7 };
};
 
#include <map>
 
class Digit : public sf::Drawable, public sf::Transformable
{
    static constexpr size_t scale = 8;
public:
    Digit(sf::Uint16 size)
        :
        seg{ size / scale, size, size / scale / 2 },
        m_size{ size }
    {
        float offset = static_cast<float>(size + size / scale);
 
        seg_pos[0] = { { 0.f, 0.f }, 90.f };
        seg_pos[1] = { seg_pos[0].first, 0.f };
        seg_pos[2] = { { offset, 0.f }, 90.f };
        seg_pos[3] = { { 0.f, offset }, 90.f };
        seg_pos[4] = { seg_pos[3].first, 0.f };
        seg_pos[5] = { { offset, offset }, 90.f };
        seg_pos[6] = { { 0.f, 2 * offset }, 0.f };
    }
 
    void set_val(sf::Uint16 val)
    {
        m_val = val % crypt.size();
    }
 
private:
 
    static const std::map<size_t, size_t> crypt;
    
    void draw(sf::RenderTarget& target, sf::RenderStates states) const override
    {
        states.transform *= getTransform();
 
        auto val = crypt.find(m_val)->second;
        for (size_t i = 0; i < 7; ++i)
        {
            if ((val >> i) & 1)
            {
                seg.setPosition(seg_pos[i].first);
                seg.setRotation(seg_pos[i].second);
                target.draw(seg, states);
            }
        }
    }
 
    mutable Segment seg;
    sf::Uint16 m_size;
    sf::Uint16 m_val{};
    std::pair<sf::Vector2f, float> seg_pos[7];
};
 
 
const std::map<size_t, size_t> Digit::crypt
{
        {0u, 0b01101111u},
        {1u, 0b00100100u},
        {2u, 0b01011110u},
        {3u, 0b01110110u},
        {4u, 0b00110101u},
        {5u, 0b01110011u},
        {6u, 0b01111011u},
        {7u, 0b00100110u},
        {8u, 0b01111111u},
        {9u, 0b01110111u},
        {10u, 0b00010000u}
};
 
#include <ctime>
 
class Watch : public sf::Drawable, public sf::Transformable
{
public:
 
    Watch(sf::Uint16 dig_size) : dig(dig_size), size(dig_size)
    {
        m_val[2] = m_val[5] = static_cast<sf::Uint8>(10);
    }
 
    void update()
    {
 
        std::time_t t = std::time(nullptr);
        std::tm time;
        localtime_s(&time, &t);
        m_val[0] = static_cast<sf::Uint8>(time.tm_hour / 10);
        m_val[1] = static_cast<sf::Uint8>(time.tm_hour % 10);
        m_val[3] = static_cast<sf::Uint8>(time.tm_min / 10);
        m_val[4] = static_cast<sf::Uint8>(time.tm_min % 10);
        m_val[6] = static_cast<sf::Uint8>(time.tm_sec / 10);
        m_val[7] = static_cast<sf::Uint8>(time.tm_sec % 10);
    }
 
private:
 
    void draw(sf::RenderTarget& target, sf::RenderStates states) const override
    {
        states.transform *= getTransform();
        for (size_t i{}; i < std::size(m_val); ++i)
        {
            dig.setPosition(i * static_cast<float>(size + size / 2), 0.f);
            dig.set_val(m_val[i]);
            target.draw(dig, states);
        }
    }
 
    mutable Digit dig;
    sf::Uint16 size;
    sf::Uint8 m_val[8]{};
};
 
int main()
{
    sf::RenderWindow win{ sf::VideoMode{800, 400}, "Clock" };
    win.setVerticalSyncEnabled(true);
 
    Watch w(50);
    w.setPosition(100.f, 100.f);
 
    while (win.isOpen())
    {
        sf::Event e;
        while (win.pollEvent(e))
        {
            if (e.type == sf::Event::Closed)
            {
                win.close();
            }
        }
        w.update();
        win.clear();
        win.draw(w);
        win.display();
    }
}
0
18.12.2019, 09:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2019, 09:21
Помогаю со студенческими работами здесь

Семисегментные часы на Action Script
Как можно вывести цифры в виде семисегментных индикаторов для часов? И вот еще как обеспечить...

Разработать семисегментные часы в консоли
Добрый день ! Знакомый попросил помочь Разработать семисегментные часы в консоли в двух вкрсиях...

Электронные часы
Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов,...

Электронные часы
Написать программу, которая выводит на экран работаю*щие &quot;электронные часы&quot;, которые работают в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru