[gelöst] Mathefrage
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
[gelöst] Mathefrage
Ich soll eine solche Ertragsdarstellung programmieren.
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.
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.
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- 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
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
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
Just try it
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Mathefrage
Naja ganz einfach, sagen wir mal dein Kosten Balken ist "min" und der letzte Gewinnbalken ist Max. Dann hast du 3 fälle: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.
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;
Nicht getestet und hat paar veränkungen sind drin da der Canvas den 0 punkt in der oberen ecke hat.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Mathefrage
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
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.
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);
Re: [gelöst] Mathefrage
Oder TAChart verwenden
- Dateianhänge
-
Ertragsprognose.zip
- (2.43 KiB) 74-mal heruntergeladen
-
- ertragsprognose.png (21.42 KiB) 4592 mal betrachtet
Re: [gelöst] Mathefrage
... 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 (21.94 KiB) 4586 mal betrachtet
-
Ertragsprognose-2.zip
- (2.6 KiB) 62-mal heruntergeladen
Zuletzt geändert von wp_xyz am Mi 11. Okt 2023, 12:57, insgesamt 1-mal geändert.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: [gelöst] Mathefrage
Wow, das ist natürlich die beste Lösung.
Vielen Dank dafür.
Vielen Dank dafür.