Autor Beitrag
Red Eye
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Fr 13.05.05 17:35 
Hi,

Ich habe Probleme ein Delphi Programm über die Julia Menge in das des Apfelmännchens zu ändern. Das Julia-Programm besitzt einen Zoom. Wenn ich jetzt die Rechnung in die des Apfelmännchens ändere, funktioniert der Zoom nicht mehr. Ich zeige euch mal den Quellcode des Programms der Julia-Menge:

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:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
unit UNT_julia_1;

interface

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

type
  TFRM_julia_1 = class(TForm)
    BTN_zeichnen: TBitBtn;
    BTN_close: TBitBtn;
    LBL_xmin: TLabel;
    EDT_xmax: TEdit;
    LBL_xmax: TLabel;
    EDT_ymin: TEdit;
    LBL_ymin: TLabel;
    EDT_xmin: TEdit;
    LBL_ymax: TLabel;
    EDT_ymax: TEdit;
    LBL_kmax: TLabel;
    EDT_kmax: TEdit;
    LBL_creal: TLabel;
    EDT_creal: TEdit;
    LBL_cimag: TLabel;
    EDT_cimag: TEdit;
    LBL_fluchtgrenze: TLabel;
    EDT_rmax: TEdit;
    procedure BTN_closeClick(Sender: TObject);
    procedure BTN_zeichnenClick(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FRM_julia_1: TFRM_julia_1;

implementation

{$R *.dfm}

var x_bild,y_bild,kmax,k,rmax,xo,xu,yl,yr  : integer;
    x,xalt,y,dx,dy,creal,cimag : real;
    xmax,xmin,ymax,ymin  : real;
    md : boolean;

procedure TFRM_julia_1.BTN_closeClick(Sender: TObject);
begin
  close;
end;

procedure iteration(x_bild,y_bild: integer);
begin
  x := xmin + x_bild*dx;
  y := ymax - y_bild*dy;    
  k := 0;
  repeat
    xalt := x;
    x := sqr(x) - sqr(y) + creal;
    y := 2*xalt*y + cimag;
    inc(k);
  until (sqr(x)+sqr(y)>rmax) or (k>kmax);
  if k >= kmax then k:=0;
  FRM_julia_1.canvas.pixels[x_bild+152,y_bild+8] := 16000000div(k+1);
end;

procedure TFRM_julia_1.BTN_zeichnenClick(Sender: TObject);
begin
xmax := strtofloat(EDT_xmax.text);
xmin := strtofloat(EDT_xmin.text);
ymax := strtofloat(EDT_ymax.text);
ymin := strtofloat(EDT_ymin.text);
kmax := strtoint(EDT_kmax.text);
rmax := strtoint(EDT_rmax.Text);
creal := strtofloat(EDT_creal.text);
cimag := strtofloat(EDT_cimag.text);
dx := (xmax-xmin)/600;
dy := (ymax-ymin)/400;
for x_bild := 0 to 600 do
   for y_bild := 0 to 400 do iteration (x_bild,y_bild);
end;

procedure TFRM_julia_1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var a,b : real;
begin
  a := xmin + (x-152)*(xmax-xmin)/600;
  b := ymax - (y-8)*(ymax-ymin)/400;
  EDT_xmin.Text := floattostrf(a,fffixed,10,8);
  EDT_ymax.Text := floattostrf(b,fffixed,10,8);
  xo := x; yl := y; xu := x; yr := y;
  md := true;
end;

procedure TFRM_julia_1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  md := false;
end;

procedure TFRM_julia_1.FormMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var a,b : real;
begin
  if md then
   begin
     a := xmin + (x-152)*(xmax-xmin)/600;
     b := ymax - (y-8)*(ymax-ymin)/400;
     EDT_xmax.Text := floattostrf(a,fffixed,10,8);
     EDT_ymin.Text := floattostrf(b,fffixed,10,8);
     canvas.Pen.Mode := pmnotxor;
     canvas.Rectangle(xo,yl,xu,yr);
     canvas.Rectangle(xo,yl,x,y);
     canvas.Pen.Mode := pmcopy;
     xu := x; yr := y;
   end;
end;

procedure TFRM_julia_1.FormCreate(Sender: TObject);
begin
  md := false;
end;

end.


Jetzt der veränderte Quellcode des Apfelmännchens:

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:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
unit UNT_julia_1; //hab es nur so übernommen. ist das apfelmännchen

interface

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

type
  TFRM_julia_1 = class(TForm)
    BTN_zeichnen: TBitBtn;
    BTN_close: TBitBtn;
    LBL_xmin: TLabel;
    EDT_xmax: TEdit;
    LBL_xmax: TLabel;
    EDT_ymin: TEdit;
    LBL_ymin: TLabel;
    EDT_xmin: TEdit;
    LBL_ymax: TLabel;
    EDT_ymax: TEdit;
    LBL_kmax: TLabel;
    EDT_kmax: TEdit;
    LBL_creal: TLabel;
    EDT_creal: TEdit;
    LBL_cimag: TLabel;
    EDT_cimag: TEdit;
    LBL_fluchtgrenze: TLabel;
    EDT_rmax: TEdit;
    procedure BTN_closeClick(Sender: TObject);
    procedure BTN_zeichnenClick(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FRM_julia_1: TFRM_julia_1;

implementation

{$R *.dfm}

var x_bild,y_bild,kmax,k,rmax,xo,xu,yl,yr  : integer;
    x,xalt,y,dx,dy,creal,cimag : real;
    xmax,xmin,ymax,ymin  : real;
    md : boolean;

procedure TFRM_julia_1.BTN_closeClick(Sender: TObject);
begin
  close;
end;

procedure iteration(x_bild,y_bild: integer);
begin
  x := xmin + x_bild*dx;
  y := ymax - y_bild*dy;
  cimag := (x_bild -300) / 100;  //diesen Teil habe  ich jetzt dazugefügt. Es funktioniert auch beim rechnen. Nur der Zoom funktioniert nicht mehr.
  creal := (y_bild -200) / 100;  //
  k := 0;
  repeat
    xalt := x;
    x := sqr(x) - sqr(y) + creal;
    y := 2*xalt*y + cimag;
    inc(k);
  until (sqr(x)+sqr(y)>rmax) or (k>kmax);
  if k >= kmax then k:=0;
  FRM_julia_1.canvas.pixels[x_bild+152,y_bild+8] := 16000000div(k+1);
end;

procedure TFRM_julia_1.BTN_zeichnenClick(Sender: TObject);
begin
xmax := strtofloat(EDT_xmax.text);
xmin := strtofloat(EDT_xmin.text);
ymax := strtofloat(EDT_ymax.text);
ymin := strtofloat(EDT_ymin.text);
kmax := strtoint(EDT_kmax.text);
rmax := strtoint(EDT_rmax.Text);
creal := strtofloat(EDT_creal.text);
cimag := strtofloat(EDT_cimag.text);
dx := (xmax-xmin)/600;
dy := (ymax-ymin)/400;
for x_bild := 0 to 600 do
   for y_bild := 0 to 400 do iteration (x_bild,y_bild);
end;

procedure TFRM_julia_1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var a,b : real;
begin
  a := xmin + (x-152)*(xmax-xmin)/600;
  b := ymax - (y-8)*(ymax-ymin)/400;
  EDT_xmin.Text := floattostrf(a,fffixed,10,8);
  EDT_ymax.Text := floattostrf(b,fffixed,10,8);
  xo := x; yl := y; xu := x; yr := y;
  md := true;
end;

procedure TFRM_julia_1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  md := false;
end;

procedure TFRM_julia_1.FormMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
var a,b : real;
begin
  if md then
   begin
     a := xmin + (x-152)*(xmax-xmin)/600;
     b := ymax - (y-8)*(ymax-ymin)/400;
     EDT_xmax.Text := floattostrf(a,fffixed,10,8);
     EDT_ymin.Text := floattostrf(b,fffixed,10,8);
     canvas.Pen.Mode := pmnotxor;
     canvas.Rectangle(xo,yl,xu,yr);
     canvas.Rectangle(xo,yl,x,y);
     canvas.Pen.Mode := pmcopy;
     xu := x; yr := y;
   end;
end;

procedure TFRM_julia_1.FormCreate(Sender: TObject);
begin
  md := false;
end;


end.



Ich vermute das ich den "cimag und creal" teil auch noch woanders im Quellcode unterbringen muss. Hoffe es versteht mich einer.

Gruß red eye


Moderiert von user profile iconraziel: Topic aus Sonstiges verschoben am Fr 13.05.2005 um 21:22
Red Eye Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Fr 13.05.05 20:59 
Moderiert von user profile iconraziel: Siehe [url=www.delphi-forum.de/...7#251877]hier[/url].

Also nochmal. Ich will nur das mein Problem gelöst wird, mehr nicht. Wer wissen will, was das Apfelmänmnchen, mandelbrotmenge, Juliamenge, usw. ist soll bitte diesen Link benutzten. Dort steht das ganz gut erklärt...

mitglied.lycos.de/ms...r/html/fracback.html
Red Eye Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Fr 13.05.05 21:05 
Also mal erklären: Im ersten Code hat man eine rechnung, der die juliamenge berechnet und graphisch dartstellt. In diesem Programm befindet sich ein Zoom, mit dem man in das programm zoomen kann um ein ausschnitt zu vergrößern. Im zweiten Code habe ich die rechnung verändert (iteration). Dadurch, dass dieses geändert wurde, kommt als neues bild ein apfelmännchen raus.
Das problem ist, das nun der Zoom nicht mehr funktioniert, obwohl nur die rechung anders ist.

Der Zoom ist immer ab: procedure TFRM_julia_1.FormMouseDown(Sender: TObject; Button: TMouseButton;

Ich weis nich wodran es liegt, dass dieser zoom nicht mehr geht..
raziel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Fr 13.05.05 21:06 
Es ist ja sehr nett, wenn ihr (//edit: Gemeint waren: user profile iconTobias1 und user profile iconFabian W.) versucht zu helfen, aber es bringt absolut keinem was, wenn ihr versucht zu helfen, wo ihr keine Ahnung habt. Also haltet euch bitte ein bisschen zurück.

Und jetzt bitte schleunigst zurück zum Thema!

//Edit: Habe ein paar ziemlich sinnfreie Beiträge entfernt. Alles Wissenswerte steht im von user profile iconRed Eye geposteten Link.

_________________
JSXGraph


Zuletzt bearbeitet von raziel am Fr 13.05.05 21:50, insgesamt 2-mal bearbeitet
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 13.05.05 21:16 
Obwohl ich dir nicht garantieren kann, dass ich das Programm dann wirklich durchforste: Aber wenn du die DFM-Datei noch posten würdest, hättest du vermutlich bessere Chancen. Dann könnte man das Programm zu mindest mal auf dem eigenen Rechner compilieren.
Red Eye Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Fr 13.05.05 21:27 
Ich biete jetzt das Gesamte Projekt zum download an. Es ist jetzt das normale Programm der Juliamenge, wo der Zoom noch funktioniert. Wäre sehr nett wenn ihr es in ein Apfelmännchen ändern könntet. Nur wenn ihr wollt und Zeit habt.

Gruß red eye


Zuletzt bearbeitet von Red Eye am Di 17.05.05 10:33, insgesamt 1-mal bearbeitet
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 13.05.05 21:53 
Ersetz mal die Zeilen 65, 66 durch
ausblenden Delphi-Quelltext
1:
2:
  creal := (x_bild) *dx+xmin;
  cimag := (400-y_bild) *dy+ymin;

Ein paar Kritikpunkte zum Programmierstil:
1. Du solltest Konstanten benützen. Bei dir stehen überall einfach so Zahlen rum. Das ist sehr, sehr schlecht.
2. Verwende ne TPaintbox oder eine TImage. Ausserdem solltest du nicht ausserhalb des OnPaint Ereignissess direkt auf das Canvas der Form zeichnen. Tip: TImage und die ScanLines ausnützen (Pointer auf 1. Pixel, dann Pixelweise durchs gesamte Bild gehn, indem du den Pointer inkrementierst).
3. Bei dir sind Kommazahlen in den Edits vorgegeben. Das "," in der Gleitkommazahl funktionieren nur auf Windows XP Deutsch (Ländereintstellung).
4. Einrückung konsequent durchführen.

:D

Gruss,
Simon
Red Eye Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Sa 14.05.05 00:29 
jo viele danke jetzt läuft alles mit Zoom... und das programm hat mein Lehrer geschrieben (war es wirklich so schlimm??), unsere aufgabe war es da raus ein apfelmänchen zu machen, dies ist mir ja auch gelungen, aber halt ohne Zoom.

Viele Danke noch mals!!!
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 14.05.05 01:54 
Ja, ich finde es eigentlich schon ziemlich schlimm. Vor allem wenn's von einem Lehrer kommt...

Wenn du meine komplette Kritik-Liste einsehen möchtest ;)
5.) globale Funktion und globale Variablen müssten auch nicht sein (mit 0 initialisieren müsste man sie dann auch nicht).
6.) Es wird von 0 bis 600 iteriert, statt 0 bis 599.
7.) Es gibt for-Schleifen, wo die Laufvariablen global sind (-> es kommt sogar eine Compiler-Warnung).
8.) Die Tabstops sind wild durcheinander.
9.) Die Labels sind nicht mit den Edits verknüpft (FocusControl).
10.) Das Window hat den falschen BorderStyle.
11.) Der Zeichnen-Knopf sollte man als Default definieren
12.) OnMouseX: Keine Abfrage, welche Maustaste geklickt wurde (man kann im Prinzip die einte drücken, Maus bewegen, dann noch die andere drücken, dann gibt's ein Durcheinander auf dem Bildschirm)

Überhaupt läuft das ganze ja so langsam, dass man dem Bildaufbau noch zuschauen kann... ;) Sorry, wenn's frech erscheint ;) Also naja, wenn's klappt und reicht ist ja alles im Butter :)
Red Eye Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Sa 14.05.05 09:21 
Ich verusche mal alles zu verbessern... wenn da nich die neuen Probleme wären ^^
wie z.b. verbinde ich die labels mit den edit feldern, davon habe ich noch nichts gehört...

und wenn du eine idee hast wie man es schneller hinbekommt, immer her damit. Meine idee war bisher, das bild erst im hintergrundlaufen zulassen und im vordergrund währendessen eine ProgressBar zum anzeigen, wie weit svhon gezeichnte wurde. ich habe aber keine möglichkeit gefunden dies einzubauen. also hast du noch mal lust, mir einen tip zu geben wie ichs schneller kriege...muss nicht mit der progressbar sein..

MFG ReD EyE
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 14.05.05 11:41 
Okay. Verwende statt eine TPaintbox eine TImage. Wieso? Sobald dein Programm von einem anderen Programm überdeckt wird oder du es minimierst, ist das Bild weg. Mein Tip deswegen: Benütze eine TImage.

So zeichnet man einigermassen schnell auf eine TImage (einiges schneller als per Pixels[]):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
 Pixel: ^DWord;
 X, Y, H, W: Integer;
begin
 with Image1.Picture.Bitmap do
 begin
  W := Image1.Width;
  H := Image1.Height;
  Width := W;
  Height := H;
  PixelFormat := pf32bit;
  Pixel := ScanLine[Height-1];
 end;
 for Y := 0 to H-1 do // bzw. for y := H-1 downto 0 do
  for X := 0 to W-1 do
  begin
   Pixel^ := Berechnung(X,Y);
   inc(Pixel);
  end;
 Image1.Invalidate;
end;

Dabei ist zu beachten, dass das Bild vekehrt, d.h. von unten nach oben gezeichnet wird. Das ist bei dir gerade gut, da die mathematische y-Achse ja nach oben zeigt, die Bildschirmkoordinaten aber üblicherweise nach unten.

Tabstops: Jedes Edit hat einen Tabstop. Die sollten korrekt nummeriert sein. Normalerweise kann man mit der Tab-Taste von einem Feld zum anderen springen. Drück mal in deinem Programm mehrere male die Tab Taste, dann weist du, was ich meine. Die Nummerierung geschieht mittels TabOrder => die solltest du bei den Edits von oben nach unten durchnummerieren.

FocusControl: Die Labels gehören ganz klar zu den Edits. Im Objekt-Inspector kannst du bei den Labels unter FocusControl das zugehörige Edit definieren (geht nicht in allen Delphi-Versionen).

BorderStyle: Bei der Form sollte der BorderStyle z.B. bsDialog sein.

z.T. sind es Details, aber bei einigermassen "professionel" programmierten Programmen sollte auf solche Sachen geachtet werden.
Red Eye Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Win XP
D7
BeitragVerfasst: Sa 14.05.05 12:03 
mist, wo muss ich das einbauen ??? Irgentwie ... :autsch:

kannste das mal bitte oben einbauen, bzw angeben wleche zeilen ?