[gelöst] Mathefrage

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

[gelöst] Mathefrage

Beitrag von fliegermichl »

Ich soll eine solche Ertragsdarstellung programmieren.
Beispiel_Grafik_Ertragsprognose.jpg
Beispiel_Grafik_Ertragsprognose.jpg (17.46 KiB) 4621 mal betrachtet
Bekannt sind die Höhe der Kosten (Längster roter Balken), der Ertrag pro Jahr und der sich daraus ergebende Ertrag über die Laufzeit.
Natürlich ist auch die Höhe des Darstellungsbereiches bekannt (in Pixeln)
Was ich nicht hinbekomme, ist die Y Position der Nulllinie zu ermitteln.
Zuletzt geändert von fliegermichl am Mi 11. Okt 2023, 08:16, insgesamt 1-mal geändert.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Mathefrage

Beitrag von corpsman »

Du hast also gegeben

f(1) = y1
und
f(25) = y2
=> Mit hilfe der 2.Punkte Form kannst du das fehlende m und b für f(x) = m*x+b ermitteln.

Danach brauchst du nur noch eine gewünschten Stellen einsetzen und Fertig ;)
--
Just try it

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Mathefrage

Beitrag von Warf »

fliegermichl hat geschrieben:
Di 10. Okt 2023, 11:47
Bekannt sind die Höhe der Kosten (Längster roter Balken), der Ertrag pro Jahr und der sich daraus ergebende Ertrag über die Laufzeit.
Natürlich ist auch die Höhe des Darstellungsbereiches bekannt (in Pixeln)
Was ich nicht hinbekomme, ist die Y Position der Nulllinie zu ermitteln.
Naja ganz einfach, sagen wir mal dein Kosten Balken ist "min" und der letzte Gewinnbalken ist Max. Dann hast du 3 fälle:
1. min >= 0, dann ist dein 0 punkt ganz unten "auf dem boden".
2. max <= 0, dann ist der 0 punkt ganz oben
3. min < 0, max > 0: Dann ist der anteil deines graphs der für den Min banken "resarviert" ist (abs(min)+max)/min und der Anteil der für deinen max Balken reserviert ist (abs(min)+max)/max

Also so etwas:

Code: Alles auswählen

procedure DrawGraph(values: array of Double);
var
  sharePositive, shareNegative, value: Double;
  pxNull, pxSize, i: Integer;
begin
  if min>=0 then
    sharePositive:=1 // Der ganze graph (100%) ist über dem 0 punkt
  else if max<=0 then
    sharePositive:=0 // Der ganze graph ist unter dem 0 punkt (0% über dem 0 Punkt)
  else
    sharePositive:=(abs(min)+max)/max; // Anteil über dem 0 punkt
  shareNegative:=1-sharePositive; // Alles was nicht positiv ist ist negativ
  
  // Canvas zeichnet von oben nach unten
  pxNull:=round(DrawComp.ClientHeight*sharePositive);
  
  for i:=low(values) to high(values) do
  begin
    value:=values[i];
    if value < 0 then
    begin
      // Balkengröße in pixel = relativer anteil an größtem negativ wert als teil von dem negativen teil des Graphs
      pxSize:=value/values[low(value)] * (shareNegative * DrawComp.ClientHeight);
      DrawComp.Canvas.Rect(graphX(i), pxNull, graphX(i)+pxWidth, pxNull+pxSize);
    end
    else
    begin
      // Balkengröße in pixel = relativer anteil an größtem positiven wert als teil von dem positiven teil des Graphs
      pxSize:=value/values[high(value)] * (sharePositive * DrawComp.ClientHeight);
      DrawComp.Canvas.Rect(graphX(i), pxNull-pxSize, graphX(i)+pxWidth, pxNull);
    end;
end;
wobei graphX die position auf der x Achse berechnet (also sowas wie i*(balkenBreite + 2*Padding)).

Nicht getestet und hat paar veränkungen sind drin da der Canvas den 0 punkt in der oberen ecke hat.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Mathefrage

Beitrag von fliegermichl »

Vielen Dank für die Infos,

ich habe mir den Wikipedia Artikel zu dem Thema angeschaut und bin dann zu folgender Lösung gekommen.
Ertragsspanne ist die Gesamtdifferenz zwischen -Kosten und dem maximalen Ertrag.
th ist die Textbreite des Strings 'Euro'.
Damit das nicht ganz so gequetscht ausschaut nochmal 5 Pixel Abstand

Code: Alles auswählen

  x1 := ErtragsSpanne;  
  x2 := -Kosten;
  y1 := th + 5;
  y2 := ClientHeight - y1 - 5;

  NullY := Round((y2-y1)/(x2-x1)*(0-x1)+y1);
Das werde ich in eine Function packen. Da kann dann der aktuelle Wert (in dem Fall 0) durch den jeweiligen Stand für das Jahr als Parameter übergeben werden.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] Mathefrage

Beitrag von wp_xyz »

Oder TAChart verwenden
Dateianhänge
Ertragsprognose.zip
(2.43 KiB) 55-mal heruntergeladen
ertragsprognose.png
ertragsprognose.png (21.42 KiB) 4495 mal betrachtet

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] Mathefrage

Beitrag von wp_xyz »

... oder etwas aufwendiger mit zwei x-Achsen für die Beschriftung der positiven Werte unter und der negativen Werte über der Achsenlinie:
Dateianhänge
ertragsprognose-2.png
ertragsprognose-2.png (21.94 KiB) 4489 mal betrachtet
Ertragsprognose-2.zip
(2.6 KiB) 56-mal heruntergeladen
Zuletzt geändert von wp_xyz am Mi 11. Okt 2023, 12:57, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Mathefrage

Beitrag von fliegermichl »

Wow, das ist natürlich die beste Lösung.
Vielen Dank dafür.

Antworten