Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Quadratische fkt. Zeichnet nicht (https://www.delphipraxis.net/110088-quadratische-fkt-zeichnet-nicht.html)

mortality 12. Mär 2008 18:50


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:
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.
danke im vorraus!!

DeddyH 12. Mär 2008 18:55

Re: Quadratische fkt. Zeichnet nicht
 
Zitat:

Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin
  ClearBox();
end;

Wenn Du auf die Box zeichnest, wird sie immer wieder übermalt. Das kann ja nix werden ;)

Jelly 12. Mär 2008 18:57

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.

mortality 12. Mär 2008 19:19

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:

DeddyH 12. Mär 2008 19:20

Re: Quadratische fkt. Zeichnet nicht
 
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin
//  ClearBox();
end;
Versuch mal so :mrgreen:

mortality 12. Mär 2008 19:22

Re: Quadratische fkt. Zeichnet nicht
 
das ist ja das problem...wenn ichs weglasse funzt es auch nicht :cry:

DeddyH 12. Mär 2008 19:24

Re: Quadratische fkt. Zeichnet nicht
 
Häng das Projekt mal an.

mortality 12. Mär 2008 19:27

Re: Quadratische fkt. Zeichnet nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier

DeddyH 12. Mär 2008 19:36

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.

mortality 12. Mär 2008 19:44

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 03:58 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz