muszaki_informatika:raylib_vis_functions
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| muszaki_informatika:raylib_vis_functions [2024/01/28 17:11] – létrehozva knehez | muszaki_informatika:raylib_vis_functions [2025/03/12 18:42] (current) – [Szinusz függvény ábrázolása 2D-ben] knehez | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Szinusz függvény ábrázolása 2D-ben ====== | + | ==== 2D alap kiinduló kód ==== |
| + | A következő programváz jó kiinduló pont a 2D grafikai fejlesztésekhez. | ||
| + | <sxh c> | ||
| + | #include < | ||
| + | |||
| + | int main() { | ||
| + | // Initialization | ||
| + | const int screenWidth = 800; | ||
| + | const int screenHeight = 450; | ||
| + | InitWindow(screenWidth, | ||
| + | |||
| + | SetTargetFPS(60); | ||
| + | |||
| + | while (!WindowShouldClose()) { | ||
| + | BeginDrawing(); | ||
| + | |||
| + | ClearBackground(RAYWHITE); | ||
| + | |||
| + | /// ide jön a saját kódunk | ||
| + | |||
| + | EndDrawing(); | ||
| + | } | ||
| + | CloseWindow(); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | ==== Szinusz függvény ábrázolása 2D-ben ==== | ||
| + | |||
| + | Az alábbi rövid példa egy szinusz függvény ábrázolását mutatja. | ||
| <sxh c> | <sxh c> | ||
| Line 55: | Line 83: | ||
| return 0; | return 0; | ||
| } | } | ||
| + | </ | ||
| + | A 6. és 7. sorban megadjuk a képernyő méretet pixelekben. Ezt a két értéket kapja meg paraméterként az // | ||
| + | |||
| + | A 22.-es sorban egy vízszintes vonalat rajzolunk a képernyő közepére. Majd egy függőlegeset ami középen metszi. | ||
| + | |||
| + | A 26. sorban kezdődő ciklus i változója szögben számol, a kezdőértéke -400 a vége +399 fok lesz. | ||
| + | |||
| + | Nem pontokban, hanem szakaszokban gondolkodunk, | ||
| + | |||
| + | A 34. sortól azért számoljuk át az értékeket, | ||
| + | |||
| + | ==== Egyszerűsített függvényábrázolás pixelekkel ==== | ||
| + | |||
| + | Próbáljuk meg pixelenként kirajzolni a függvényt: | ||
| + | |||
| + | <sxh c> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main() { | ||
| + | const int screenWidth = 800; | ||
| + | const int screenHeight = 450; | ||
| + | InitWindow(screenWidth, | ||
| + | |||
| + | SetTargetFPS(60); | ||
| + | |||
| + | Vector2 origin = {(float)screenWidth / 2, (float)screenHeight / 2}; | ||
| + | |||
| + | while (!WindowShouldClose()) { | ||
| + | BeginDrawing(); | ||
| + | ClearBackground(RAYWHITE); | ||
| + | |||
| + | DrawLine(origin.x, | ||
| + | DrawLine(0, origin.y, screenWidth, | ||
| + | |||
| + | for (int x = 0; x < screenWidth; | ||
| + | float y = origin.y - sinf((x - origin.x) * DEG2RAD) * 100; | ||
| + | DrawPixel(x, | ||
| + | } | ||
| + | |||
| + | DrawText(" | ||
| + | DrawText(" | ||
| + | DrawText(" | ||
| + | |||
| + | EndDrawing(); | ||
| + | } | ||
| + | |||
| + | CloseWindow(); | ||
| + | return 0; | ||
| + | } | ||
| </ | </ | ||
| + | |||
| + | A módszer lényege a középen lévő for ciklus: | ||
| + | <sxh c> | ||
| + | for (int x = 0; x < screenWidth; | ||
| + | float y = origin.y - sinf((x - origin.x) * DEG2RAD) * 100; | ||
| + | DrawPixel(x, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Most a szinusz függvényt jelentettük meg, ami c-ben a '' | ||
| + | |||
| + | A módszer hátránya: amennyiben a függvény függőlegesen sokat változik, ameddig 1 pixellel jobbra lépünk akkor az eredmény pontozott lesz, nem lesz összefüggő vonal. Próbáljuk ki a **tanf()** függvénnyel. | ||
| + | |||
| + | megjegyzés: | ||
| + | |||
| + | ===== Térbeli ábrázolás ===== | ||
| + | |||
| + | A következő példa egy kétváltozós függvényt **sinf(sqrtf(x*x + y*y))** térben ábrázol | ||
| + | |||
| + | <sxh c> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main() { | ||
| + | // Initialization | ||
| + | const int screenWidth = 800; | ||
| + | const int screenHeight = 800; | ||
| + | InitWindow(screenWidth, | ||
| + | |||
| + | // Define the camera | ||
| + | Camera camera = { 0 }; | ||
| + | camera.position = (Vector3){ 20.0f, 20.0f, 20.0f }; | ||
| + | camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||
| + | camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||
| + | camera.fovy = 45.0f; | ||
| + | |||
| + | SetTargetFPS(60); | ||
| + | |||
| + | while (!WindowShouldClose()) { | ||
| + | BeginDrawing(); | ||
| + | ClearBackground(RAYWHITE); | ||
| + | BeginMode3D(camera); | ||
| + | |||
| + | for (float y = -8.0f; y < 8.0f; y += 0.2f) { | ||
| + | for (float x = -8.0f; x < 8.0f; x += 0.2f) { | ||
| + | float z = sinf(sqrtf(x*x + y*y)) * 2.0f; // Amplitude increase for better visualization | ||
| + | Vector3 pos = { x, z, y }; | ||
| + | float colorIntensity = (z + 2.0f) / 4.0f; // Normalize z value to [0, 1] for color | ||
| + | Color color = ColorFromHSV(200.0f * colorIntensity, | ||
| + | DrawCubeV(pos, | ||
| + | } | ||
| + | } | ||
| + | DrawGrid(20, | ||
| + | EndMode3D(); | ||
| + | DrawFPS(10, 10); | ||
| + | EndDrawing(); | ||
| + | } | ||
| + | CloseWindow(); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Hogyan lehetne z tengely körül forgatni a függvényt? | ||
| + | |||
| + | Ahhoz, hogy a 3D-s sinus felület forogjon a Z tengely körül, frissíteni kell a kamerapozíciót a fő cikluson belül, hogy a kamera mozogjon a felület körül. A kamera mozgatásához polár koordinátákat használunk, | ||
| + | |||
| + | Viszont a számítógépes grafikában az y tengely a felfelé mutató vektor, ezért a kódban az x és z tengelyeket forgatjuk. | ||
| + | |||
| + | <sxh c> | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int main() { | ||
| + | // Initialization | ||
| + | const int screenWidth = 800; | ||
| + | const int screenHeight = 800; | ||
| + | InitWindow(screenWidth, | ||
| + | |||
| + | // Define the camera | ||
| + | Camera camera = { 0 }; | ||
| + | camera.position = (Vector3){ 30.0f, 20.0f, 3.0f }; | ||
| + | camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; | ||
| + | camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; | ||
| + | camera.fovy = 45.0f; | ||
| + | |||
| + | |||
| + | SetTargetFPS(60); | ||
| + | float angle = 0.0f; | ||
| + | |||
| + | while (!WindowShouldClose()) { | ||
| + | // Update camera position | ||
| + | angle += 0.01f; // Increment angle | ||
| + | camera.position.x = cosf(angle) * 30.0f; | ||
| + | camera.position.z = sinf(angle) * 30.0f; | ||
| + | |||
| + | BeginDrawing(); | ||
| + | ClearBackground(RAYWHITE); | ||
| + | BeginMode3D(camera); | ||
| + | |||
| + | for (float y = -8.0f; y < 8.0f; y += 0.2f) { | ||
| + | for (float x = -8.0f; x < 8.0f; x += 0.2f) { | ||
| + | float z = sinf(sqrtf(x*x + y*y)) * 2.0f; // Amplitude increase for better visualization | ||
| + | Vector3 pos = { x, z, y }; | ||
| + | float colorIntensity = (z + 2.0f) / 4.0f; // Normalize z value to [0, 1] for color | ||
| + | Color color = ColorFromHSV(200.0f * colorIntensity, | ||
| + | DrawCubeV(pos, | ||
| + | } | ||
| + | } | ||
| + | DrawGrid(20, | ||
| + | EndMode3D(); | ||
| + | DrawFPS(10, 10); | ||
| + | EndDrawing(); | ||
| + | } | ||
| + | CloseWindow(); | ||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
muszaki_informatika/raylib_vis_functions.1706461864.txt.gz · Last modified: 2024/01/28 17:11 by knehez
