mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
.. | ||
.github | ||
examples | ||
test | ||
.arduino-ci.yml | ||
ellipse.cpp | ||
ellipse.h | ||
keywords.txt | ||
library.json | ||
library.properties | ||
LICENSE | ||
README.md |
ellipse
Arduino library with ellipse math
Description
This experimental library provides basic ellipse math. It was written to test different perimeter algorithms.
Trigger was a video of Dr. Matt Parker. https://www.youtube.com/watch?v=5nW3nJhBHL0
Interface
- ellipse(float a, float b) constructor, a >= b
- float area() returns the area of the ellipse.
- float circumference() good algorithm (= Ramanujan 1).
- float eccentricity() return the eccentricity e. This is an indication of flatness of the ellipse. 0 is a circle 1 is flat line.
- void setA(float a) change the long radius.
- void setB(float b) change the short radius.
- float getA() return long radius of the ellipse.
- float getB() return short radius of the ellipse.
- float getC() distance to focus point form centre along the longer axis.
Perimeter algorithms
- float perimeter_ref() slower but best known algorithm (Ramanujan 2)
- float perimeter_Keppler() good and fast algorithm for eccentricity between 1 and 2.
- float perimeter_Ramanujan1() good algorithm.
- float perimeter_Ramanujan2() slow but best known algorithm.
See performance example for differences in timing.
Misc
- bool isCircle(float epsilon = 0.0) | a - b | < eps.
- bool isFlat() true if a > 4b, where a = longest radius.
Experimental
- float angle() returns the angle if the ellipse was the shadow of a circle, Returns 0..90°, 0° == circle, 90° == line.
Operation
See examples.
Future
- make constructor symmetric (a < b or a > b ==> all possible.
- make other code symmetric.
- additional functions
- Bresenham to draw ellipse?
- float getLongRadius()
- float getShortRadius()
- move all code to .cpp
- documentation
- refer Wikipedia.