Smoothing linii GPS - wygładzanie

0

Witam.

Jak najprościej (najlepiej gotowe algorytmy) lub wbudowane w C#
można wygładzić linię dla smoothingu GPS?

Próbowałem Beziera, ale nie działa ze względu na konieczność używania 3 punktów..

mam punty w formie:

Point point1 = new Point(bX[0], bY[0]);
Point point2 = new Point(bX[1], bY[1]);

i normalnie je rysuje na ekranie

g.DrawLine(linePen, point1, point2);

ale dla nie których danych są bardzo poszarpane

może da się je łatwo wygładzać?

Dobra efekt beziera prezentuje się tak:

Błąd:

Szczegółowe informacje na temat wywoływania debugowania w trybie JIT (just in time)
zamiast tego okna dialogowego znajdują się na końcu tego komunikatu.
************** Tekst wyjątku **************
System.ArgumentException: Parametr jest nieprawidłowy.
  w System.Drawing.Graphics.CheckErrorStatus(Int32 status)
  w System.Drawing.Graphics.DrawBeziers(Pen pen, Point[] points)
  w GUI.Form1.LoadMap(String mp4, String gps, String nowyName) w c:\Users\admin\Documents\Visual Studio 2013\Projects\GUI\GUI\Form1.cs:wiersz 1934
  w System.Windows.Forms.Form.OnLoad(EventArgs e)
  w System.Windows.Forms.Form.OnCreateControl()
  w System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
  w System.Windows.Forms.Control.CreateControl()
  w System.Windows.Forms.Control.WmShowWindow(Message& m)
  w System.Windows.Forms.Control.WndProc(Message& m)
  w System.Windows.Forms.Form.WmShowWindow(Message& m)
  w System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Zestawy załadowane **************
mscorlib
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
  CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
GUI
  Wersja zestawu: 1.0.0.0
  Wersja Win32: 1.0.0.0
  CodeBase: file:///C:/Users/admin/Documents/Visual%20Studio%202013/Projects/GUI/GUI/bin/x64/Release/GUI.exe
----------------------------------------
System.Windows.Forms
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
   Wersja zestawu: 4.0.0.0
   Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
   CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Windows.Forms.resources
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1055.0 built by: NETFXREL2
  CodeBase: > file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_pl_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
System.Configuration
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Core
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Xml
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1099.0 built by: NETFXREL4STAGE
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Accord
  Wersja zestawu: 3.7.0.0
  Wersja Win32: 3.7.0.6075
  CodeBase: file:///C:/Users/admin/Documents/Visual%20Studio%202013/Projects/GUI/GUI/bin/x64/Release/Accord.DLL
----------------------------------------
Accord.Video.FFMPEG.x64
  Wersja zestawu: 3.7.0.0
  Wersja Win32:
  CodeBase: file:///C:/Users/admin/Documents/Visual%20Studio%202013/Projects/GUI/GUI/bin/x64/Release/Accord.Video.FFMPEG.x64.DLL
----------------------------------------
Accord.Video
  Wersja zestawu: 3.7.0.0
  Wersja Win32: 3.7.0.6075
  CodeBase: file:///C:/Users/admin/Documents/Visual%20Studio%202013/Projects/GUI/GUI/bin/x64/Release/Accord.Video.DLL
----------------------------------------
System.Drawing.resources
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1055.0 built by: NETFXREL2
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing.resources/v4.0_4.0.0.0_pl_b03f5f7f11d50a3a/System.Drawing.resources.dll
----------------------------------------
mscorlib.resources
  Wersja zestawu: 4.0.0.0
  Wersja Win32: 4.6.1055.0 built by: NETFXREL2
  CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_pl_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------

Kod

 Point punkt = Point.Empty;
                    int pixOfsX = 200;
                    int pixOfsY = 200;
                    bool pokaOdRazuCala = true;
                    int sto;
                    if (pokaOdRazuCala)
                        sto = allMessages.Count-1;
                    else
                        sto = i;
                  List<Point> punkty = new List<Point>();

Dalej:

 // Create points that define line.
                        Point point1 = new Point(bX[0], bY[0]);
                        Point point2 = new Point(bX[1], bY[1]);
                       punkty.Add(point1);

Próba wywołania

if (punkty.Count > 2)
                    {// ilosc punktozordow musi byc wielokrotnoscia 3 : /
                      g.DrawBeziers(linePen2,punkty.ToArray());
                 
                    }

Z pozycji kompilatora dostaję:
A first chance exception of type 'System.ArgumentException' occurred in System.Drawing.dll

Gdy odpalam EXE - błąd z JIT który wstawiłem na początku edytowanej wiadomości.

0
furious programming napisał(a):

https://msdn.microsoft.com/pl-pl/library/9t6sa8s9(v=vs.110).aspx

Pytającemu chyba nie chodzi o anti-aliasing, tylko jakiegoś rodzaju interpolację, wygładzenie kształtu łamanej.
Tak myślę.

Jeśli o to chodzi, to mając tylko dwa punkty i tak nic nie wyczarujesz.

0

Zrób metodę najmniejszych kwadratów nad jakąś ludzką przestrzenią funkcyjną. Może być nawet Bezier nad wielomianami Bernsteina. Tutaj masz wszystko dokładnie wytłumaczone:
https://pomax.github.io/bezierinfo/

Edit1:
Tutaj jest nawet jakiś kod:
http://inductivebias.com/Blog/least-squares-curve-fitting/

Edit2:
Tutaj jest kod dokładnie opisujący to, o czym mówię:
http://jimherold.com/2012/04/20/least-squares-bezier-fit/

Dorób do tego p-adaptację: jak błąd jest duży, to dodajesz punkt kontrolny i tak w kółko dopóki nie stwierdzisz, że błąd jest wystarczająco niski lub punktów kontrolnych jest za dużo. W zasadzie jedynym problemem jest wyprowadzenie sobie równania na macierz M, ale to możesz spróbować wyprowadzić z definicji krzywej Beziera nad n punktami kontrolnymi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1