From 25426b2fa5b4cc18e166088909ac10721af63fbd Mon Sep 17 00:00:00 2001 From: davidovski Date: Sun, 18 Jul 2021 01:00:19 +0100 Subject: [PATCH] Fractals --- CMakeLists.txt | 38 ++++++++++++ README.md | 24 ++++++++ assets-fx/example.png | Bin 0 -> 3569 bytes assets-fx/fxconv-metadata.txt | 3 + assets-fx/icon.png | Bin 0 -> 9980 bytes src/main.c | 108 ++++++++++++++++++++++++++++++++++ 6 files changed, 173 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 assets-fx/example.png create mode 100644 assets-fx/fxconv-metadata.txt create mode 100644 assets-fx/icon.png create mode 100644 src/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e6b6273 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,38 @@ +# Configure with [fxsdk build-fx] or [fxsdk build-cg], which provide the +# toolchain file and module path of the fxSDK + +cmake_minimum_required(VERSION 3.15) +project(fractals) + +include(GenerateG1A) +include(GenerateG3A) +include(Fxconv) +find_package(Gint 2.1 REQUIRED) + +set(SOURCES + src/main.c + # ... +) +# Shared assets, fx-9860G-only assets and fx-CG-50-only assets +set(ASSETS + # ... +) +set(ASSETS_fx + assets-fx/example.png + # ... +) +set(ASSETS_cg + assets-cg/example.png + # ... +) + +fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) + +add_executable(fractals ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}}) +target_compile_options(fractals PRIVATE -Wall -Wextra -Os) +target_link_libraries(fractals Gint::Gint) + +if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) + generate_g1a(TARGET fractals OUTPUT "fractals.g1a" + NAME "fractals" ICON assets-fx/icon.png) +endif() diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6f8c1c --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# Mandelbrot Casio + +An attempt at rendering the mandelbrot set fractal using [gint](https://gitea.planet-casio.com/Lephenixnoir/gint) for the fx series casio calculators. + +At the moment I am using a (probably) very inefficient algorithm for calcualting the mandelbrot set, so if you happen to know how to optimise this, feel free to! + +I would advise overclocking your calculator using a tool such as [ftune](http://pm.matrix.jp/ftune2e.html) to help with performance. + +## Controls + +- + zoom in +- - zoom out +- ↑ pan up +- ↓ pan down +- ← pan left +- → pan right + +## Building + +I would reccomend using [fxsdk](https://gitea.planet-casio.com/Lephenixnoir/fxsdk) to build this: + +`fxsdk build-fx` + +inside the project directory diff --git a/assets-fx/example.png b/assets-fx/example.png new file mode 100644 index 0000000000000000000000000000000000000000..b26ba9ac37f37f0bbc06db263613c33184d47a12 GIT binary patch literal 3569 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 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..fd0f84e --- /dev/null +++ b/src/main.c @@ -0,0 +1,108 @@ +// fractals add-in by davidovski +// Copyright (C) 2021 davidovski +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +#include +#include +#include +#include + +typedef struct vec2 { + float x; + float y; +} vec2; + + +vec2 offset = {0, 0}; +vec2 poi = {1.5f, 0.5f}; + + +vec2 screen = {128, 64}; + +float zoom = 2.0f; +float max = 40.0f; + +vec2 add(vec2 a, vec2 b) { + vec2 r = {a.x + b.x, a.y + b.y}; + return r; +} + +double dot(vec2 a, vec2 b) { + return a.x*b.x + a.y+b.y; +} + +vec2 compsquare(vec2 z) { + float temp = z.x; + z.x = z.x*z.x - z.y*z.y; + z.y = 2.0*temp*z.y; + return z; +} + +bool mandelbrot(vec2 point) { + vec2 z = {0, 0}; + for (float iters = 0.0f; iters < max; ++iters) { + vec2 sq = compsquare(z); + z.x = sq.x + point.x; + z.y = sq.y + point.y; + z.x = sq.x + point.x; + + if (dot(z, z) > 4.0) return false; + } + return true; +} + +int main(void) { + gint_setrestart(1); + while (true) { + getkey(); + dclear(C_WHITE); + for (float x = 0; x < 128; x++) { + for (float y = 0; y < 64; y++) { + vec2 point = {x / screen.x, y / screen.y}; + point.x *= screen.x / screen.y; + + point.x -= poi.x; + point.y -= poi.y; + + point.x *= zoom; + point.y *= zoom; + + point.x -= offset.x; + point.y -= offset.y; + + if (mandelbrot(point)) { + dpixel(x , y, C_BLACK); + } + dupdate(); + } + } + + drect(1, 1, 3, 3, C_BLACK); + dupdate(); + + getkey(); + + if (keydown(KEY_ADD)) zoom -= zoom * 0.2f; + if (keydown(KEY_SUB)) zoom += zoom * 0.2f; + + if (keydown(KEY_UP)) offset.y -= zoom * 0.1f; + if (keydown(KEY_DOWN)) offset.y += zoom * 0.1f; + if (keydown(KEY_RIGHT)) offset.x -= zoom * 0.1f; + if (keydown(KEY_LEFT)) offset.x += zoom * 0.1f; + + if (keydown(KEY_EXIT)) gint_osmenu(); + + } + return 0; +}