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?
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!
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.
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.
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
Vielen Dank an alle! Die Stichworte haben mir weiter geholfen. Gruß Bernd
Excel kann das auch und rechnet sogar die Werte zurück ;)
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
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?pocId=&freetext=Microsoft%20Chart%20Controls&DisplayLang=en 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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.