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
}
// 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
// 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
}