예제 #1
0
        public static (double StartProgress, double EndProgress) SplitProgress(this double progress, double firstStart, double firstEnd, double lastStart, double lastEnd)
        {
            var equation1 = LinearEquation.FromPoints(new Point(firstStart, 0), new Point(firstEnd, 1));
            var equation2 = LinearEquation.FromPoints(new Point(lastStart, 0), new Point(lastEnd, 1));

            return(equation1.Y(progress), equation2.Y(progress));
        }
예제 #2
0
        public static (double StartProgress, double EndProgress) SplitProgress(this double progress, double splitLocation)
        {
            var equation1 = LinearEquation.FromPoints(new Point(0, 0), new Point(splitLocation, 1));
            var equation2 = LinearEquation.FromPoints(new Point(splitLocation, 0), new Point(1, 1));

            return(equation1.Y(progress), equation2.Y(progress));
        }
예제 #3
0
        public static bool AreParallel(LinearEquation equation1, LinearEquation equation2) => equation1.B * equation2.A == equation1.A * equation2.B; //Les vecteurs directeurs sont-ils colinéaires ?

        /// <summary>
        /// Calcule l'équation d'une droite passant par un point et perpendiculaire à une autre
        /// </summary>
        /// <param name="equation">Équation de la droite perpendiculaire</param>
        /// <param name="point">Point de la droite</param>
        /// <returns>Équation de la droite perpendiculaire à l'autre et passant par le point</returns>
        public static LinearEquation Perpendicular(LinearEquation equation, Point point)
        {
            //point a pour coordonnées (m, n)
            //=> result : ay - bx = an - bm
            double a = -equation.B;
            double b = equation.A;
            double c = GetC(a, b, point);

            return(new LinearEquation(a, b, c));
        }
예제 #4
0
        /// <summary>
        /// Calcule l'équation d'une droite passant par un point et parallèle à une autre
        /// </summary>
        /// <param name="equation">Équation de la droite parallèle</param>
        /// <param name="point">Point de la droite</param>
        /// <returns>Équation de la droite et parallèle à l'autre et passant par le point</returns>
        public static LinearEquation Parallel(LinearEquation equation, Point point)
        {
            //point a pour coordonnées (m, n)
            //=> result : ax + by = am + bn
            double a = equation.A;
            double b = equation.B;
            double c = GetC(a, b, point);

            return(new LinearEquation(a, b, c));
        }
예제 #5
0
        public static IEnumerable <double> SplitProgress(this double progress, params double[] splitLocations)
        {
            double previous = 0;

            for (int i = 0; i < splitLocations.Length; i++)
            {
                double location = splitLocations[i];
                yield return(LinearEquation.FromPoints(new Point(previous, 0), new Point(location, 1)).Y(progress));

                previous = location;
            }
            yield return(LinearEquation.FromPoints(new Point(previous, 0), new Point(1, 1)).Y(progress));
        }
예제 #6
0
        public static double GetProgressAfterSplitting(this double progress, params double[] splitLocations)
        {
            double previous = 0;

            for (int i = 0; i < splitLocations.Length; i++)
            {
                double location = splitLocations[i];
                if (previous <= progress && location >= progress)
                {
                    return(LinearEquation.FromPoints(new Point(previous, 0), new Point(location, 1)).Y(progress));
                }
                else
                {
                    previous = location;
                }
            }
            return(LinearEquation.FromPoints(new Point(previous, 0), new Point(1, 1)).Y(progress));
        }
예제 #7
0
        public static bool ArePerpendicular(LinearEquation equation1, LinearEquation equation2) => equation1.A * equation2.A + equation1.B * equation2.B == 0; //Les vecteurs directeurs sont-ils orthogonaux ?

        /// <summary>
        /// Calcule l'intersection de deux droites avec de leurs équations
        /// </summary>
        /// <param name="equation1">Équation de la première droite</param>
        /// <param name="equation2">Équation de la seconde droite</param>
        /// <returns>Point d'intersection des deux droites</returns>
        public static Point Intersection(LinearEquation equation1, LinearEquation equation2)
        {
            if (AreParallel(equation1, equation2))
            {
                return(new Point(double.NaN, double.NaN));
            }
            //Les droites ne sont pas parallèles donc leurs vecteurs directeurs ne sont pas colinéaires
            //Donc (b * A != a * B) <=> (A != a * B / b) <=> (B != b * A / a)

            double a = equation1.A;
            double b = equation1.B;
            double c = equation1.C;

            double A = equation2.A;
            double B = equation2.B;
            double C = equation2.C;

            if (a != 0)
            {
                return(InterX());
            }
            else
            {
                return(InterY()); //On ne peut pas avoir (A, B) == (0, 0) puisqu'une exception est levée dans ce cas
            }
            Point InterX()
            {
                double coef = A / a;
                double y    = (coef * c - C) / (B - coef * b); //Donc pas de division par 0
                double x    = -(b * y + c) / a;

                return(new Point(x, y));
            }

            Point InterY()
            {
                double coef = B / b;
                double x    = (coef * c - C) / (A - coef * a); //Donc pas de division par 0
                double y    = -(a * x + c) / b;

                return(new Point(x, y));
            }
        }
예제 #8
0
 /// <summary>
 /// Détermine si deux droites sont perpendiculaires
 /// </summary>
 /// <param name="equation1">Équation de la première droite</param>
 /// <param name="equation2">Équation de la seconde droite</param>
 /// <returns><see langword="true"/> si les droites sont perpendiculaires; sinon <see langword="false"/></returns>
 public static bool ArePerpendicular(LinearEquation equation1, LinearEquation equation2) => equation1.A * equation2.A + equation1.B * equation2.B == 0; //Les vecteurs directeurs sont-ils orthogonaux ?
예제 #9
0
 /// <summary>
 /// Détermine si deux droites sont parallèles
 /// </summary>
 /// <param name="equation1">Équation de la première droite</param>
 /// <param name="equation2">Équation de la seconde droite</param>
 /// <returns><see langword="true"/> si les droites sont parallèles; sinon <see langword="false"/></returns>
 public static bool AreParallel(LinearEquation equation1, LinearEquation equation2) => equation1.B * equation2.A == equation1.A * equation2.B; //Les vecteurs directeurs sont-ils colinéaires ?