çarpışan arabaları programla simüle etmek

entry2 galeri
    1.
  1. zemin için çarpışan objelere farklı sürtünme katsayıları verdim, çünkü birinin malzemesi plastik, diğeri metal olabilir, bu da sürtünme değerlerini etkileyecektir.



    dikdörtgenlere farklı ağırlıklar atadım ve zeminle etkileşmelerini sağladım.

    ortaya çıkan tablo hayli ilginç oldu.

    #include <SFML/Graphics.hpp> // SFML grafik kütüphanesini dahil et
    #include <cmath> // Matematik fonksiyonları için gerekli kütüphane
    #include <sstream> // String akışları için gerekli kütüphane

    // Sabitler
    const float GRAVITY = 981.0f; // Yerçekimi ivmesi (N)
    const float FLOOR_Y = 540.0f; // Zemin seviyesi (Y-koordinatı)
    const float WINDOW_WIDTH = 1920.0f; // Pencere genişliği
    const float WINDOW_HEIGHT = 1080.0f; // Pencere yüksekliği

    // Ağırlıklar (kg)
    const float RECTANGLE1_WEIGHT = 3000.0f; // ilk dikdörtgenin ağırlığı
    const float RECTANGLE2_WEIGHT = 50.0f; // ikinci dikdörtgenin ağırlığı

    // Sürtünme katsayıları
    const float FRICTION_RECTANGLE1 = 0.1f; // ilk dikdörtgenin sürtünme katsayısı
    const float FRICTION_RECTANGLE2 = 0.2f; // ikinci dikdörtgenin sürtünme katsayısı

    int main()
    {
    // Pencereyi oluştur
    sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "Dikdörtgen Çarpışması");

    // Mavi gökyüzü (dikey olarak tam pencere yüksekliği)
    sf::RectangleShape sky(sf::Vector2f(WINDOW_WIDTH, WINDOW_HEIGHT));
    sky.setFillColor(sf::Color(135, 206, 250)); // Açık mavi gökyüzü rengi

    // Yeşil zemin
    sf::RectangleShape floor(sf::Vector2f(WINDOW_WIDTH, WINDOW_HEIGHT - FLOOR_Y));
    floor.setFillColor(sf::Color::Green);
    floor.setPosition(0, FLOOR_Y); // Zemin seviyesini ayarla

    // Mavi dikdörtgenler oluştur
    sf::RectangleShape rectangle1(sf::Vector2f(50.0f, 50.0f));
    rectangle1.setFillColor(sf::Color::Blue);
    rectangle1.setPosition(100, FLOOR_Y); // Başlangıç konumu

    sf::RectangleShape rectangle2(sf::Vector2f(50.0f, 50.0f));
    rectangle2.setFillColor(sf::Color::Red);
    rectangle2.setPosition(500, FLOOR_Y); // Başlangıç konumu

    // Hız değişkenleri
    float xVelocity1 = 400.0f; // ilk dikdörtgenin yatay hızı
    float xVelocity2 = -150.0f; // ikinci dikdörtgenin yatay hızı

    sf::Clock clock; // Zamanlayıcı oluştur

    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) // Pencere kapatıldıysa
    window.close(); // Pencereyi kapat
    }

    float dt = clock.restart().asSeconds(); // Delta zamanını hesapla

    // Sürtünmeyi uygula (dikey hareket için değil, sadece yatay hareket için)
    if (rectangle1.getPosition().y == FLOOR_Y) {
    xVelocity1 -= FRICTION_RECTANGLE1 * GRAVITY * dt * (xVelocity1 < 0 ? -1 : 1);
    }
    if (rectangle2.getPosition().y == FLOOR_Y) {
    xVelocity2 -= FRICTION_RECTANGLE2 * GRAVITY * dt * (xVelocity2 < 0 ? -1 : 1);
    }

    // iki dikdörtgenin çarpışma kontrolü
    if (rectangle1.getGlobalBounds().intersects(rectangle2.getGlobalBounds())) {
    // Çarpışma sonrası momentum hesaplama
    float totalWeight = RECTANGLE1_WEIGHT + RECTANGLE2_WEIGHT;
    float newVelocity1 = ((RECTANGLE1_WEIGHT - RECTANGLE2_WEIGHT) / totalWeight) * xVelocity1 +
    ((2 * RECTANGLE2_WEIGHT) / totalWeight) * xVelocity2;
    float newVelocity2 = ((2 * RECTANGLE1_WEIGHT) / totalWeight) * xVelocity1 +
    ((RECTANGLE2_WEIGHT - RECTANGLE1_WEIGHT) / totalWeight) * xVelocity2;

    // Hızları güncelle
    xVelocity1 = newVelocity1;
    xVelocity2 = newVelocity2;

    // Çarpışma sonrası konum düzeltme
    if (xVelocity1 > 0) {
    rectangle1.setPosition(rectangle2.getPosition().x - rectangle1.getSize().x, FLOOR_Y);
    } else {
    rectangle2.setPosition(rectangle1.getPosition().x + rectangle1.getSize().x, FLOOR_Y);
    }
    }

    // Dikdörtgenlerin konumunu güncelle
    rectangle1.move(xVelocity1 * dt, 0); // ilk dikdörtgeni yatay olarak hareket ettir
    rectangle2.move(xVelocity2 * dt, 0); // ikinci dikdörtgeni yatay olarak hareket ettir

    // Pencereyi temizle ve zemin ile gökyüzünü çiz
    window.clear();
    window.draw(sky); // Gökyüzünü çiz
    window.draw(floor); // Zemini çiz
    window.draw(rectangle1); // ilk dikdörtgeni çiz
    window.draw(rectangle2); // ikinci dikdörtgeni çiz
    window.display(); // Pencereyi güncelle
    }

    return 0; // Program başarıyla tamamlandı
    }
    0 ...