private static void TestThreePoints(Vec2d c, double radius, double a1, double am, double a2) { CircleArc2 arc = new CircleArc2(c, radius, a1, a2); Assert.IsTrue(arc.GetAngle(arc.TMin).EpsilonEquals(a1)); Assert.IsTrue(arc.GetAngle((arc.TMin + arc.TMax) / 2).EpsilonEquals(am)); Assert.IsTrue(arc.GetAngle(arc.TMax).EpsilonEquals(a2)); // Se toman 3 puntos y se calcula el centro, que tiene que coincidir con el centro. Vec2d p1 = arc.GetPosition(arc.TMin); Vec2d p2 = arc.GetPosition((arc.TMin + arc.TMax) / 2); Vec2d p3 = arc.GetPosition(arc.TMax); Vec2d cc = CircleArc2Utils.GetCenter(p1, p2, p3); Assert.IsTrue(arc.Center.EpsilonEquals(cc)); // Se calcula el arco formado por los 3 puntos, que tiene que coincidir con el arco. CircleArc2 arc2 = CircleArc2Utils.ThreePoints(p1, p2, p3); Assert.IsTrue(arc.Angle1.EpsilonEquals(arc2.Angle1)); //Assert.IsTrue(arc.Angle2.EpsilonEquals(arc2.Angle2)); Assert.IsTrue(arc.AdvAngle.EpsilonEquals(arc2.AdvAngle)); Assert.IsTrue(arc.Center.EpsilonEquals(arc2.Center)); Assert.IsTrue(arc.Radius.EpsilonEquals(arc2.Radius)); Assert.IsTrue(arc.TMin.EpsilonEquals(arc2.TMin)); Assert.IsTrue(arc.TMax.EpsilonEquals(arc2.TMax)); }
public void PuntoEje(double t, out Point2d pnt, out double normal, out double radio) { CircleArc2 arc = new CircleArc2(this.center, this.radius, this.angle0, this.angle1); if (this.t0.EpsilonEquals(this.t1)) { pnt = arc.GetPosition(this.t0); radio = this.radius; normal = this.normal1; return; } // Se normaliza la estacion. double t01 = (t - this.t0) / (this.t1 - this.t0); pnt = arc.GetPosition(t01); radio = this.radius; normal = this.normal1 + (this.t1 - t) / this.radius; }