Um plotter 2D de funções matemáticas feito em C99 + SDL2, com um parser inspirado em TeX/LaTeX (subset) que constrói uma AST e avalia f(x) em tempo real.
- C99 raiz (
-std=c99 -Wall -Wextra -pedantic) - SDL2 para render 2D (grid, eixos, curva)
- Parser próprio (tokenização → AST →
eval) - Curvas paramétricas com tuplas
(x(t), y(t)) - Screenshot (BMP) via tecla P ou
--shot
Repositório: este projeto vive em
plot-in-c/(binário em./bin/tatuplot).
| Coração (paramétrica) | Lissajous (paramétrica) | Espiral (paramétrica) |
|---|---|---|
![]() |
![]() |
![]() |
| Rosa (paramétrica) | Sinc (cartesiana) | Gauss (cartesiana) | Tan (cartesiana) |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
sudo pacman -Syu
sudo pacman -S gcc make git sdl2Verificar:
gcc --version
sdl2-config --cflags --libsNa raiz do projeto:
makeExecutar:
make run ARGS='--expr "\sin(x)"'Limpar:
make clean./bin/tatuplot --expr "<expressao>" [opcoes]Opções principais:
--expr "..."(obrigatório) expressão estilo TeX (subset)--xmin A --xmax Brange do eixo X (ou range detse a expressão for tupla e--tmin/--tmaxnão forem passados)--ymin C --ymax Drange do eixo Y--tmin T --tmax Urange do parâmetrot(modo paramétrico)--width W --height Htamanho da janela (default900x600)--bg R,G,Bcor do fundo (default0,0,0)--fg R,G,Bcor do gráfico (default0,220,0)--out caminho.bmpcaminho do screenshot (defaulttatuplot.bmp)--shotrenderiza 1 frame, salva screenshot e sai (ótimo para README/CI)
- W A S D: pan (mover viewport)
- + / -: zoom in / zoom out (no centro)
- R: reset do viewport para o estado inicial
- P: salva screenshot (BMP) em
--out - ESC: sair
- números:
1,3.14 - variável:
x - constantes:
pi,e - operadores:
+ - * / ^ - parênteses:
( ... ) - chaves:
{ ... }(equivalente a parênteses no parser) - multiplicação implícita:
2x,x\sin(x),(x+1)(x-1)
- unárias:
\sin,\cos,\tan,\log,\exp,\sqrt - fração:
\frac{a}{b} - wrappers/no-op (ignorados):
\left,\right - espaçamentos (ignorados):
\;,\,,\:,\!
\sin^{3}(x)é aceito e vira(sin(x))^3
Se a expressão principal for uma tupla:
(exprX, exprY)ou{exprX, exprY}
o programa entra em modo paramétrico e plota a curva com parâmetro t.
Regra de ranges no modo paramétrico:
- se você passar
--tmin/--tmax, eles definem o parâmetrot - se você não passar
--tmin/--tmax, então--xmin/--xmaxé interpretado como range det(compatível com o comando do coração) - o viewport X do gráfico pode ser auto-ajustado (auto-fit) conforme a curva
Dica: use
make run ARGS='...'para evitar briga com escapes do shell.
make run ARGS='--expr "\left(16\sin^{3}(x),\;13\cos(x)-5\cos(2x)-2\cos(3x)-\cos(4x)\right)" --xmin 0 --xmax 6.283185307179586 --ymin -18 --ymax 14'make run ARGS='--expr "(\sin(3x),\sin(2x))" --xmin 0 --xmax 6.283185307179586'make run ARGS='--expr "(x\cos(x),x\sin(x))" --xmin 0 --xmax 18.84955592153876'make run ARGS='--expr "(\cos(4x)\cos(x),\cos(4x)\sin(x))" --xmin 0 --xmax 6.283185307179586'make run ARGS='--expr "\frac{\sin(x)}{x}" --xmin -20 --xmax 20 --ymin -0.5 --ymax 1.2'make run ARGS='--expr "e^{-\frac{x^2}{2}}" --xmin -5 --xmax 5 --ymin -0.1 --ymax 1.2'make run ARGS='--expr "\tan(x)" --xmin -1.4 --xmax 1.4 --ymin -6 --ymax 6'mkdir -p screenshotsUse --shot + --out:
make run ARGS='--expr "\tan(x)" --xmin -1.4 --xmax 1.4 --ymin -6 --ymax 6 --out screenshots/tan.bmp --shot'Instalar ImageMagick (opcional, só pra converter):
sudo pacman -S imagemagickConverter em lote:
for f in screenshots/*.bmp; do
magick "$f" "${f%.bmp}.png"
doneDepois, você pode commitar os .png e manter (ou apagar) os .bmp.
plot-in-c/
├── assets/
├── bin/ # binários (tatuplot)
├── build/ # objetos .o
├── docs/
├── include/ # headers
├── src/ # fontes .c
├── screenshots/ # imagens geradas (recomendado)
├── Makefile
└── README.md
Isso acontece quando falta linkar a libm (-lm).
O Makefile deve ter -lm na etapa de link.
Em alguns ambientes Wayland pode aparecer:
libdecor-gtk-WARNING: Failed to initialize GTKFailed to load plugin 'libdecor-gtk.so'
Se o programa abre a janela e roda normal, dá pra ignorar. Se der problema de janela/decoração, alternativas:
- instalar dependências do libdecor (se você usa Wayland):
sudo pacman -S libdecor libdecor-gtk
- ou forçar X11:
SDL_VIDEODRIVER=x11 ./bin/tatuplot --expr "\sin(x)"
- zoom/pan com mouse (scroll + drag)
- export para PNG nativo (sem conversão)
- anti-aliasing / supersampling
- mais comandos TeX (
\ln,\abs,\arctan, etc.) - mensagens de erro com “setinha” apontando a coluna do parse
- modo “repl” no terminal para testar expressões sem abrir janela
PRs e issues são bem-vindos — principalmente para:
- ampliar o subset TeX com cuidado (sem “explosão” de dependências)
- testar em diferentes ambientes (Wayland/X11)
- melhorar robustez do parser e mensagens de erro






