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
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.
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.
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?
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...
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.
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!
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
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.
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.
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
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.
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
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/
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.
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.
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/Bildverarbeitung/Bspline/Bspline.html
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/lagrange/spline.html
auch sehr schön:
http://terpconnect.umd.edu/~petersd/interp.html