brakistokron eğrisi

entry1 galeri0
    1.
  1. bu eğrinin çalışma mantığını özetleyen güzel bir program:

    #include <SFML/Graphics.hpp> // SFML grafik kütüphanesini ekle
    #include <SFML/Window.hpp> // SFML pencere yönetimi için gerekli kütüphane
    #include <iostream> // Girdi/çıktı işlemleri için gerekli kütüphane
    #include <cmath> // Matematiksel işlemler için gerekli kütüphane
    #include <vector> // Dinamik diziler için gerekli kütüphane

    const float radius = 5.0f; // Daire çapı, A ve B noktalarını temsil eden dairelerin yarıçapı
    const float pixelToCmConversionFactor = 100.0f / 3640.0f; // Pikseli cm'ye çeviren faktör
    const float g = 980.0f; // Yerçekimi ivmesi (cm/s^2), düşme hareketinin hesaplanmasında kullanılır
    bool drawing = false; // Çizim durumu, kullanıcı çizim yapıyor mu kontrol eder
    std::vector<sf::Vector2f> curvePoints; // Eğri noktalarını tutmak için dinamik bir dizi

    // Mesafe hesaplama fonksiyonu
    float calculateDistance(const sf::Vector2f& A, const sf::Vector2f& B) {
    return std::sqrt(std::pow(B.x - A.x, 2) + std::pow(B.y - A.y, 2)); // A ve B arasındaki mesafeyi hesaplar
    }

    // Brachistochrone eğrisi için süre hesaplama
    float calculateBrachistochroneTime(float length) {
    return sqrt(2 * length / g); // Düşme süresini hesaplamak için kullanılan formül
    }

    int main() {
    // Pencere oluştur
    sf::RenderWindow window(sf::VideoMode(1920, 1080), "Distance Drawing"); // 1920x1080 boyutunda bir pencere oluştur
    window.setFramerateLimit(60); // FPS sınırını 60'a ayarla

    // A ve B noktaları
    sf::Vector2f A(960, 540); // A noktası, pencerenin ortasında
    sf::Vector2f B(960, 460); // B noktası, A noktasının biraz yukarısında

    while (window.isOpen()) { // Pencere açık olduğu sürece döngü
    sf::Event event; // Olay tanımlaması
    while (window.pollEvent(event)) { // Olayları kontrol et
    if (event.type == sf::Event::Closed) // Pencere kapandığında
    window.close(); // Pencereyi kapat

    // Mouse tuşuna basma olayı
    if (event.type == sf::Event::MouseButtonPressed) {
    if (event.mouseButton.button == sf::Mouse::Left) { // Sol fare tuşuna basıldığında
    drawing = true; // Çizim modunu aç
    curvePoints.clear(); // Çizimi sıfırla
    }
    }
    // Mouse tuşunu bırakma olayı
    if (event.type == sf::Event::MouseButtonReleased) {
    if (event.mouseButton.button == sf::Mouse::Left) { // Sol fare tuşu bırakıldığında
    drawing = false; // Çizim modunu kapat

    // Eğrinin toplam uzunluğunu hesapla
    float totalLength = 0.0f; // Toplam uzunluğu başlat
    for (size_t i = 1; i < curvePoints.size(); ++i) { // Eğri noktaları arasında döngü
    totalLength += calculateDistance(curvePoints[i - 1], curvePoints[i]); // Her iki nokta arasındaki mesafeyi topla
    }

    // Piksel cinsinden uzunluğu cm cinsine çevir
    float totalLengthCm = totalLength * pixelToCmConversionFactor; // Pikseli cm'ye çevir

    // Brachistochrone süresini hesapla
    float timeToReachB = calculateBrachistochroneTime(totalLengthCm); // Süre hesapla

    // Sonuçları terminale yazdır
    std::cout << "Total Length of Curve: " << totalLengthCm << " cm" << std::endl; // Eğrinin toplam uzunluğunu yazdır
    std::cout << "Time to reach B: " << timeToReachB << " seconds" << std::endl; // B noktasına ulaşma süresini yazdır
    }
    }

    // Mouse hareketi
    if (event.type == sf::Event::MouseMoved && drawing) { // Fare hareket ettiyse ve çizim modunda ise
    sf::Vector2f currentPoint(static_cast<float>(event.mouseMove.x), // Mevcut fare konumunu al
    static_cast<float>(event.mouseMove.y));
    curvePoints.push_back(currentPoint); // Mevcut konumu eğri noktalarına ekle
    }
    }

    // Ekranı temizle
    window.clear(sf::Color::White); // Ekranı beyaz renkle temizle

    // A ve B noktalarını çiz
    sf::CircleShape circleA(radius); // A noktası için daire oluştur
    circleA.setFillColor(sf::Color::Black); // Dairenin rengini siyah yap
    circleA.setPosition(A.x - radius, A.y - radius); // Dairenin konumunu ayarla
    window.draw(circleA); // Daireyi çiz

    sf::CircleShape circleB(radius); // B noktası için daire oluştur
    circleB.setFillColor(sf::Color::Black); // Dairenin rengini siyah yap
    circleB.setPosition(B.x - radius, B.y - radius); // Dairenin konumunu ayarla
    window.draw(circleB); // Daireyi çiz

    // Eğriyi çiz
    if (curvePoints.size() > 1) { // Eğri noktaları 2'den fazlaysa
    sf::VertexArray line(sf::PrimitiveType::LineStrip, curvePoints.size()); // Eğriyi çizmek için vertex dizisi oluştur
    for (size_t i = 0; i < curvePoints.size(); ++i) { // Eğri noktaları arasında döngü
    line[i].position = curvePoints[i]; // Her noktanın konumunu ayarla
    line[i].color = sf::Color::Black; // Rengi siyah yap
    }
    window.draw(line); // Eğriyi çiz
    }

    window.display(); // Çizimi güncelle
    }

    return 0; // Programı sona erdir
    }
    0 ...
© 2025 uludağ sözlük