mikrocontroller.net

Forum: PC-Programmierung Kennlinie per Mauszeiger graphisch verändern


Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gesucht wird eine Möglichkeit um eine gegebene Kennlinie per Mauszeiger 
zu verändern. Im Anschluß darann sollen die "neuen" Y-Werte  berechnet 
werden.
Programme wie Flash und Photshop benutzen diese Technik um 
Gradationskurven
und Farbsättigungen zu verändern.

Als Werkzeug steht mir MS Visual Studio 2008 zur Verfügung.
Hab ich eine Chance?

Gruß
Bernd

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BerndB schrieb:

> Hab ich eine Chance?

Eine Chance hat man immer.

Wie sind deine Vorkenntnisse?

Autor: Zipp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja. Man muss den Graphen als mit der Maus greifbare Objekte darstellen 
und dann den Graphen aendern lassen. Sowas wird's kaum als Komponente 
geben, also selbst schreiben. Eine Frage der Tools, die man verwendet. 
Ein geuebter Delphi Benutzer macht sowas in einer halben Stunde.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zipp schrieb:
> Naja. Man muss den Graphen als mit der Maus greifbare Objekte darstellen
> und dann den Graphen aendern lassen.

Kommt auf die Kennlinie an.

Auch denkbar ist, dass die Kennlinie einer mathematischen Formel folgt. 
Um bei Bildbearbeitung zu bleiben, zb die Gamma-Funktion.
Dann reicht es zusätzlich einen Regler zu haben an dem man drehen kann. 
Eventuell reichen auch 2 oder mehrere Schieberegler um bestimmte 
Kennpunkte in der Kennlinie zu verändern, etc.

Kommt halt immer auf die Details an.

Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,
also Kenntnisse in VB und C++ habe ich schon, aber dises Thema ist neu 
für mich, weil ich bisher nur mit vorgegebenen Tools gearbeitet habe.
Wie kann ich mir so einen gewünschten Graphen erstellen?

Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,
per Regler denke ich ist es kein großes Problem,
aber verlangt ist "Veränderung via Mauszeiger" und das bereitet mir 
große
Probleme!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WIeso? Mach es doch estmal per Regler. Wenn das klappt, mußt du dir nur 
überlegen wie du Mausbewegung/Drag sich auf den Reglerwert auswirkt und 
fertig bist du...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BerndB schrieb:
> Ok,
> per Regler denke ich ist es kein großes Problem,
> aber verlangt ist "Veränderung via Mauszeiger" und das bereitet mir
> große
> Probleme!

Fang doch erst mal von vorne an.
Diese Kennlinie schwebt ja nicht im luftleeren Raum. Du brauchst ja erst 
mal ein Control mit dem du die Kennlinie überhaupt zeichnen kannst und 
das du dann in der Programmiersprache deiner Wahl auf irgendeinen 
Dialog/Formular, oder was auch immer du dann benutzt, einsetzen kannst.

Hast du sowas schon?

Läubi hat schon recht:
Wenn es mit Schiebereglern auch geht, dann fang damit an. Dein Kunde 
wird dir unter Umständen sogar dankbar dafür sein, weil man mit 
Schieberegler und danebenstehendem Zahlenfeld einen Wert sehr viel 
besser einstellen kann, als wie wenn man in einer briefmarkengroßen 
Grafik versucht eine Linie mit der Maus genau auf ein bestimmtes Pixel 
zu setzen, nur um dann festzustellen, dass der eigentlich gewünschte 
Wert sich zwischen 2 Pixel befindet und daher mit der Maus nicht 
erreichbar ist.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, zwei Anregungen :
http://www.codeproject.com/KB/miscctrl/gradient.aspx
http://www.codeproject.com/KB/dialog/AdobeGradient.aspx

bei intensiever Suche findet mann immer etwas, was halbwegs passt oder 
nur geringfühgig geändert werden muss.

Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube ihr habt Recht!
Zunächst werde ich erst einmal mit einfachen Zeichenprogrammen anfangen
und werde dann sehen was möglich ist!

Also vielen Dank!

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernd,
So eine Zuordnung ist ja im Normalfall keine Tabelle aus x Punkten, 
sondern eine wie auch immer geartete mathematische Relation.
Zu dem Thema eine Kurve mit n Punkten konstruieren fällt mir spontan 
Bezierkurve ein. Die macht genau das. So dürfte das auch in jedem CAD 
und besserem Zeichenprogramm funktionieren. Zur besseren Handhabbarkeit 
werden sogenannte Splines verwendet, das sind soweit ich weiß stückweise 
Bezierskurven, die stetig ineinander übergehen.
Siehe auch Wikipedia zu Beziers, Splines und B-Splines
Da gibt es im Internet auch garantiert Code so daß Du nicht das Rad neu 
erfinden musst.
Ich würde mir das in etwas so vorstellen wie bei Gimp: Am Anfang hast Du 
eine Gerade von 0 - 100%. Jetzt kannst Du einen beliebigen Punkt auf 
dieser Gerade setzen, der die Gerade in zwei Splines zerlegt, die 
entsprechend gerechnet und angezeigt werden müssen. Jeder weitere Punkt 
zerlegt die Kurve in weitere Splines.
Bei allem Respekt, die Aussage
>Ein geuebter Delphi Benutzer macht sowas in einer halben Stunde.
glaube ich nicht, höchstens wenn er das Testen dem Kunden überlässt und 
dann noch ne Woche mit Bugfixes und Redesigns zubringt :-))
(No Offend, aber meine Meinung)
Udo

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U.R. Schmitt schrieb:

> Diskussion von Relationen und Bezier-Splines

Das kann so sein, muss es aber nicht.
Im einfachsten Fall ist eine Kennlinie einfach nur eine Gerade, deren 
Endpunkt man verschieben kann


>>Ein geuebter Delphi Benutzer macht sowas in einer halben Stunde.
> glaube ich nicht,

Kommt drauf an, was er in seinem Codearchiv schon alles vorrätig hat und 
natürlich auch wie aufwändig die Kennlinie dann tatsächlich zu 
realisieren ist.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Das kann so sein, muss es aber nicht.
> Im einfachsten Fall ist eine Kennlinie einfach nur eine Gerade, deren
> Endpunkt man verschieben kann

Natürlich, aber der Hinweis auf die Gradationskurven hieß für mich eben 
die Möglichkeit durch Einsatz zusätzlicher Punkte die Möglichkeit zu 
haben nichtlineare Kurven zu erzeugen.

> Kommt drauf an, was er in seinem Codearchiv schon alles vorrätig hat und
> natürlich auch wie aufwändig die Kennlinie dann tatsächlich zu
> realisieren ist.

Dann müßte er die komplette Berechnung einer z.B. B-Spline Kurve aus 
einem Satz von Punkten schon als fertige Funktion vorliegen haben. Und 
dann hätte der Hinweis wie man das technisch macht dem TE bestimmt mehr 
geholfen als sich hinzustellen und zu sagen, Achtung: <Ironie an> "Nimm 
Delphi und wenn Du was taugst brauchst Du nur ne halbe Stunde"
<Ironie aus>.
Und selbst dann, ne halbe Stunde ist nicht sehr viel.

Egal, ich hoffe dem TE helfen die Stichworte weiter.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
U.R. Schmitt schrieb:

> Egal, ich hoffe dem TE helfen die Stichworte weiter.

Ich denke es ist das übliche:
Dem TO ist noch nicht klar, was er eigentlich machen will/soll. Er hat 
nur die Stichworte: Kennlinie, Grafik, Maus.
Und natürlich: mach mal

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ganz billige lösung:


das ganze ist ja eine n zu m Abbildung, die meist so dargestellt wird, 
das x der Originalwert und auf y der zugeordnete wert ist.

man male also ein m x n (meist m==n) Kästchen mit der Ursprungskurve 
(zB, Identität)

klickt der benutzer dann auf die Zeichenfläche setzt er direkt den wert 
des angeklickten Pixels, das heißt, wird auf pixel (5,10) geklickt, wird 
in der Look-Up-Tabelle, die die Transformation macht, für den 
Originalwert 5 der Zielwert 10 geschrieben. Das alte Pixel bei 5,5 wird 
gelöscht und das neue gesetzt.

Tatsächlich würde ich das Mouse-Down und MouseMove-Ereignis benutzen.
Der Benutzer muss dann mit einer möglichst kontinuierlichen Bewegung 
einfach nur die Kurve zeichnen.
Ist zwar nicht so schön, wie das Verstellen mit Splines, dafür aber sehr 
schnell aufgeschrieben und reicht für den Anfang.

Ich hab das genau so auch schon mal in einem Progrmm gesehen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Dann müßte er die komplette Berechnung einer z.B. B-Spline Kurve aus
>einem Satz von Punkten schon als fertige Funktion vorliegen haben.

Richtig. Und Delphi kann das von Haus aus.

MfG Spess

Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank an alle!

Die Stichworte haben mir weiter geholfen.

Gruß
Bernd

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Excel kann das auch und rechnet sogar die Werte zurück ;)

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey BerndB, guck Dir mal das Programm Paint.NET an.
Im Fenster "Curves" hat es genau so eine Kurve die per Maus bearbeitet 
werden kann und neue Punkte eingefügt werden können.
Menu->Adjustments->Curves

Eigentlich dachte ich, das Ding wäre open source, aber ich kann die 
Sourcen nirgends finden. Falls man etwas findet, könnte man dort 
nachsehen, wie es dort gemacht ist...

Das Programm gibts hier:
http://www.getpaint.net/

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och neeeee, Paint.NET ist leider nicht mehr open source. :-(
http://de.wikipedia.org/wiki/Paint.NET
Shame on you, Microsoft.

Sorry für mein obiges Posting, das ist hiermit leider sinnlos... Ausser 
man würde sich eine alte Version anschauen, welche noch open source war.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kann mir denken was der OT möchte, das gleiche wie das, was ich 
mal wollte.

Er möchte eine X-Y-Kennlinie mit der Maus anpassen, eben wie das z.B. 
bei Photoshop gemacht wird.

Nunja, man braucht eigentlich nur eine Routine über die man mehrere 
Punke ins Diagramm einsetzen kann, welche dann mit der Maus verschiebbar 
sind. Der Mathematische Teil sorgt dann dafür, dass die Linie auch 
fließend durch die Punkte geht, also nicht im Zick-Zack sondern schön 
geschwunden. Das macht man mit einer sogenannten Spline-Kurve, wobei die 
Informationen dazu im Web bei meinem letzten Suchlauf etwas mager 
ausfielen. Die Berechnung der Spline-Kurve gibt nun zu jedem X-Punkt 
auch den passenden Y-Punkt, wodurch wir auch gleich die Funktion y(x) 
haben.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Thread nicht ganz gelesen und stelle nun fest, dass hier bereits 
einige Leute den entsprechenden Tipp gepostet haben.

Nunja es gibt ja nun verschiedene Arten von Spline-Interpolation.

Irgendwie diese B-Splines, die sich allerdings eher wie Bezier-Kurven 
verhalten, bei denen die gesetzen Punkte nur wie Magnete wirken, die die 
Kurve in die entsprechende Richtung ziehen.

http://userpage.fu-berlin.de/~vratisla/Bildverarbe...

Dann noch irgendwelche anderen Splines (kubische Splines?), bei denen 
die Kurve tatsächlich durch die gesetzen Punkte hindurch geht. Das ganze 
völlig frei auf der Zeichenfläche.

http://www.frank-buss.de/spline.html

Und dann habe ich noch eine Variante gefunden, bei der sich das ganze im 
X-Y-Koordinatensystem befand und den Regeln einer mathematischen 
Funktion folgte, d.h. man konnte darin nur eine X-Y-Kurve mit 
verschiedenen Punkten erstellen und keine sich überlappenden Schlaufen 
wie bei einer freien 2D-Darstellung.

http://www.serc.iisc.ernet.in/~amohanty/SE288/lagr...
auch sehr schön:
http://terpconnect.umd.edu/~petersd/interp.html

Autor: Michael Uray (michaeluray)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab den Thread ebenfalls nicht ganz gelesen, aber um sich die ganze 
Geschichte mit dem manuellen Zeichnen zu sparen, würde ich das MS Chart 
Control verwenden:
http://www.microsoft.com/downloads/en/results.aspx...

Da gibt es auch eine große Beispielanwendung von MS dazu:
http://code.msdn.microsoft.com/mschart

Im Prinzip die Kennline über das Control ausgeben und dann die 
Mausklicks für die Änderung der Kennlinie auswerten.

lg.
Michi

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.