Autor |
Beitrag |
Red Eye
      
Beiträge: 26
Win XP
D7
|
Verfasst: 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:
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 public 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:
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; 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 public 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; 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 raziel: Topic aus Sonstiges verschoben am Fr 13.05.2005 um 21:22
|
|
Red Eye 
      
Beiträge: 26
Win XP
D7
|
Verfasst: Fr 13.05.05 20:59
Moderiert von raziel: 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 
      
Beiträge: 26
Win XP
D7
|
Verfasst: 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
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Fr 13.05.05 21:06
Es ist ja sehr nett, wenn ihr (//edit: Gemeint waren: Tobias1 und Fabian 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 Red Eye geposteten Link.
_________________ JSXGraph
Zuletzt bearbeitet von raziel am Fr 13.05.05 21:50, insgesamt 2-mal bearbeitet
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 26
Win XP
D7
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Fr 13.05.05 21:53
Ersetz mal die Zeilen 65, 66 durch
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.
Gruss,
Simon
|
|
Red Eye 
      
Beiträge: 26
Win XP
D7
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 26
Win XP
D7
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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[]):
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 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 
      
Beiträge: 26
Win XP
D7
|
Verfasst: Sa 14.05.05 12:03
mist, wo muss ich das einbauen ??? Irgentwie ...
kannste das mal bitte oben einbauen, bzw angeben wleche zeilen ?
|
|
|