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)); }
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)); }
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)); }
/// <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)); }
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)); }
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)); }
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)); } }
/// <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 ?
/// <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 ?