hoď ma hore
Milí diskutujúci. Pri diskutovaní prosím: 1. nepridávaj jednoslovné témy / 2. nepridávaj uražlivé alebo vulgárne komentáre. Ak tieto pravidlá nedodržíš, tvoja téma pravdepodobne skončí v koši. Príjemné diskutovanie :)
none
ak chceš diskutovať, musíš sa registrovať. registrácia

tu sa nachádzaš : 

hlavná stránka  /  rôzne  /  vlákno

Simulácia reálneho kyvadla

príspevkov
5
zobrazení
77
tému vytvoril(a) 17.5.2026 07:59 Fotón
posledná zmena 17.5.2026 16:16
2
17.05.2026, 08:02
Tu je kompletný zdrojový kód (keby si niekto chcel pozrieť, ako funguje narábanie s neriešiteľnými nelineárnymi diferenciálnymi rovnicami v numerickej simulácii):

#define FREEGLUT_STATIC
#include <GL/freeglut.h>
#include <math.h>
#include <stdio.h>

// Definícia konštánt
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

// Fyzikálne parametre kyvadla
const float g = 9.81f; // Gravitačné zrýchlenie (m/s^2)
const float L = 2.0f; // Dĺžka závesu (m)

// Stavové veličiny kyvadla
float theta = 3.1f; // Počiatočný uhol v radiánoch (cca 177 stupňov - extrémna nelinearita)
float omega = 0.0f; // Počiatočná uhlová rýchlosť (rad/s)

// Časový krok simulácie
const float dt = 0.01f; // 10 milisekúnd na krok

// Funkcia na inicializáciu OpenGL
void init(void) {
glClearColor(0.1f, 0.1f, 0.1f, 1.0f); // Tmavosivé pozadie
glShadeModel(GL_FLAT);
}

// Funkcia, ktorá prepočítava fyziku (beží na pozadí)
void updatePhysics(void) {
// Presná nelineárna rovnica: alpha = -(g / L) * sin(theta)
float alpha = -(g / L) * sinf(theta);

// Numerická integrácia (Metóda Euler-Cromer)
omega += alpha * dt;
theta += omega * dt;

// Normalizácia uhla do intervalu <-PI, PI>
if (theta > M_PI) theta -= 2.0f * M_PI;
if (theta < -M_PI) theta += 2.0f * M_PI;

// Vynútenie prekreslenia obrazovky
glutPostRedisplay();
}

// Funkcia na vykreslenie scény
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

// Prepočet polohy konca kyvadla z polárnych súradníc na karteziánske
// V OpenGL smeruje os -Y dole, preto: x = L * sin(theta), y = -L * cos(theta)
float x = L * sinf(theta);
float y = -L * cosf(theta);

// 1. Vykreslenie závesu (čiara)
glColor3f(0.7f, 0.7f, 0.7f); // Sivá farba chvosta
glLineWidth(3.0f);
glBegin(GL_LINES);
glVertex2f(0.0f, 0.0f); // Bod uchytenia (stred)
glVertex2f(x, y); // Pozícia závažia
glEnd();

// 2. Vykreslenie uchytenia (malý štvorec v strede)
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glVertex2f(-0.05f, -0.05f);
glVertex2f( 0.05f, -0.05f);
glVertex2f( 0.05f, 0.05f);
glVertex2f(-0.05f, 0.05f);
glEnd();

// 3. Vykreslenie závažia (kruh aproximovaný n-uholníkom)
glColor3f(0.2f, 0.6f, 1.0f); // Svetlomodrá farba
float radius = 0.15f;
glBegin(GL_POLYGON);
for (int i = 0; i < 32; i++) {
float angle = 2.0f * M_PI * i / 32.0f;
glVertex2f(x + radius * cosf(angle), y + radius * sinf(angle));
}
glEnd();

glutSwapBuffers();
}

// Funkcia na ošetrenie zmeny veľkosti okna
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Nastavenie ortografického premietania (udržujeme pomer strán okna)
float aspectRatio = (float)w / (float)h;
if (w >= h) {
// Okno je široké
gluOrtho2D(-2.5f * aspectRatio, 2.5f * aspectRatio, -2.5f, 2.5f);
} else {
// Okno je vysoké
gluOrtho2D(-2.5f, 2.5f, -2.5f / aspectRatio, 2.5f / aspectRatio);
}
glMatrixMode(GL_MODELVIEW);
}

void timer(int value) {
// Spustíme prepočet fyziky
updatePhysics();

// Znovu zaregistrujeme tento časovač, aby sa spustil o 10 milisekýnd (10 ms = 100 FPS)
glutTimerFunc(10, timer, 0);
}

// Hlavná funkcia
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("Simulacia nelinearneho kyvadla (OpenGL 1.1)");

init();

// Registrácia callback funkcií
glutDisplayFunc(display);
glutReshapeFunc(reshape);

glutTimerFunc(10, timer, 0); //Hlavná počítacia funkcia timer v 10ms intervaloch

glutMainLoop();
return 0;
}
none
prevádzkuje diskusneforum.sk kontaktuj správcu diskusného fóra vytvoril dzI/O 2023 - 2026 verzia : 1.05 ( 27.4.2024 1:45 ) veľkosť : 44 775 B vygenerované za : 0.031 s unikátne zobrazenia tém : 2 073 333 unikátne zobrazenia blogov : 20 928 táto stránka musí používať koláčiky, aby mohla fungovať...

možnosti :

hlavná stránka nastavenia blogy todo

online účastníci :

nikto (nie) je online

hľadanie :

blog dňa :

Understanding the Hidden World of Credit Card Cash Advance Services in Korea When it comes to alternative financial solutions in East Asia, few topics generate as much discussion as the underground credit ecosystem. While mainstream banking services ...

citát dňa :

Ak niekto verí nikomu, raz niekomu veril až príliš.