Exemplo n.º 1
0
        /// <summary>
        ///     Finds the points of intersection between a ray and an arc. The resulting lambdas along the ray are sorted in
        ///     ascending order, so the "first" intersection is always in lambda1 (if any). Lambda may be NaN if there is no
        ///     intersection (or no "second" intersection).</summary>
        public static void RayWithArc(ref EdgeD ray, ref ArcD arc,
                                      out double lambda1, out double lambda2)
        {
            RayWithCircle(ref ray, ref arc.Circle, out lambda1, out lambda2);
            var sweepdir = Math.Sign(arc.AngleSweep);

            if (!double.IsNaN(lambda1))
            {
                var dir = ((ray.Start + lambda1 * (ray.End - ray.Start)) - arc.Circle.Center).Theta();
                if (!(GeomUt.AngleDifference(arc.AngleStart, dir) * sweepdir > 0 && GeomUt.AngleDifference(arc.AngleStart + arc.AngleSweep, dir) * sweepdir < 0))
                {
                    lambda1 = double.NaN;
                }
            }
            if (!double.IsNaN(lambda2))
            {
                var dir = ((ray.Start + lambda2 * (ray.End - ray.Start)) - arc.Circle.Center).Theta();
                if (!(GeomUt.AngleDifference(arc.AngleStart, dir) * sweepdir > 0 && GeomUt.AngleDifference(arc.AngleStart + arc.AngleSweep, dir) * sweepdir < 0))
                {
                    lambda2 = double.NaN;
                }
            }
            if (double.IsNaN(lambda1) && !double.IsNaN(lambda2))
            {
                lambda1 = lambda2;
                lambda2 = double.NaN;
            }
        }
Exemplo n.º 2
0
        private void assertNormalizedAngle(double input, double expected)
        {
            double pi      = Math.PI;
            double epsilon = 1e-10;

            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input), epsilon);
            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input + 2 * pi), epsilon);
            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input - 2 * pi), epsilon);
            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input + 4 * pi), epsilon);
            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input - 4 * pi), epsilon);
            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input + 6 * pi), epsilon);
            Assert.AreEqual(expected, GeomUt.NormalizedAngle(input - 6 * pi), epsilon);
        }