đ equation_painter
Open Source Flutter Package by junayedahamed
A powerful, interactive, and performant Flutter package for visualizing multiple mathematical equations simultaneously with beautiful animations and a fully customizable coordinate system.
Language Switch / āĻāĻžāώāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ
đŦđ§ English Documentation (Click to Expand/Collapse)
⨠Features
- â New: Interactive Panning & Zooming: Drag to pan and pinch to zoom around the coordinate system!
- â
New: Polar Coordinate Support: Visualize equations in polar form
r = f(theta). - â
New: Inequality Visualization: Shading for regions like
y >= xorx^2 + y^2 <= 25. - â New: Tap & Hover to Inspect: Tap or hover on any curve to see the exact (x, y) or (r, theta) coordinates.
- â
Robust Equation Parsing: Type equations like
x^2 + y^2 - 100,sin(2x) - y,pow(x,2) * atan2(y,x)directly. It supports implicit multiplication (2x), constants (pi,e), unit +/- and ~20 built-in math functions. - â Coordinate Labels: Show dynamic numbers along the axis to measure your functions.
- â Customizable Unit Scale: By default, each grid square represents 100 units, but you can adjust this to your specific needs.
- â Configurable Units: Define how many units each grid square represents.
- â
Dynamic Animations: Beautiful
radial,sequential,linearX, orlinearYdraw mechanics. - â
High Performance: Highly optimized utilizing
Float32List,drawRawPointsand Marching Squares evaluation to preserve silky smooth 60fps framerates.
đ¸ Screenshots
Multiple Curves with Custom Styles and Complex Functions
Sin wave with radial animation
Heart curve
Cos wave with value inspection
Inequality Visualization
đ Getting Started
Add the package to your pubspec.yaml:
dependencies:
equation_painter: ^0.0.1+2
đĄ Usage
EquationPainter(
equations: [
EquationConfig(
function: (x, y) => x * x + y * y - 25,
color: Colors.indigoAccent,
strokeWidth: 4,
),
],
unitsPerSquare: 10,
interactive: true,
showGrid: true,
onPointTapped: (x, y, config) {
print("Tapped at ($x, $y)");
},
)
đ§Ž Enhanced Equation Parsing
You can parse string-based equations directly using EquationParser. It's highly tolerant!
Supported Syntax
- Variables:
x,y - Constants:
pi($\pi$),e($e$) - Operators:
+,-,*,/,^(power) - Implicit Multiplication:
2x,3(x+y),x(y-1) - Functions:
- Trigonometric:
sin,cos,tan,asin,acos,atan,atan2(y, x) - Logarithmic & Exponential:
log/ln(natural),log2,log10,exp - Rounding & Absolute:
abs,ceil,floor,round,sign - Miscellaneous:
sqrt,cbrt(cube root),hypot(a, b),pow(base, exp),min(a, b),max(a, b)
- Trigonometric:
final userEquation = "tan(20x) - tan(15y) + sin(xy) - 10";
final mathFunction = EquationParser.parseOrNull(userEquation); // Returns null if invalid
if (mathFunction != null) {
EquationConfig(
function: mathFunction,
color: Colors.pinkAccent,
)
}
âī¸ Advanced Features
- Customizable Grid Styles: Support for logarithmic scales, dashed lines, and custom colors.
- Export to Image/SVG: Easily save your visualized equations as high-quality images or SVGs.
đ Future Upgrade Ideas
- đ 3D Equation Visualization: Support for plotting $z = f(x, y)$ in a 3D coordinate system.
- đ Parametric Equation Support: Plot curves defined by equations like $x = f(t), y = g(t)$.
- đ Live Equation Editor: A built-in UI component to type and preview equations in real-time.
- đ Data Series Plotting: Ability to plot discrete data points (scatter plots) alongside continuous equations.
- đ Legend & Tooltips: Add customizable legends and more detailed information tooltips for complex graphs.
â
If you Like this project, please give it a â on GitHub and share it with your friends! It really helps me out and motivates me to keep improving it. Thank you for your support! đ
đ Licensing
This project is licensed under the MIT License.
đŦđ§ Bangla Documentation (Click to Expand/Collapse)
āĻŦā§āĻļāĻŋāώā§āĻā§āϝāϏāĻŽā§āĻš
- â āύāϤā§āύ: āĻāύā§āĻāĻžāϰā§āĻā§āĻāĻŋāĻ āĻĒā§āϝāĻžāύāĻŋāĻ āĻ āĻā§āĻŽāĻŋāĻ: āĻāĻĒāύāĻŋ āĻāĻāύ āĻā§āϰāĻžāĻĢā§ āĻĄā§āϰā§āϝāĻžāĻ āĻāϰ⧠āĻĒā§āϝāĻžāύ āĻāĻŦāĻ āĻĒāĻŋāĻā§āĻ-āĻā§-āĻā§āĻŽ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ!
- â āύāϤā§āύ: āĻĒā§āϞāĻžāϰ āĻā§āĻ āϰā§āĻĄāĻŋāύā§āĻ āϏāĻžāĻĒā§āϰā§āĻ: $r = f(theta)$ āĻĢāϰā§āĻŽā§ āϏāĻŽā§āĻāϰāĻŖ āĻāϞā§āĻĒāύāĻž āĻāϰāĻžāϰ āϏā§āĻŦāĻŋāϧāĻžāĨ¤
- â āύāϤā§āύ: āĻāύāĻāĻā§āϝāĻŧāĻžāϞāĻŋāĻāĻŋ āĻāĻŋāĻā§āϝā§āϝāĻŧāĻžāϞāĻžāĻāĻā§āĻļāύ: $y \ge x$ āĻŦāĻž $x^2 + y^2 \le 25$ āĻāϰ āĻŽāϤ⧠āĻ āϏāĻŽāϤāĻž āĻļā§āĻĄāĻŋāĻā§ā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϰāĻĻāϰā§āĻļāύāĨ¤
- â āύāϤā§āύ: āĻā§āϝāĻžāĻĒ āĻ āĻšā§āĻāĻžāϰ āĻāύā§āϏāĻĒā§āĻāĻļāύ: āĻāĻžāϰā§āĻā§āϰ āϝā§āĻā§āύ⧠āϏā§āĻĨāĻžāύ⧠āĻā§āϝāĻžāĻĒ āĻŦāĻž āĻšā§āĻāĻžāϰ āĻāϰ⧠āϤāĻžā§āĻā§āώāĻŖāĻŋāĻāĻāĻžāĻŦā§ $(x, y)$ āĻŦāĻž $(r, theta)$ āϏā§āĻĨāĻžāύāĻžāĻā§āĻ āĻĻā§āĻāĻžāĨ¤
- â
āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāĻā§āϝāĻŧā§āĻļāύ āĻĒāĻžāϰā§āϏāĻžāϰ: āĻāĻĒāύāĻŋ āĻāĻāύ āϏāϰāĻžāϏāϰāĻŋ
x^2 + y^2 - 100,sin(2x) - yāĻāϰ āĻŽāϤ⧠āϏāĻŽā§āĻāϰāĻŖ āĻāĻžāĻāĻĒ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻāĻŋ ā˛āĻŽāĻĒā§āϞāĻŋāϏāĻŋāĻ āĻā§āĻŖ (2x), āϧā§āϰā§āĻŦāĻ (pi,e), āĻāĻŦāĻ ā§¨ā§ĻāĻāĻŋāϰāĻ āĻŦā§āĻļāĻŋ āĻŦāĻŋāϞā§āĻ-āĻāύ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϏāĻžāĻĒā§āϰā§āĻ āĻāϰā§āĨ¤ - â āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻāϝā§āĻā§āϝ āĻāĻāύāĻŋāĻ āϏā§āĻā§āϞ: āĻĄāĻŋāĻĢāϞā§āĻāĻāĻžāĻŦā§ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻā§āϰāĻŋāĻĄ āϏā§āĻāϝāĻŧāĻžāϰ ā§§ā§Ļā§Ļ āĻāĻāύāĻŋāĻ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āĻāϰā§, āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻ āύā§āϝāĻžāϝāĻŧā§ āĻāĻāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
- â āϏā§āĻĨāĻžāύāĻžāĻā§āĻ āϞā§āĻŦā§āϞ: āĻĢāĻžāĻāĻļāύ āĻĒāϰāĻŋāĻŽāĻžāĻĒ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĄāĻžāĻāύāĻžāĻŽāĻŋāĻ āĻ āĻā§āώā§āĻĒā§ āϏāĻāĻā§āϝāĻž āĻĒā§āϰāĻĻāϰā§āĻļāύāĨ¤
- â āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻāϝā§āĻā§āϝ āĻā§āϰāĻŋāĻĄ: āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻā§āϰāĻŋāĻĄ āϏā§āĻāϝāĻŧāĻžāϰ āĻāϤāĻā§āĻā§ āĻāĻāύāĻŋāĻā§āϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§āĻŦ āĻāϰāĻŦā§ āϤāĻž āĻāĻĒāύāĻŋ āύāĻŋāĻā§āĻ āĻ āĻŋāĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
- â
āĻĄāĻžā§āύāĻžāĻŽāĻŋāĻ āĻ
ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύ:
radial,sequential,linearX, āĻ āĻĨāĻŦāĻžlinearYāϏā§āĻāĻžāĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϰā§āĻ āĻāĻāĻāĻžāϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻ ā§āϝāĻžāύāĻŋāĻŽā§āĻ āĻāϰāĻžāĨ¤ - â
āĻāĻā§āĻ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏ: āĻŽāϏā§āĻŖ ā§Ŧā§Ļ FPS āĻĢā§āϰā§āĻŽ āϰā§āĻā§āϰ āĻāύā§āϝ
Float32List,drawRawPointsāĻāĻŦāĻMarching SquaresāĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
đ āĻļā§āϰ⧠āĻāϰāĻž āϝāĻžāĻ
āĻāĻĒāύāĻžāϰ pubspec.yaml-āĻ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āϝā§āĻ āĻāϰā§āύ:
dependencies:
equation_painter: ^0.0.1+2
đĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ
import 'package:equation_painter/equation_painter.dart';
// ... āĻāĻĒāύāĻžāϰ āĻāĻāĻā§āĻ āĻā§āϰāĻŋāϰ āĻā§āϤāϰā§
EquationPainterWidget(
width: double.infinity,
height: 400,
interactive: true, // āĻāύā§āĻāĻžāϰā§āĻā§āĻāĻŋāĻ āĻĒā§āϝāĻžāύāĻŋāĻ āĻāĻžāϞā§
unitsPerSquare: 50.0,
alignment: Alignment.center,
equations: [
EquationConfig(
function: EquationParser.parse('x^2 + y^2 - 2500'),
color: Colors.cyanAccent,
strokeWidth: 3,
animationType: AnimationType.radial,
),
],
)
đ§Ž āĻāύā§āύāϤ āϏāĻŽā§āĻāϰāĻŖ āĻĒāĻžāϰā§āϏāĻžāϰ
āĻāĻĒāύāĻŋ āϏāϰāĻžāϏāϰāĻŋ EquationParser āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏā§āĻā§āϰāĻŋāĻ-āĻāĻŋāϤā§āϤāĻŋāĻ āϏāĻŽā§āĻāϰāĻŖ āĻĒāĻžāϰā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻāĻŋ āĻ
āϤā§āϝāύā§āϤ āύāĻŽāύā§āϝāĻŧ!
āϏāĻŽāϰā§āĻĨāĻŋāϤ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ
- āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ/āĻāϞāĻ:
x,y - āϧā§āϰā§āĻŦāĻ:
pi($\pi$),e($e$) - āĻ
āĻĒāĻžāϰā§āĻāϰ:
+,-,*,/,^(power) - āĻāĻšā§āϝ āĻā§āĻŖ (Implicit Multiplication):
2x,3(x+y),x(y-1) - āĻĢāĻžāĻāĻļāύāϏāĻŽā§āĻš:
- āϤā§āϰāĻŋāĻā§āĻŖāĻŽāĻŋāϤāĻŋāĻ:
sin,cos,tan,asin,acos,atan,atan2(y, x) - āϞāĻāĻžāϰāĻŋāĻĻāĻŽāĻŋāĻ āĻāĻŦāĻ āĻāĻā§āϏāĻĒā§āύā§āύāĻļāĻŋāϝāĻŧāĻžāϞ:
log/ln(natural),log2,log10,exp - āϰāĻžāĻāύā§āĻĄāĻŋāĻ āĻāĻŦāĻ āĻāĻŦāϏāϞāĻŋāĻāĻ:
abs,ceil,floor,round,sign - āĻŦāĻŋāĻŦāĻŋāϧ:
sqrt,cbrt(cube root),hypot(a, b),pow(base, exp),min(a, b),max(a, b)
- āϤā§āϰāĻŋāĻā§āĻŖāĻŽāĻŋāϤāĻŋāĻ:
đ āĻāĻŦāĻŋāώā§āϝāϤā§āϰ āĻāĻĒāĻā§āϰā§āĻĄ āĻāĻāĻĄāĻŋāϝāĻŧāĻž
- đ āĻĨā§āϰāĻŋ-āĻĄāĻŋ (3D) āĻāĻā§āϝāĻŧā§āĻļāύ āĻāĻŋāĻāϝāĻŧāĻžāϞāĻžāĻāĻā§āĻļāύ: $z = f(x, y)$ āĻāϰ āĻŽāϤ⧠āϤā§āϰāĻŋāĻŽāĻžāϤā§āϰāĻŋāĻ āϏāĻŽā§āĻāϰāĻŖ āĻā§āϰāĻžāĻĢā§ āϰā§āĻĒāĻžāύā§āϤāϰāĨ¤
- đ āĻĒā§āϝāĻžāϰāĻžāĻŽā§āĻā§āϰāĻŋāĻ āĻāĻā§āϝāĻŧā§āĻļāύ āϏāĻžāĻĒā§āϰā§āĻ: $x = f(t), y = g(t)$ āĻāĻžāĻāĻĒā§āϰ āĻāĻžāϰā§āĻ āĻŦāĻž āĻŦāĻā§āϰāϰā§āĻāĻž āĻāĻāĻāĻžāϰ āϏā§āĻŦāĻŋāϧāĻžāĨ¤
- đ āϞāĻžāĻāĻ āĻāĻā§āϝāĻŧā§āĻļāύ āĻāĻĄāĻŋāĻāϰ: āϏāϰāĻžāϏāϰāĻŋ āĻāĻāĻāĻžāϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻāĻžāĻāĻĒ āĻāϰāĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ āĻā§āϰāĻžāĻĢ āĻĒā§āϰāĻŋāĻāĻŋāĻ āĻāϰāĻžāϰ āϏā§āĻŦāĻŋāϧāĻžāĨ¤
- đ āĻĄā§āĻāĻž āϏāĻŋāϰāĻŋāĻ āĻĒā§āϞāĻāĻŋāĻ: āύāĻŋāϰāĻŦāĻā§āĻāĻŋāύā§āύ āϏāĻŽā§āĻāϰāĻŖā§āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻĄāĻŋāϏāĻā§āϰāĻŋāĻ āĻĄā§āĻāĻž āĻĒāϝāĻŧā§āύā§āĻ āĻŦāĻž āϏā§āĻā§āϝāĻžāĻāĻžāϰ āĻĒā§āϞāĻ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻžāĨ¤
- đ āϞā§āĻā§āύā§āĻĄ āĻāĻŦāĻ āĻā§āϞāĻāĻŋāĻĒāϏ: āĻāĻāĻŋāϞ āĻā§āϰāĻžāĻĢā§āϰ āĻāύā§āϝ āĻāĻžāϏā§āĻāĻŽ āϞā§āĻā§āύā§āĻĄ āĻāĻŦāĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āϤāĻĨā§āϝā§āϰ āĻā§āϞāĻāĻŋāĻĒ āϝā§āĻ āĻāϰāĻžāĨ¤
â
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻ āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋ āĻĒāĻāύā§āĻĻ āĻāϰā§āύ, āϤāĻžāĻšāϞ⧠āĻĻāϝāĻŧāĻž āĻāϰ⧠GitHub-āĻ āĻāĻāĻāĻŋ â āĻĻāĻŋāύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻŦāύā§āϧā§āĻĻā§āϰ āϏāĻžāĻĨā§ āĻļā§āϝāĻŧāĻžāϰ āĻāϰā§āύ! āĻāĻāĻŋ āĻāĻŽāĻžāĻā§ āϏāϤā§āϝāĻŋāĻ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āĻāĻŦāĻ āĻāĻŽāĻžāĻā§ āĻāύā§āύāϤ āĻāϰāϤ⧠āĻā§āϏāĻžāĻšāĻŋāϤ āĻāϰā§āĨ¤ āĻāĻĒāύāĻžāϰ āϏāĻŽāϰā§āĻĨāύā§āϰ āĻāύā§āϝ āϧāύā§āϝāĻŦāĻžāĻĻ! đ
đ License
This project is licensed under the MIT License - see the LICENSE file for details.
đ¤ Contributing
Contributions are welcome! Feel free to open issues or submit pull requests.
Crafted with â¤ī¸ for Mathematicians and Developers.