Пример #1
0
 /// <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);
 }
Пример #2
0
 /// <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);
 }
Пример #3
0
        /// <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)));
        }
Пример #4
0
 /// <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);
 }
Пример #5
0
 /// <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);
 }