/// <summary> /// Добавление опорной точки. /// </summary> /// <param name="Add"> Добавляемая точка. </param> public bool AddPoint(PointSpline Add, out int Position) { Position = -1; try { if (Points.Count < 2) { Position = Points.Count; Points.Add(Add); } else { int k = Points.Count; int i; double Min; Min = PointsLength(Add, Points[0], Points[Points.Count - 1]); for (i = 0; i < Points.Count - 1; i++) { if (Min > PointsLength(Add, Points[i], Points[i + 1])) { Min = PointsLength(Add, Points[i], Points[i + 1]); k = i + 1; } } Points.Insert(k, Add); Position = k; ReBuild(); } } catch { return(false); } return(true); }
/// <summary> /// Добавление опорных точек. /// </summary> /// <param name="Add"> Добовляемая точка. </param> /// <returns> Выполнил или нет. </returns> public bool AddPoint(PointSpline Add, out int Position) { Position = -1; try { int i; /*Ищем куда вставить*/ for (i = 1; i < Points.Count; i++) { if (Points[i].X > Add.X && Points[i - 1].X != Add.X) { /*Вставляем элементы*/ Points.Insert(i, Add); Position = i; return(true); } } /*если не нашли и он больше последнего*/ if (Add.X > Points[Points.Count - 1].X) { Points.Add(Add); Position = Points.Count - 1; return(true); } } catch { return(false); } return(true); }
/// <summary> /// Расстояние от точки до отрезка. /// </summary> /// <param name="A"> Точка. </param> /// <param name="B"> Первая точка отрезка. </param> /// <param name="C"> Вторая точка отрезка. </param> /// <returns></returns> private double PointsLength(PointSpline A, PointSpline B, PointSpline C) { PointSpline V = C - B; PointSpline W = A - B; double c1 = PointsLenght(W, V); if (c1 <= 0) { return(Math.Sqrt(PointsLenght(A - B, A - B))); } double c2 = PointsLenght(V, V); if (c2 <= c1) { return(Math.Sqrt(PointsLenght(A - C, A - C))); } double b = c1 / c2; PointSpline Pb = B + V * b; return(Math.Sqrt(PointsLenght(A - Pb, A - Pb))); }
/// <summary> /// Скалярное произведение векторов. /// </summary> /// <param name="A"> Первая точка. </param> /// <param name="B"> Вторая точка. </param> /// <returns></returns> private double PointsLenght(PointSpline A, PointSpline B) { return(A.X * B.X + A.Y * B.Y); }
/// <summary> /// Значение Y на отрезке AB. /// </summary> /// <param name="X"> Значение X. </param> /// <param name="A"> Точка начала отрезка. </param> /// <param name="B"> Точка конца отрезка. </param> /// <returns> Y(X). </returns> private double ReturnY(double X, PointSpline A, PointSpline B) { return((X - A.X) * (B.Y - A.Y) / (B.X - A.X) + A.Y); }