Virtueller Graph

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Virtueller Graph

    Hallo.

    Ich komme nicht mehr weiter. Ich habe absolut wirklich keine Ahnung wie ich einen eigentlich simplen Graphen zeichnen soll, welcher sich nicht in einer Linie ausdrückt - sonder durch einzelne Objekte (Spitzen).

    Ich hab mir eigentlich alle gängigen Plot / Graphen Libraries angeschaut. Eigentlich tue ich in den letzten 3 Tagen nichts anderes.

    Mein Ziel ist es einen Graphen wie in dem Bild unten zu erstellen. Anstelle, dass eine Library mir etwas zeichnet, brauche ich eigentlich nur die reinen Werte, damit ich selbst die Ausgabe bestimmen kann.
    Die Kurve des Graphen besteht eigentlich nur aus 5 Koordinaten.

    Bildschirmfoto 2014-07-15 um 17.36.48.png


    Leider finde ich keine Funktion innerhalb von Core Graphics, die Koordinaten in eine smoothe (weiche) Kurve wandelt. Siehe Bild:
    ergebnis.png


    Core-Plot und Co kann das. Allerdings habe ich dann noch das Problem, dass ich ja gar keine Linie will, sondern Spitzen.
    Nur wie zeichne ich Spitzen? Woher nehme ich die Daten? Am besten wäre eine Funktion, welche mir die Y-Position (Value) anhand der X-Position wiedergibt.


    Alá
    (float) getYPositionByUsingXPosition:(float)xPos{

    }


    Vorher würde ich natürlich das Objekt der Methode mit den Daten füttern. Deshalb der Ausdruck "Virtueller Graph" - da er nur mathematisch existiert und somit keine grafische Ausgabe besitzt.

    Oder ist das der falsche Angang?

    Danke für jede Hilfe.

    Gruss
    Moritz

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von mogiohh ()

  • Das Stichwort dazu ist Interpolation. Du willst mit 5 Stützwerten eine Funktion interpolieren, die teilweise "weich", teilweise "mit Spitzen" ist? Abgesehen davon, dass "weich" und "spitz" reichlich unpräzise Begriffe sind (für die es verschiedene mathematische Konzepte gibt), gibt es für die Aufgabe unendlich viele Lösungen, das Problem ist unterdefiniert. Daher ist nicht überraschend, dass das keine Bibliothek ohne weiteres für dich macht.

    Ohne weitere Informationen würde ich es aus dem Bauch heraus mit kubischen Splines versuchen, für "weich" C2-Kontinuität und für "spitz" C0-Kontinuität. Trotzdem müsstest du wenigstens wissen, wo die spitzen Stellen der Kurve sein sollen. Oder habe ich da deine Aufgabenstellung ganz falsch verstanden?
    Multigrad - 360°-Produktfotografie für den Mac
  • mogiohh schrieb:

    Vorher würde ich natürlich das Objekt der Methode mit den Daten füttern. Deshalb der Ausdruck "Virtueller Graph" - da er nur mathematisch existiert und somit keine grafische Ausgabe besitzt.

    Ein mathematischer Graph (Funktionsgraph) muss auch nicht gezeichnet sein. Du kannst Dein Gebilde auch einfach Funktion nennen, und die Ermittellung unbekannter Punkte nennt man auch Inter- oder Extrapolation. Dabei ist wichtig zu wissen, welche Stützstellen (= bekannten Werte) Du hast.
    „Meine Komplikation hatte eine Komplikation.“
  • MarkusM schrieb:

    Die "Spitzen" kann man als Sonderform von Balken ansehen. Core Plot kann Balkengrafik (Bargraph) darstellen. Für die Breite der Balken setzt Du einen kleinen Wert und schon hast du Spitzen.


    Hi Markus. Leider funktioniert, dass was du vorhast so nicht. Denn Ich habe nur 5 Werte. Dein Weg würde voraussetzen, dass man pro Linie einen Wert hat. Das ist nicht der Fall. Ich könnte den Durchschnitt errechnen... nur wären jene dann nicht mehr "Weich" sonder "liniar".
  • Hi Mattik.

    mattik schrieb:

    Das Stichwort dazu ist Interpolation. Du willst mit 5 Stützwerten eine Funktion interpolieren, die teilweise "weich", teilweise "mit Spitzen" ist?

    - Nein das ist nicht korrekt. Es soll nur ein weicher Graph sein...der sozusagen anhand von "geglätteten" Werten dargestellt wird. Die "Spitzen" sind nur die Art und Weise wie der Graph visuell wirkt - sagt aber nichts über die Werte aus. Schau dir mal das 1. Bild an was ich angehängt hatte.
  • Sollen die einzelnen Balken echte Werte darstellen oder ist die einfach nur "Optik/Design" als "Füllfläche"?

    Bei echten Werten hättest Du ja die entsprechenden Werte. Bei "Optik/Design" als "Füllfläche" kannst Du wie von macuser bereits vorgeschlagen aus dem vorhandenen Pfad ein clipping erzeugen und dann munter drauf los malen bzw. sogar mit einem Pattern füllen. ;)

    Alternativ kannst Du aus dem Pfad natürlich auch einfach eine Fläche machen und diese dann mit einem Pattern füllen.
  • macmoonshine schrieb:

    mogiohh schrieb:

    Vorher würde ich natürlich das Objekt der Methode mit den Daten füttern. Deshalb der Ausdruck "Virtueller Graph" - da er nur mathematisch existiert und somit keine grafische Ausgabe besitzt.

    Ein mathematischer Graph (Funktionsgraph) muss auch nicht gezeichnet sein. Du kannst Dein Gebilde auch einfach Funktion nennen, und die Ermittellung unbekannter Punkte nennt man auch Inter- oder Extrapolation. Dabei ist wichtig zu wissen, welche Stützstellen (= bekannten Werte) Du hast.


    Ok und wie würdest du an die Sache rangehen? Wie berechne ich die Kurven? Denke mal ohne Libraries werde ich da nicht weit kommen.
  • MCDan schrieb:

    Sollen die einzelnen Balken echte Werte darstellen oder ist die einfach nur "Optik/Design" als "Füllfläche"?

    Bei echten Werten hättest Du ja die entsprechenden Werte. Bei "Optik/Design" als "Füllfläche" kannst Du wie von macuser bereits vorgeschlagen aus dem vorhandenen Pfad ein clipping erzeugen und dann munter drauf los malen bzw. sogar mit einem Pattern füllen. ;)


    Hi there.
    Es gibt 5 Werte. Jene 5 Werte werden durch ein Linie in Form einer Kurve verbunden. Damit die Kurve nicht eckig ist muss sie Rund sein ... (lol macht irgendwie Sinn).
    Die Balken oder Spitzen oder nennen wir es Pattern ist dur die grafische Art und Weise wie die Kurve dargestellt wird. Die Werte sind ja eh nur kalkulierte Werte. Denn wir haben ja nur 5.
    Aber alle 10 Pixel einen Balken
  • Ich gäbe in einer perfekten Welt eine Funktion, welche eine Graphen erstellt. JEDOCH nicht zeichnet .. sondern mir die Möglichkeit gibt die Kurve zu analysieren.
    Dieses Gebilde könnte ich mit Werten speisen. 5 * ein Array mit jeweils X un Y. Diese 5 Koordinaten würden dann per kurve verbunden werden.

    Nun könnte ich abfragen wie hoch der wert auf x position 2,123 (%Wert) wäre. Und bekäme den Wert den ich dann nutzen könnte um meine eigene Ausgabe zu erstellen. Nur leider scheint es sowas nicht zu geben. Denke mitlerweile über html5 einbettung nach. Traurig irgendwie
  • Hast bzw. kannst Du die Linie aus Bild 2 jetzt schon erzeugen, oder fehlt Dir dazu schon der Ansatz?

    Wenn Du diese Line bereits als NSBezierPath hast, dann kannst Du daraus z.B. eine Fläche machen, also am Ende des aktuellen Pfads eine Line nach unten rechts, dann eine weiter nach unten links und dann den Pfad einfach schliessen. Evtl. fehlt noch die Linie zum Startpunkt, allerdings sollte diese beim Close eigentlich automatisch hinzugefügt werden.

    Die daraus resultierende Fläche kannst Du jetzt einfach mit einem Pattern füllen.

    Ein Pattern kannst Du einfach mit NSColor per colorWithPatternImage: erzeugen und per setFill für den aktuellen Context als Füllfarbe setzen.

    ich verstehe nicht, warum da immer so kompliziert denken muss. Keep it lean, keep it simple. ;)
  • mogiohh schrieb:

    Ok und wie würdest du an die Sache rangehen? Wie berechne ich die Kurven? Denke mal ohne Libraries werde ich da nicht weit kommen.

    Wie mattik schon geschrieben hat, ist Interpolation ein weites Feld. In der Regel hat man Stützstellen und eine Annahme, wie die Funktion aussehen soll (z. B. eine physikalische Gleichung).

    Wenn Du fünf xy-Wertpaare hast, kannst Du beispielsweise ein Polynom vom Grad 4 da durchlegen. Das ist schön glatt, erfüllt exakt Deine Vorgaben (Stützstellen) sieht in der Regel aber nicht so aus, wie Du es gerne hättest.

    Wo kommt denn Dein Problem her?
    „Meine Komplikation hatte eine Komplikation.“
  • MCDan schrieb:

    Hast bzw. kannst Du die Linie aus Bild 2 jetzt schon erzeugen, oder fehlt Dir dazu schon der Ansatz?


    Linie Nummer 2 per CoreGraphics gezeichnet worden. Wie du siehst bekommen ich damit ein unschönes Resultat heraus. Denn man kann nur eine Kurve zeichnen zwischen 2 Punkten. Will man den Graphen fortsetzen, zeichnet man natürlich vom Endpunkt einen weiteren Bezier (2 Punkte). Die Verbindung von Punkt 2 und Punkt 3 kann nicht weich sein. Da Bezier 1 ja nicht die Kurvenform von Bezier 2 kennt. Also bekommst du das Ergebnis von Bild 2


    Die daraus resultierende Fläche kannst Du jetzt einfach mit einem Pattern füllen.

    Ja über den Ansatz hatte ich auch schon gedacht. Hätte es per Maske oder ähnlichem versucht. Aber ok man könnte im Notfall auch eine Grafiken verwenden. Schade... denn so könnte ich auch nicht animieren.

    Aber jener Schritt würde ja nur Sinn machen wenn ich wirklich einen weichen Pfad (Nicht nur eine einzelne Kurve) per CoreGraphics zeichnen könnte.

    Gruss
  • Mag ja sein, dass ich eine faule Sau bin, aber ich hätte zunächst den letzten Vorschlag von MCDan in ähnlicher Weise genutzt.

    Ein fertiges Image mit den Linien unten hin pappen.
    Ein Shape zeichnen, welches oben links anfängt, nach oben rechts geht, bei Punkt 5 endet, dann die 'weichen Linien' zu den Punkten 4, 3, 2 und 1 ziehen, eine Gerade nach oben links ziehen und das Ganze dann entsprechend der Hintergrundfarbe füllen. Damit überdeckst Du dann stumpf die Linien der Graphik, die nach oben Weggehen.

    Natürlich ist MCDans Ansatz ein schöner. Eventuell hat er seine erste Idee auch noch einmal überdacht, bevor er sie niedergeschrieben hat. =)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich glaube, ich verstehe das Problem.
    Wir reden von NSBezierPath, mogiohh arbeitet aber mit CGPath.

    Eventuell solltest Du das Shape mit einem NSBezierPath realisieren und dann in eine CGPathRef konvertieren, welche Du an CoreGraphics übergibst.
    developer.apple.com/library/ma…ingGuide/Paths/Paths.html
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P