Einen Umschlag um eine Kurve zeichnen

9

In meiner C # WinForms-Anwendung habe ich eine Picturebox, die 2 Kurven beherbergt (aus einer Spannungs- / Strommessung abgeleitet). Die X-Achse ist Spannung und Y-Achse ist Strom. Die Spannungsachse liegt im Bereich von -5 bis 5, aber die Stromachse ist eine viel kleinere Skala im Bereich von -10 μA bis 10 μA. Die Aufgabe besteht darin, zu sehen, ob die zweite Kurve innerhalb von 10% der ersten Kurve liegt.

Bei der visuellen Inspektion versuche ich eine Umhüllende um die erste Kurve (blaue) zu zeichnen. Die Kurve ist nur ein PointF -Array. Im Moment, da ich keine Ahnung habe, wie man eine korrekte Hüllkurve um die blaue Kurve zeichnet, zeichne ich einfach zwei andere Kurven, die das Ergebnis von X-Punkten der tatsächlichen Kurve sind, die um 10% der ursprünglichen Kurve addiert und subtrahiert werden. Natürlich ist das ein schlechter Ansatz, aber zumindest für den Bereich der Kurve, der merkbar vertikal ist, funktioniert es. Aber sobald sich die Kurve auf ihrem nicht vertikalen Abschnitt befindet, funktioniert dieser Trick nicht mehr, wie Sie auf dem Bild unten sehen können:

Hier ist der Code, den ich verwende, um den Umschlag zu zeichnen:

%Vor%

Die grünen Kreise werden von mir selbst hinzugefügt, und sie geben die Region an, in der die zweite Kurve (rot) potenziell eine Differenz größer als 10% von der ursprünglichen Kurve aufweist.

Wäre schön, wenn mich jemand in die richtige Richtung bringt, worauf sollte ich achten, um einen schönen Umschlag um die ursprüngliche Kurve zu erstellen?

UPDATE Weil ich so noob bin, kann ich keinen Weg finden, die Antworten, die auf diese Frage gegeben wurden, bis jetzt zu implementieren. Also, setze eine Prämie, um zu sehen, ob jemand mir freundlicherweise zumindest einen Kodierungsansatz für dieses Problem zeigen kann.

    
Saeid Yazdani 05.06.2012, 11:24
quelle

4 Antworten

1

Am besten iterieren Sie Ihre Punktmatrix und berechnen Sie einen senkrechten Vektor zu zwei aufeinanderfolgenden Punkten (siehe Berechnen eines Kreuzprodukts eines 2D-Vektors für Implementierungshinweise. Projizieren Sie in beide Richtungen entlang dieser senkrechten Vektoren, um die zwei Punktarrays Ihrer Hüllkurve zu erzeugen.

Diese Funktion generiert sie grob unter Verwendung von Segmentmittelpunkten (solange die Punktzählung hoch ist und Ihr Offset nicht zu klein ist, sollte er beim Plotten in Ordnung sein):

%Vor%     
zeFrenchy 08.06.2012, 13:33
quelle
3

Sie könnten versuchen, den Gradient zwischen jedem Punktepaar zu finden und zwei Punkte auf jeder Seite zu berechnen, die auf der Orthogonalität liegen, die durch den Mittelpunkt verläuft.

Sie hätten dann zwei weitere Zeilen, die als eine Menge von Punkten definiert sind, die Sie zum Zeichnen der Hüllkurve verwenden könnten.

    
Nicholas Butler 05.06.2012 11:32
quelle
1

Es hängt alles davon ab, wie groß der Umschlag sein soll.

Sie können die Steigung der Kurve in jedem Punkt berechnen / schätzen, indem Sie die Steigung zum nächsten Punkt und die Steigung zum vorherigen Punkt berechnen, diese mitteln und dann einen senkrechten Vektor zur Steigung berechnen.

Fügen Sie diesen Vektor zum Punkt der Kurve hinzu; Dies gibt Ihnen den rechten Rand des Umschlags.

Subtrahiere diesen Vektor vom Punkt der Kurve; Dies gibt Ihnen den linken Rand des Umschlags.

Diese Methode schlägt fehl, wenn die Punkte zu weit auseinander liegen oder sehr plötzliche Änderungen der Punkte auftreten.

    
Erno de Weerd 05.06.2012 12:30
quelle
0

Dies ist wahrscheinlich ein dummer Vorschlag. Vielleicht könnten Sie, anstatt den Umschlag selbst zu zeichnen, Winforms das für Sie tun lassen. Versuchen Sie, den Briefumschlag als Linie mit einem Stift mit größerer Breite zu zeichnen. Vielleicht könnte es funktionieren.

Wenn Sie sich dieses msdn-Beispiel ansehen, wenn Sie die Stiftbreite ändern, sehen Sie vielleicht, was ich meine.

Ссылка

    
gorengpisang 12.06.2012 05:11
quelle

Tags und Links