Interactive phase portraits of complex rational functions.
Add zeros ○ and poles × on the complex plane. Drag them, pan, and pinch to zoom. The portrait and the displayed formula update from the same factor state.
Android test build: v0.1.50 APK · all releases
The APK is a prerelease signed with the repository's public test key.
For a complex function f(z):
- hue records
arg f(z) - lightness repeats with
log10 |f(z)| - zeros are rings
- poles are crosses
The reusable colour core is code/wegert_color.glsl. Function construction stays upstream of that boundary.
This project follows the phase-portrait approach developed by Elias Wegert. See Visual Complex Functions: An Introduction with Phase Portraits.
More Wegert: Complex Beauties calendars, 2011–2024 · complete 2024 calendar PDF · research profile · visual.wegert.com.
The 2024 calendar credits Elias Wegert, Gunter Semmler, Pamela Gorkin, and Ulrich Daepp.
- tap ○ or ×, then tap the portrait to add a zero or pole
- drag a marker to move that factor
- drag empty space to pan
- pinch to zoom
clearremoves all zeros and poles- three-finger tap restores
g(z) = (z - 1)(z - 2)(z - 5) - placing a zero on a pole, or a pole on a zero, cancels one factor
The preserved reference animation keeps the roots of
g(z) = (z - 1)(z - 2)(z - 5)
fixed while the codomain is multiplied by exp(i theta).
MP4 · static PNG · R renderer
More rendered examples are in rendered_images/.
Readable source lives in code/.
wegert_color.glsl— phase/log-modulus to colourwegert_function.c— rational-function statewegert_scene.c— zeros, poles, and view statewegert_portrait_renderer_gles.c— GLES portrait rendererwegert_render_frames.c— offscreen RGB24 frame stream_/build/— Android packaging, tests, CI, and release machinery
The root-level C/GLSL names remain entry-point symlinks into code/.
Detailed rendering, gesture, test, emulator, and release notes are in docs/technical-notes.md.
Requirements: Android SDK 36, NDK r29 (29.0.14206865), CMake 3.22.1, JDK 17, Gradle 9.5.1, and Android Gradle Plugin 9.3.1.
cd _/build
gradle :app:assembleDebugThe debug APK is written to:
_/build/app/build/outputs/apk/debug/app-debug.apk
It contains arm64-v8a and armeabi-v7a for devices, plus x86_64 for CI emulation.
Wegert's reusable boundary is the phase-portrait presentation: colour mapping, coordinates, markers, and ordinary zero/pole interaction.
Analytic Continuation owns whole-plane evolution of f = R exp(q).
Lacunary owns bounded/local continuation, charts, branches, sheets, and monodromy experiments.

