![]() |
Quadratische fkt. Zeichnet nicht
hallo leute,
ich hab kein plan wieso die zeichnung bei mir net funzt. hab schon mit vielen algos probiert aber dieser sollte funktionieren...aber..
Delphi-Quellcode:
danke im vorraus!!
1 unit function_main;
2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 7 Grids, StdCtrls, ExtCtrls, ToolWin, ComCtrls; 8 9 type 10 TForm1 = class(TForm) 11 FunctionBox: TPaintBox; 12 btSolve: TButton; 13 ed_a: TEdit; 14 ed_b: TEdit; 15 ed_c: TEdit; 16 Label1: TLabel; // --- 17 Label2: TLabel; // Labels werden nicht unbedingt benötigt 18 Label3: TLabel; // --- 19 edbereich: TEdit; 20 edscalex: TEdit; 21 btReset: TButton; 22 edscaley: TEdit; 23 procedure btSolveClick(Sender: TObject); 24 procedure FormPaint(Sender: TObject); 25 procedure ClearBox(); 26 procedure btResetClick(Sender: TObject); 27 private 28 { Private-Deklarationen } 29 public 30 { Public-Deklarationen } 31 end; 32 33 var 34 Form1: TForm1; 35 36 implementation 37 38 {$R *.DFM} 39 40 procedure TForm1.btSolveClick(Sender: TObject); 41 var i,a,b,c,bereich,goright,goup: Integer; 42 y1,y2,scalex,scaley: Real; 43 begin 44 bereich:= Round(StrToInt(edbereich.Text)/2); //Breite eines Parabelastes 45 scalex:= StrToFloat(edscalex.Text); //Zoomfaktor für x-Achse(z.B. wenn man Breite halbieren will ScaleX:= 0,5) 46 scaley:= StrToFloat(edscaley.Text); //Zoomfaktor für y-Achse 47 48 goright:= Round(FunctionBox.Width/2); //GoRight schiebt Fkt nachrechts um sie in die Mitte zu bringen 49 goup:= Round(FunctionBox.Height/2); //GoUp schiebt Fkt nach oben umsie in die Mitte zu bringen 50 51 For i:= -(bereich) to (bereich-1) do 52 begin 53 a:= StrToInt(ed_a.Text); 54 b:= StrToInt(ed_b.Text); 55 c:= StrToInt(ed_c.Text); 56 y1:= (a*(i*i)+b*i+c); //Funktion für x alsAusgangspunkt für die Linie 57 y2:= (a*((i+1)*(i+1))+b*(i+1)+c); //Funktion für dennachfolgenden Wert von x für Endpunkt der Linie 58 59 with FunctionBox do 60 begin 61 Canvas.Pen.Color:= clBlack; 62 Canvas.MoveTo(Round((i)*scalex + goright), Height-Round(y1*scaley) -goup); 63 //MoveTo läst denCanvaszeiger zum Ausgangspunkt gehen 64 //*ScaleY skalliert die Parbel(kann man als einfachen Zoom verstehen) 65 //z.B.: Verdoppeln entspricht2; Halbieren entspricht 0,5 66 Canvas.LineTo(Round((i+1)*scalex + goright), Height-Round(y2*scaley) -goup); 67 //LineTo ziechnet eine Linievon Ausgangspunkt zu Endpunkt 68 //also von (x1,y1) zu (x2,y2)wobei x1=i, x2=(i+1), y1,y2 wurden vorher berechnet 69 //So wird die ganze Funktion im Bereich durchgerechnet und von jedem Punktzum nächsten eine Linie gezeichnet 70 end; 71 end; 72 end; 73 74 procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet 75 begin 76 with FunctionBox do 77 begin 78 Canvas.Pen.Color:= clGray; 79 Canvas.Brush.Color:= clWhite; 80 Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen 81 Canvas.MoveTo(0,round(Height/2)); 82 Canvas.LineTo(Width,round(Height/2)); //zeichnet x-Achse 83 Canvas.MoveTo(round(Width/2),0); 84 Canvas.LineTo(round(Width/2),Width); //zeichnet y-Achse 85 end; 86 end; 87 88 procedure TForm1.FormPaint(Sender: TObject); 89 begin 90 ClearBox(); 91 end; 92 93 procedure TForm1.btResetClick(Sender: TObject); 94 begin 95 ClearBox(); 96 end; 97 98 end. |
Re: Quadratische fkt. Zeichnet nicht
Zitat:
|
Re: Quadratische fkt. Zeichnet nicht
Schau dir mal dein OnPaint Event an... Da sollte sofort klar werden, dass das nix wird!
Da rufst du nur ein ClearBox auf. |
Re: Quadratische fkt. Zeichnet nicht
hätte ihr eine lösung für mich wie ich das am besten realisieren soll...ich bin echt verzweifelt sitze schon lange an deisem algo :shock:
|
Re: Quadratische fkt. Zeichnet nicht
Delphi-Quellcode:
Versuch mal so :mrgreen:
procedure TForm1.FormPaint(Sender: TObject);
begin // ClearBox(); end; |
Re: Quadratische fkt. Zeichnet nicht
das ist ja das problem...wenn ichs weglasse funzt es auch nicht :cry:
|
Re: Quadratische fkt. Zeichnet nicht
Häng das Projekt mal an.
|
Re: Quadratische fkt. Zeichnet nicht
Liste der Anhänge anzeigen (Anzahl: 1)
hier
|
Re: Quadratische fkt. Zeichnet nicht
Ich habe mal eine private Variable eingefügt.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) ed_a: TEdit; ed_b: TEdit; ed_c: TEdit; edbereich: TEdit; edscalex: TEdit; edscaley: TEdit; btsolve: TButton; btreset: TButton; functionbox: TPaintBox; procedure btSolveClick(Sender: TObject); procedure ClearBox(); procedure btResetClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure functionboxPaint(Sender: TObject); private { Private-Deklarationen } FHasFunction: Boolean; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.btSolveClick(Sender: TObject); var i,a,b,c,bereich,goright,goup: Integer; y1,y2,scalex,scaley: Real; begin bereich:= Round(StrToInt(edbereich.Text)/2); //Breite eines Parabelastes scalex:= StrToFloat(edscalex.Text); //Zoomfaktor für x-Achse(z.B. wenn man Breite halbieren will ScaleX:= 0,5) scaley:= StrToFloat(edscaley.Text); //Zoomfaktor für y-Achse goright:= Round(FunctionBox.Width/2); //GoRight schiebt Fkt nachrechts um sie in die Mitte zu bringen goup:= Round(FunctionBox.Height/2); //GoUp schiebt Fkt nach oben umsie in die Mitte zu bringen ClearBox; FHasFunction := true; For i:= -(bereich) to (bereich-1) do begin a:= StrToInt(ed_a.Text); b:= StrToInt(ed_b.Text); c:= StrToInt(ed_c.Text); y1:= (a*(i*i)+b*i+c); //Funktion für x alsAusgangspunkt für die Linie y2:= (a*((i+1)*(i+1))+b*(i+1)+c); //Funktion für dennachfolgenden Wert von x für Endpunkt der Linie with FunctionBox do begin Canvas.Pen.Color:= clBlack; Canvas.MoveTo(Round((i)*scalex + goright), Height-Round(y1*scaley) -goup); //MoveTo läst denCanvaszeiger zum Ausgangspunkt gehen //*ScaleY skalliert die Parbel(kann man als einfachen Zoom verstehen) //z.B.: Verdoppeln entspricht2; Halbieren entspricht 0,5 Canvas.LineTo(Round((i+1)*scalex + goright), Height-Round(y2*scaley) -goup); //LineTo ziechnet eine Linievon Ausgangspunkt zu Endpunkt //also von (x1,y1) zu (x2,y2)wobei x1=i, x2=(i+1), y1,y2 wurden vorher berechnet //So wird die ganze Funktion im Bereich durchgerechnet und von jedem Punktzum nächsten eine Linie gezeichnet end; end; end; procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet begin with FunctionBox do begin Canvas.Pen.Color:= clGray; Canvas.Brush.Color:= clWhite; Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen Canvas.MoveTo(0,round(Height/2)); Canvas.LineTo(Width,round(Height/2)); //zeichnet x-Achse Canvas.MoveTo(round(Width/2),0); Canvas.LineTo(round(Width/2),Width); //zeichnet y-Achse end; end; procedure TForm1.FormCreate(Sender: TObject); begin FHasFunction := false; end; procedure TForm1.functionboxPaint(Sender: TObject); begin if FHasFunction then btSolveClick(self) else ClearBox; end; procedure TForm1.btResetClick(Sender: TObject); begin FHasFunction := false; invalidate; end; end. |
Re: Quadratische fkt. Zeichnet nicht
danke!!!
nur eine frage hätte ich noch vielleicht....wie schaft man die eintelung in längeneinheiten auf den achsen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz