public int Handle(RationalInfo info) { Rational r = info.rational; float cents = (float)r.ToCents(); float distance = (float)info.distance; float harm = 1f / distance; //float harm = Utils.GetHarmonicity(distance); // harmonicity: 0..1 float x = cents; // 0..1200 // use id as a tip string id = String.Format("{0} {1} {2} {3:F2} {4}", r.ToString(), r.FormatMonzo(), distance, r.ToCents(), _temperament.FormatRational(r) ); _image.Line(Point.Points(x, 0, x, harm * 3)) .Add(id: id) .FillStroke(Color.Empty, Color.LightGray, harm * 2); string fraction = r.FormatFraction("\n"); _image.Text(new Point(x, 0), fraction, harm * 2f, lineLeading: 0.8f, align: Image.Align.Center) .Add() .FillStroke(Color.Black, Color.Empty); return(1); }
override protected string ValueToText(double value) { int primeIndex = (int)value; int prime = Rationals.Utils.GetPrime(primeIndex); Rational r = new Rational(prime); return(r.FormatFraction()); }
void Test1_Rationals() { Assert.Equals(new Rational(1), Rational.One); Assert.Equals(new Rational(2), Rational.Two); var r0 = new Rational(4, 5); var r1 = new Rational(6, 4); Assert.Equals(new Rational(4, 5), r0); Assert.Equals("4/5", r0.FormatFraction()); Assert.Equals("4/5", r0.ToString()); Assert.Equals("3/2", r1.ToString()); Assert.Equals("6/5", (r0 * r1).FormatFraction()); Assert.Equals("8/15", (r0 / r1).FormatFraction()); var r3 = new Rational(81, 80); Assert.Equal("|-4 4 -1>", r3.FormatMonzo()); Assert.Equal("|-2 4 -1}", r3.FormatNarrowPowers()); }