bugün

brakistokron eğrisi

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
}
Gündemdeki Haberler
Güncel Önemli Başlıklar
© copyright 2005 - 2026