bugün

Bildiğimiz gibi hayat zaman üzerine kurulmuştur. Bunun için saate ihtiyacımız vardır. Analog saat deyip geçmeyelim. Analog saatin büyük bir önemi vardır. En basit örnek; saati öğrenmemizde rolü büyüktür. Teknolojinin bile eskitemediği analog saat hala günümüzde kullanılmaktadır. Ayrıca, dijital saatlere inat evimizin köşesinde ve kolumuzda güzel bir aksesuardır.
görsel

Last time: 22:38:33 (12-hour format)

bu programı yapana kadar birçok hata aldım. önce 12 lik saat dilimleriyle, 24 dilimlik saat dilimlerini 1 e 1 eşleştiren bir fonksiyon yaratmam gerekti. ardından program çalışmasa bile, saat verilerini bir yerden almam gerekiyordu. önce istanbul bazlı lokal saati seçtim, fakat bu internet kopmalarında büyük kafa karışıklığı yaratabileceği için, bilgisayar kapalı olsa bile, tüm bileşenler arasında eşzamanlılığı sağlayan bios saatini referans aldım chrono kütüphanesiyle. her bir saati, 360 derecelik daireyi 12 ye bölüp 30 derecelik açılarla yerleştirdiğimde (12 yi 0 dereceden başlatarak, 0 derece daireyi dikey olarak ortadan ikiye böldüğünüzde sol yarım kürede kalan tepe noktasıdır ) kusursuz bir analog saate kavuşmuş oldum.

1 saat: 1
2 saat: 2
3 saat: 3
4 saat: 4
5 saat: 5
6 saat: 6
7 saat: 7
8 saat: 8
9 saat: 9
10 saat: 10
11 saat: 11
12 saat: 12 (Öğle)
13 saat: 1
14 saat: 2
15 saat: 3
16 saat: 4
17 saat: 5
18 saat: 6
19 saat: 7
20 saat: 8
21 saat: 9
22 saat: 10
23 saat: 11

Son saat: 12:59:24 (12 saat formatında)
#include <SFML/Graphics.hpp> // SFML Grafik kütüphanesini içe aktarır
#include <SFML/System.hpp> // SFML Sistem işlevlerini içe aktarır
#include <iostream> // Giriş/Çıkış akışları için standart kütüphane
#include <cmath> // Matematiksel fonksiyonlar için kütüphane
#include <chrono> // Zaman işlemleri için kütüphane
#include <ctime> // C zaman kütüphanesi

// Saatin elini çizen fonksiyon
void drawClockHand(sf::RenderWindow &window, float angle, float length, sf::Color color) {
sf::RectangleShape hand(sf::Vector2f(length, 5)); // El şekli için bir dikdörtgen oluştur
hand.setFillColor(color); // Elin rengini ayarla
hand.setOrigin(0, 2.5f); // Orijini elin sol tarafına ayarla
hand.setRotation(angle); // Belirtilen açıya döndür
hand.setPosition(400, 300); // Saati merkezi noktaya yerleştir
window.draw(hand); // Eli çiz
}

// Saatin yüzünü çizen fonksiyon
void drawClockFace(sf::RenderWindow &window, sf::Font &font) {
sf::CircleShape clockFace(250); // Saat yüzü için bir daire oluştur
clockFace.setFillColor(sf::Color::Transparent); // Dolu renk olarak saydam ayarla
clockFace.setOutlineThickness(5); // Kenar kalınlığını ayarla
clockFace.setOutlineColor(sf::Color::Black); // Kenar rengini siyah ayarla
clockFace.setPosition(150, 50); // Saat yüzünün konumu
window.draw(clockFace); // Saat yüzünü çiz

// Sayıları ve aralarındaki çizgileri çiz
for (int i = 0; i < 12; ++i) { // 1'den 12'ye kadar döngü
float angle = 90 - (i * 30); // Sayının açısını hesapla
float rad = angle * 3.14f / 180; // Dereceleri radyana dönüştür

// Sayı için konumu hesapla
float x = 400 + 200 * cos(rad); // Açıya göre X konumu
float y = 300 - 200 * sin(rad); // Açıya göre Y konumu

// Sayı metni oluştur
sf::Text number(std::to_string(i == 0 ? 12 : i), font, 24); // 0 için 12 kullan
number.setFillColor(sf::Color::Black); // Metin rengini ayarla
number.setPosition(x - 10, y - 10); // Metni merkezle

window.draw(number); // Sayıyı çiz

// Sayılar arasındaki çizgileri çiz
sf::Vertex line[] = {
sf::Vertex(sf::Vector2f(400, 300)), // Saatin merkezi
sf::Vertex(sf::Vector2f(400 + 220 * cos(rad), 300 - 220 * sin(rad))) // Dış çizgi
};
window.draw(line, 2, sf::Lines); // Çizgiyi çiz
}
}

int main() {
// Pencereyi oluştur
sf::RenderWindow window(sf::VideoMode(800, 600), "Analog Saat"); // 800x600 boyutunda pencere

// Yazı tipini yükle
sf::Font font;
if (!font.loadFromFile("arial.ttf")) { // Yazı tipi dosyasının erişilebilir olduğundan emin ol
std::cerr << "Error loading font!" << std::endl; // Hata mesajı yazdır
return 1; // Yazı tipi yükleme başarısızsa çık
}

// Geçerli sistem zamanını al
auto now = std::chrono::system_clock::now(); // Geçerli zamanı al
std::time_t now_c = std::chrono::system_clock::to_time_t(now); // time_t'ye dönüştür
std::tm *currentTime = std::localtime(&now_c); // Yerel zaman yapısına dönüştür

// Sistem zamanından zaman değişkenlerini başlat
int hour = currentTime->tm_hour; // Saat
int minute = currentTime->tm_min; // Dakika
int second = currentTime->tm_sec; // Saniye

// Saat döngüsünü başlat
while (window.isOpen()) { // Pencere açık olduğu sürece
sf::Event event;
while (window.pollEvent(event)) { // Olayları kontrol et
if (event.type == sf::Event::Closed)
window.close(); // Kapatma olayı olduğunda pencereyi kapat
}

// Zamanı güncelle (saniyeleri artır)
second++; // Saniyeyi bir artır
if (second >= 60) { // Eğer saniye 60 veya daha fazlaysa
second = 0; // Saniyeyi sıfırla
minute++; // Dakikayı bir artır
if (minute >= 60) { // Eğer dakika 60 veya daha fazlaysa
minute = 0; // Dakikayı sıfırla
hour++; // Saati bir artır
if (hour >= 24) { // Eğer saat 24 veya daha fazlaysa
hour = 0; // Saati sıfırla
}
}
}

// Açıları dönüştür
float hourAngle = (hour % 12) * 30 + (minute / 60.0f) * 30; // Her saat 30 derece
float minuteAngle = minute * 6; // Her dakika 6 derece
float secondAngle = second * 6; // Her saniye 6 derece

// Pencereyi temizle
window.clear(sf::Color::White); // Pencere arka planını beyazla temizle

// Saat yüzünü çiz
drawClockFace(window, font); // Saat yüzünü çizme fonksiyonunu çağır

// Saat, dakika ve saniye elini çiz
drawClockHand(window, hourAngle - 90, 100, sf::Color::Black); // Saat eli (90 derece döndür)
drawClockHand(window, minuteAngle - 90, 150, sf::Color::Blue); // Dakika eli (90 derece döndür)
drawClockHand(window, secondAngle - 90, 180, sf::Color::Red); // Saniye eli (90 derece döndür)

// Çizimi güncelle
window.display(); // Çizilen içeriği göster

// Saniye elinin güncellenmesi için bir gecikme ekle
sf::sleep(sf::seconds(1)); // 1 saniye bekle
}

// Uygulama kapatıldığında son zamanı terminale yazdır
std::cout << "Last time: " << (hour == 0 ? 12 : hour) << ":" // Son saati yazdır
<< (minute < 10 ? "0" : "") << minute << ":" // Dakikayı yazdır (10'dan küçükse başına 0 ekle)
<< (second < 10 ? "0" : "") << second << " (12-hour format)" << std::endl; // Saniyeyi yazdır (10'dan küçükse başına 0 ekle)

return 0; // Programı başarıyla kapat
}