Autor Beitrag
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 16:06 
Ich weiss, peinlich. Ich Frage trotzdem mal nach.
Das ist der Ausgangspunkt:

FillSize:= SolveForX(PercentDone, W)
Ergebnis: FillSize 0<=W.

Nun kommt eine Variable dazu, nennen wir sie A diese kann Werte annehmen 0<=X
Fillsize soll nun zusätzlich den Wert von A annehmen und A soll wiederum Proportional >=0 werden wenn Fillsize <=W wird.
vergebliche Versuche, naja......

FillSize:= SolveForX(PercentDone, W) + A ..... (Fillsize (/) (*) irgendwas - irgenwas (/) (*) ...) ????

Aber wie immer pack ich die Reihenfolge nicht, wo was an welcher Stelle mit wem, sein muss!?
Selbst auf Papier(mehrere Seiten) will nichts zustande kommen :oops:

und hoffe da könnt ihr weiter Helfen.

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 04.11.10 16:14 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Fillsize soll nun zusätzlich den Wert von A annehmen und A soll wiederum Proportional >=0 werden wenn Fillsize <=max wird.
Kannst du diesen Satz noch einmal mathematisch definieren? Bis jetzt sieht er für mich so aus, als könnte man das Blaue vom Himmel dort hinein-interpretieren :| .

/edit: Es fängt schon früher an, was soll
Zitat:
Ergebnis: FillSize 0<=W.
bedeuten? 0 <= FillSize <= W?

_________________
>λ=
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 04.11.10 16:15 
Kann es sein das du einfach ne Progressbar nachbauen willst? So mehr oder weniger?

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 16:31 
@elundril: jo hab ich schon. Problem ist der zusätzliche Border, den ich ab bzw dazu rechnen muss.
@Kha: Ok ohne Symbole.

FillSize soll nun zusätzlich den Wert von A annehmen.
A, soll wiederum proportional kleiner gleich 0 werden, wenn FillSize grösser wird bis max W.
Hinweis: A, ist nie grösser als W

Bin nun mal kein Mathematiker um dies so zu schreiben oder anders zu erklären :oops:
Wüsste sonst nicht mehr wie man es noch schreiben soll?
Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
buster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 66
Erhaltene Danke: 7

WIN 7
Delphi 2010 Prof
BeitragVerfasst: Do 04.11.10 17:09 
öhm... A = W - FillSize ??? wenn W konstant bleibt :idea:
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 17:38 
Ich weiss, schlecht beschrieben aber wie soll ich es sonst Formulieren!!
@Buster: A ist ein selbständiger Wert und soll kleiner werden!

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Do 04.11.10 17:51 
@Alf: Sorry, aber niemand versteht, worum es überhaupt geht?!? Vielleicht kannst du uns folgendermaßen helfen:

Welche Variable ist eine Konstante, welche nicht?
Für was stehen die Variablennamen A, w, ...
Was sind Maximal-/Minimalwerte?

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Do 04.11.10 17:52 
Sowas?

Zitat:
FillSize soll nun zusätzlich den Wert von A annehmen.
A, soll wiederum proportional kleiner gleich 0 werden, wenn FillSize grösser wird bis max W.
Hinweis: A, ist nie grösser als W

ausblenden Delphi-Quelltext
1:
2:
3:
4:
Fillsize := A; 
if A < W then
  A := A * (1 / Fillsize) //wobei 1 ein beliebiger Faktor sein kann, 
        //Fillsize =/=0 und möglichst |Fillsize|>1


LG
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 20:11 
Ok, mal sehen ob ich es jetzt schaffe. :cry:

SolveForX(PercentDone, W) ist eine Funktion aus ProgressBar.

W kann einen Wert von 0 bis entlos annehmen. Setzen wir aber auf 100.
ausblenden Quelltext
1:
2:
3:
W = 100

Fillsize:= SolveForX(PercentDone, W)

Fillsize enthält das Ergebnis von SolveForX(PercentDone, W), also in diesem Fall 0 bis 100.

Jetzt kommt das zusätzliche!

A kann einen Wert von 0 bis entlos annehmen. Setzen wir aber auf 3.
ausblenden Quelltext
1:
A = 3					


FillSize soll nun zusätzlich den Wert von A annehmen. Kein Problem :wink:
ausblenden Quelltext
1:
Fillsize:= SolveForX(PercentDone, W) + A					

jetzt wirds eng.
A soll aber proportional kleiner werden, wenn das Ergebnis von SolveForX(PercentDone, W) grösser wird
also in etwa so:
ausblenden Quelltext
1:
Fillsize:= SolveForX(PercentDone, W) + A - (( SolveForX(PercentDone, W) / A) * w)					

oder so ähnlich. Dabei darf A ja nicht kleiner als 0 werden.

Ich hoffe das es nun Verständlich ist
Wenn nicht, löscht einfach diesen Thread.

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Do 04.11.10 20:21 
Also so?

ausblenden Delphi-Quelltext
1:
Fillsize := SolveForX(PercentDone, W) + (1 / SolveForX(PercentDone, W)) * A					


LG

Für diesen Beitrag haben gedankt: ALF
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 20:30 
Im prinzip ja. Nur halt die Division durch null darf ja nicht vorkommen.
und da gabs auch was mit ner Formel???
Irgend wie so:
ausblenden Quelltext
1:
Fillsize := SolveForX(PercentDone, W) + (1 div (SolveForX(PercentDone, W) + 1) * PaintRect.Left);					

nur fehlt da noch was??

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Do 04.11.10 21:04 
Moin,

wenn du ein proportionales schrumpfen möchtest, bietet sich soetwas einfach an :-P. Im einfachsten Fall kannst du einfach vorher abfragen, ob SolveForX > 0 ist (davon bin ich mal ausgegangen, bei <0 müsste man noch am Vorzeichen drehen. Wenn du einen Grenzwert möchtest, bietet sich ja eine Exponentialfunktion an ;)

edit:
Sorry, hab deinen nachtrag zu spät gelesen. Also die addition dreht imho zu sehr am ergebnis. Auch die Divison mit div und die darauffolgende multiplikation versemmeln dir jegliche genauigkeit. Besser: erst rechnen, dann runden.

LG
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 04.11.10 21:14 
Vielleicht kannst du einfach mal beschreiben, was du erreichen willst, ohne irgendwelche Formeln. Vielleicht eine Skizze, mit den Bereichen und dem Border. Wenn du dir die Fragestellung klar formulierst und skizzierst, kommst du vermutlich selbst auf die Lösung...

Du willst irgendwie die Breite des zu füllenden Rechtecks in einer Progressbar berechnen und dabei einen linken Rand berücksichtigen?

Damm meinst du vielleicht das hier: SolveForX(PercentDone, W) liefert einen Wert zwischen 0 und W. Du möchtest jetzt aber eine Verschobene und linear skalierte Funktion, die einen Wert zwischen A und W liefert. In dem Fall skalierst du das Resultat von SolveForX um den Faktor (W - A)/W und addierst A. Also FillSize = SolveForX(PercentDone, W) * (W - A) / W + A ?

Für diesen Beitrag haben gedankt: ALF
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 21:45 
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Also die addition dreht imho zu sehr am ergebnis.
So wie sie da steht richtig. Wie gesagt dafür gabs auch was, das dies wieder ausgeglichen wird. Nur ewig her wo man sowas mal wusste.
user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Auch die Divison mit div und die darauffolgende multiplikation versemmeln dir jegliche genauigkeit. Besser: erst rechnen, dann runden.

LG
schon korregiert :wink:

user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht kannst du einfach mal beschreiben, was du erreichen willst, ohne irgendwelche Formeln.
Schlicht und einfach. Ich habe vergessen bei der graphischen Darstellung einer selbstgebastellten Gauge den BorderSize zu berücksichtigen. Ergo fängt die zu füllende Fläsche bei 0 an und nicht bei '3' zB, bzw wenn kein Border ist dann natürlich bei 0.
Der Versuch einfach das zeichnen daran anzupassen mh.... wüsste einfach nicht wo??? kurzer Code dazu.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Fillsize := trunc(SolveForX(PercentDone, W);/// + (1 / (SolveForX(PercentDone, W)+ 1) * PaintRect.Left));
//Animage ist die gesamte Fläsche 0-100 zB
//PaintRect ist nur die Fläsche inerhalb des Borders zb 3Pixel kleiner als Animage
//FillSize fängt aber bei 0 an mh....

AnImage.Canvas.FillRect(Rect(PaintRect.Left, PaintRect.Top, FillSize, PaintRect.Bottom));

Dürfte aber nix mehr mit Formel zu tun haben. Aber irgend wie doch noch :gruebel:

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 21:53 
THX @delfiphan

Genau das war es :tongue:
Also doch Formel, nur der Weg dahin schweeeeeeer.
Sorry 'Verschobene und linear skalierte Funktion' hat man ja nicht jeden Tag.
Merken kann ich mir sowas eh nicht, leider. :?
Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 04.11.10 22:45 
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Also doch Formel, nur der Weg dahin schweeeeeeer.
Merken kann ich mir sowas eh nicht, leider. :?

So viel zu merken gibt's da nicht ;)

Du machst einfach eine Skizze und merkst, dass du aus dem Bereich der Grösse W einen Bereich der Grösse W - A machen willst. Daher kannst du mit dem Dreisatz einfach durch W dividieren und mit W - A multiplizieren. Dann noch A addieren, wie du bereits selbst herausgefunden hast. Gibt genau die Formel oben.

Dein Lösungsansatz war gar nicht so falsch. Du hast einfach den Dreisatz verkehrt angewendet. Die Formel "auf deine Art gelöst" müsste so gehen:
SolveForX(PercentDone, W) + A - SolveForX(PercentDone, W) / W * A

Alternativ könnte man auch schreiben:
SolveForX(PercentDone, W) + A - PercentDone / 100 * A

Die 3 Formeln kann man ineinander umrechnen.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 04.11.10 23:08 
Entweder werde ich durch die Chemo langsam matschig in der Birne oder er hat es so erklärt, dass es für den durchschnittlich intelligenten Erdenbürger, wie ich es einer bin, unverständlich bleibt.

Also er hat doch schon den Prozentsatz. Diesen muss er doch nur in Pixel in Abhängigkeit der Breite der Gauge umrechnen. Die Breite natürlich ohne Rand. Den Rand kann man dann ja beim Zeichnen berücksichtigen. Was ich sagen will, mir kommen eure Lösungen unnötig kompliziert vor.

Für diesen Beitrag haben gedankt: ALF
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 04.11.10 23:29 
Naja, ob Percent / 100 * (W - A) + A. oder SolveForX(PercentDone, W) / W * (W - A) + A, ist praktisch das gleiche. Ich ging jetzt mal davon aus, dass er ums Verrecken seine Funktion verwenden will. Das hatte ich bisher noch nicht hinterfragt ;)

Sinnvoll wäre eine "world transformation", die aus dem Parameter direkt die Breite in Pixel berechnet.
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 04.11.10 23:31 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
...dass es für den durchschnittlich intelligenten Erdenbürger, wie ich es einer bin, unverständlich bleibt.
Du erkennst an meiner Fragestellung wie weit ich da noch drunter bin!


EDIT: Zeilen entfernt.

Ok,ich nehme alles zurück und behaupte das gegenteil :wink:
Nach nochmaligen durchschauen der Paint Routine, habt ihr natürlich recht.
Ich kann die ganze Fläsche zeichnen und dann mit
ausblenden Delphi-Quelltext
1:
2:
if FBorderStyle = bsSingle then
    InflateRect(PaintRect, -FBorderSize, -FBorderSize);
das ganze wieder zurück zeichnen erspart man sich die Formel! 8)

Aber durch solch Diskurs, kann man halt nur lernen und weis es beim nächsten mal selbst :D
Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 05.11.10 03:17 
Also ich hätte es so gemacht:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FPercent: Integer;
    FPixels: Integer;
    procedure PaintGauge;
    procedure CalcPixels;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
  MAXWIDTH = 375;
  PENWIDTH = 1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FPercent := 0;
  CalcPixels;
  Form1.Repaint;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if FPercent < 100 then
  begin
    CalcPixels;
    Inc(FPercent);
    Caption := Format('Prozent: %d / Pixel: %d', [FPercent, FPixels]);
  end
  else
    FPercent := 0;
  Form1.Repaint;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  PaintGauge;
end;

procedure TForm1.CalcPixels;
begin
  FPixels := MAXWIDTH * FPercent div 100;
end;

procedure TForm1.PaintGauge;
begin
  // Rahmen
  Canvas.Pen.Style := psSolid;
  Canvas.Pen.Color := clBlack;
  Canvas.Pen.Width := PENWIDTH;
  Canvas.Rectangle(10075100+MAXWIDTH, 90);
  // Hintergrund
  Canvas.Brush.Style := bsSolid;
  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(Rect(100+PENWIDTH,75+PENWIDTH,100+MAXWIDTH-PENWIDTH,90-PENWIDTH));
  // Fortschritt
  Canvas.Brush.Style := bsSolid;
  Canvas.Brush.Color := clRed;
  Canvas.FillRect(Rect(100+PENWIDTH,75+PENWIDTH,100+PENWIDTH+FPixels+PENWIDTH,90-PENWIDTH));
end;

end.

Die Zeichenroutine stimmt nicht ganz. Ändert man die Zeichenstiftdicke, wird das nicht so richtig berücksichtigt. Mit den Zeichenroutinen kenne ich mich nicht so aus.