GY-63_MS5611/libraries/ellipse/README.md
2022-07-25 09:40:13 +02:00

2.5 KiB

Arduino CI Arduino-lint JSON check License: MIT GitHub release

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.