public Vector2D(Coordinate2D startCoord, Coordinate2D endCoord) { X = endCoord.X - startCoord.X; Y = endCoord.Y - startCoord.Y; A = startCoord; }
public Vector2D(Coordinate2D c) { X = c.X; Y = c.Y; A = new Coordinate2D(0, 0); }
/// <summary> /// Calculates distance of the orthogonal projection for point /// </summary> /// <param name="coordinate"></param> /// <returns></returns> public double calcDistanceToPoint(Coordinate2D coordinate) { return((A * coordinate.X + B * coordinate.Y + C) / (Math.Sqrt(A * A + B * B))); }
public Vector2D copy() { var startCopy = new Coordinate2D(A.X, A.Y); return(new Vector2D(startCopy, B)); }
/// <summary> /// Показывает, что проверяемая точка лежит в положительной полуплоскости данной прямой. /// Положительная полуплоскость образована прямой и вектором нормали. /// Т.е. точка должна лежать с той же стороны, в которую направлен вектор нормали данной прямой. /// Т.о. точка будет иметь положительное решение если она лежит в той полуплоскости куда направлен вектор норали. /// </summary> /// <param name="point"></param> /// <returns></returns> public bool isPointBelongs(Coordinate2D point) { return(Math.Abs(distanceToPoint(point)) < EPSILON); }
public double distanceToPoint(Coordinate2D p) { return(solveForPoint(p) / Math.Sqrt(A * A + B * B)); }
public double solveForPoint(Coordinate2D p) { return(A * p.X + B * p.Y + C); }
/// <summary> /// Показывает, что проверяемая точка лежит в положительной полуплоскости данной прямой. /// Положительная полуплоскость образована прямой и вектором нормали. /// Т.е. точка должна лежать с той же стороны, в которую направлен вектор нормали данной прямой. /// Т.о. точка будет иметь положительное решение если она лежит в той полуплоскости куда направлен вектор норали. /// </summary> /// <param name="point"></param> /// <returns></returns> public bool isPointBelongsToPositiveHalfPlane(Coordinate2D point) { var equatiorResult = solveForPoint(point); return(equatiorResult > 0 || Math.Abs(equatiorResult) < EPSILON); }
/// <summary> /// Прямая заданная своим уравнением (коэффициенты A,B,C и вектор нормали) /// </summary> /// <param name="name"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="c"></param> /// <param name="normalCopy"></param> /// <param name="basicPointCopy">координаты базовой точки на прямой (см описание basicPoint)</param> /// <param name="bezieTantengPointCopy"></param> /// <param name="userData"></param> private Line2D(string name, double a, double b, double c, Vector2D normalCopy, Coordinate2D basicPointCopy, Coordinate2D bezieTantengPointCopy, object userData) { UserData = userData; A = a; B = b; C = c; _name = name; Normal = normalCopy; BasicPoint = basicPointCopy; BezieTangentPoint = bezieTantengPointCopy; _intersectionPoints = new Dictionary <Line2D, Coordinate2D>(); }
/// <summary> /// Проверяет что абсцисса точки point между абсциссами конца отрезка /// </summary> /// <param name="testPoint"></param> /// <returns></returns> private bool isHorizontallyIncluded(Coordinate2D testPoint) { return((testPoint.X >= A.X && testPoint.X <= B.X) || ((testPoint.X <= A.X && testPoint.X >= B.X))); }
/// <summary> /// Проверяет что ордината точки point между ординатами конца отрезка /// </summary> /// <param name="point"></param> /// <returns></returns> private bool isVerticallyIncluded(Coordinate2D point) { return((point.Y >= A.Y && point.Y <= B.Y) || ((point.Y <= A.Y && point.Y >= B.Y))); }
/// <summary> /// </summary> /// <param name="point"></param> /// <returns>TRUE если точка лежит на данном отрезке</returns> public bool contains(Coordinate2D point) { return(isHorizontallyIncluded(point) && isVerticallyIncluded(point) && directLine.isPointBelongs(point)); }
public LineSegment(Coordinate2D p1, Coordinate2D p2) { A = p1; B = p2; directLine = new Line2D(A, B, "", null); }