Вписывание кривой (best fit curve) - C#

Узнай цену своей работы

Формулировка задачи:

Очень нужна программа для вписывания дуги чрез точки: В качестве исходных данных имеется массив точек с координатами X и Y. В качестве решения должны получиться координаты X и Y центра кривой и ее радиус. Уже второй день не могу найти пример на VB или C# ((

Решение задачи: «Вписывание кривой (best fit curve)»

textual
Листинг программы
public class Point
{
    public Point (double x, double y)
    {
        X = x;
        Y = y;
    }
 
    public double X;
    public double Y;
}
 
public static class FitCurve
{
    public static bool GetArcInfo (Point[] points, out double x, out double y, out double r)
    {
        x = 0;
        y = 0;
        r = 0;
        if (points == null)
            return false;
        if (points.Length <= 2)
            return false;
        int n = 0;
        for (int i = 0; i < points.Length-1; ++i)
            for (int j = 0; j < points.Length-1; ++j) {
                if (points [i].Y == points [i + 1].Y)
                    continue;
                if (points [j].Y == points [j + 1].Y)
                    continue;
                double Ai = (points [i].X - points [i + 1].X) / (points [i + 1].Y - points [i].Y);
                double Aj = (points [j].X - points [j + 1].X) / (points [j + 1].Y - points [j].Y);
                double Bi = (Math.Pow (points [i + 1].X, 2) - Math.Pow (points [i].X, 2) + Math.Pow (points [i + 1].Y, 2) - Math.Pow (points [i].Y, 2)) / (2 * (points [i + 1].Y - points [i].Y));
                double Bj = (Math.Pow (points [j + 1].X, 2) - Math.Pow (points [j].X, 2) + Math.Pow (points [j + 1].Y, 2) - Math.Pow (points [j].Y, 2)) / (2 * (points [j + 1].Y - points [j].Y));
                if (Ai == Aj)
                    continue;
                double x0 = (Bj - Bi) / (Ai - Aj);
                double y0 = (Ai * Bj - Aj * Bi) / (Ai - Aj);
                x += x0;
                y += y0;
                r += Math.Sqrt (Math.Pow (points [i].X - x0, 2) + Math.Pow (points [i].Y - y0, 2));
                r += Math.Sqrt (Math.Pow (points [j].X - x0, 2) + Math.Pow (points [j].Y - y0, 2));
                ++n;
            }
        if (n == 0)
            return false;
        r = r / (2 * n);
        x /= n;
        y /= n;
        return true;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы