Delphi-PRAXiS
Seite 1 von 2  1 2      

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 19: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 19: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 19: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 20: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 20: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 20:22

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

DeddyH 12. Mär 2008 20:24

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

mortality 12. Mär 2008 20:27

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

DeddyH 12. Mär 2008 20: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 20: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?

DeddyH 12. Mär 2008 20:58

Re: Quadratische fkt. Zeichnet nicht
 
Du meinst "Markierungsstriche"? Einfach in ClearBox ausrechnen und in 2 Schleifen zeichnen.

bluesbear 12. Mär 2008 21:13

Re: Quadratische fkt. Zeichnet nicht
 
Zitat:

Zitat von DeddyH
Du meinst "Markierungsstriche"? Einfach in ClearBox ausrechnen und in 2 Schleifen zeichnen.

Hat der mortality etwa kein TeeChart? :roll:

mortality 12. Mär 2008 21:15

Re: Quadratische fkt. Zeichnet nicht
 
für euch ist es einfach aber ich sitze schon seit stunden und bin immer noch nicht fertig...hab schon so ein kopf...
ich denk mal ich bin zu dumm für so etwas.....natürlich soll ich net immer fertige algos erfragen sondern selber denken.....aber langsam geht nichts mehr bei mir rein :roll: :?:

teechart.....kommt mir zwar jetzt bekannt vor aber...i dont know what u mean^^

bluesbear 12. Mär 2008 21:25

Re: Quadratische fkt. Zeichnet nicht
 
Also wenn Du das nicht in Deiner Komponentenpallette hast, war mein Kommentar nicht besonders hilfreich. Falls doch, klick Dir das auf Dein Formular, und drücke F1.

mortality 12. Mär 2008 21:32

Re: Quadratische fkt. Zeichnet nicht
 
sieht nicht so aus.....finde nichts dazu unter index(suche)
gibts nur TChart...keine ahnung was das macht...irgendeine große komponente

bluesbear 12. Mär 2008 21:45

Re: Quadratische fkt. Zeichnet nicht
 
Mein Fehler. Ich meine TChart.
Das ist schade. Das nimmt einem eine Menge Arbeit ab. Achsen zeichnen und Werte in Pixel umrechnen usw.
Wenn Dir das nicht gefällt, dann muss ich DeddyH dann doch Recht geben. Du brauchst also ein Dingens (ich schreib da immer eine Funktion mit TPoint Parameter), was Funktionswerte in Bildschirmkoordinaten umwandelt. Das rufst Du dann auf innerhalb einer Schleife, und machst einen Strich.

Jelly 12. Mär 2008 21:49

Re: Quadratische fkt. Zeichnet nicht
 
Zitat:

Zitat von mortality
TChart

Dann sprich das mal auf Englisch aus, und vergleiche mal mit Teechart :mrgreen:

Das ist im Grunde nichts anderes als eine Grafikkomponente mit allen möglichen Diagrammarten (Balken, Linien...), so wie du es vermutlich auch aus Excel kennst.

Damit liesse sich natürlich auch deine Parabel zeichnen. Der Vorteil, du musst dich nicht um irgendwelche Skalierungen kümmern, sondern setzt nur beliebig deine (x,y) Punkte, und zwar in dem mathematischen Koordinatensystem deiner Wahl.

mortality 12. Mär 2008 21:54

Re: Quadratische fkt. Zeichnet nicht
 
jo tchart hab ich ....aber sagt mir bitte wie ichs umsetzen soll.....ich möchte so gerne das heute fertig kriegen danke :stupid:

Jelly 12. Mär 2008 21:55

Re: Quadratische fkt. Zeichnet nicht
 
Steht doch schon oben: F1

Zieh dir mal die Kompo auf dein Form und mach ein Doppelklick drauf, und du kannst loslegen.

mortality 12. Mär 2008 22:15

Re: Quadratische fkt. Zeichnet nicht
 
ja aber das sind soviele optionen drin ich weiss doch garnet was ich da auswählen soll????
bei hilfe kommt fehlermeldung :evil:

DeddyH 12. Mär 2008 22:16

Re: Quadratische fkt. Zeichnet nicht
 
Es wäre ja schon einmal hilfreich zu wissen, mit welcher Delphi-Version Du arbeitest.

mortality 12. Mär 2008 22:20

Re: Quadratische fkt. Zeichnet nicht
 
borland delphi 2005

DeddyH 12. Mär 2008 22:25

Re: Quadratische fkt. Zeichnet nicht
 
Auha, das ist so ziemlich das gruseligste Delphi, das jemals herausgekommen ist. Funktioniert F1 denn bei anderen Komponenten wie z.B. TButton?

bluesbear 12. Mär 2008 22:29

Re: Quadratische fkt. Zeichnet nicht
 
Ich werde wieder paranoid.

DeddyH 12. Mär 2008 22:31

Re: Quadratische fkt. Zeichnet nicht
 
:cyclops: Ich bin ein Star, holt mich hier raus :mrgreen:

mortality 12. Mär 2008 22:31

Re: Quadratische fkt. Zeichnet nicht
 
ihr glaubt nicht wies mir geht :pale:

hat jemand eine idee wie ich das machen könnte?
es müssen halt am besten die einheiten da stehen, falls möglich... aber wie bring ich das auszählen in die prozedur???

wenn mir keiner helfen kann dann könnt ihr den thread schließen..

mortality 13. Mär 2008 18:02

Re: Quadratische fkt. Zeichnet nicht
 
kann mir den wirklich keiner helfen? :wall: :wall: :wall: :wall: :wall: :wall:

bluesbear 13. Mär 2008 19:20

Re: Quadratische fkt. Zeichnet nicht
 
Nee, ich werde genau das tun, was ich immer tu, wenn ich paranoid werde: Ins Bett gehen und mir die Decke über den Kopf ziehen. Das hilft sofort.
A propos "hilft" - Ich würde mich nie trauen, Delphi ohne eine funktionierende Hilfefunktion zu benutzen. Den ganzen Kram kann sich doch keine Sau merken.

Looper 13. Mär 2008 19:31

Re: Quadratische fkt. Zeichnet nicht
 
also mit TChart habe ich noch nie gearbeitet, aber ich habe schon Plotter (bis 5. Grad) geschrieben.
Willst du das jetzt mit TChart machen (dann kann ich nicht helfen) oder mit Canvas (dann ja)

mfg Looper

mortality 13. Mär 2008 20:59

Re: Quadratische fkt. Zeichnet nicht
 
egal hauptsache ich kriegs hin es muss hauptsache funktionieren^^

Jelly 13. Mär 2008 21:05

Re: Quadratische fkt. Zeichnet nicht
 
Hast du denn überhaupt schon etwas von dem probiert, was dir hier gesagt wurde. Sich einfach nur "dumm" stellen und denken, dass dir hier einer eine Lösung auf dem Silbertablett präsentiert, das wird wohl kaum der Fall sein.

Wo genau hakt es denn bei TChart?

mortality 13. Mär 2008 21:14

Re: Quadratische fkt. Zeichnet nicht
 
genau das problem ist es ja ich kann mirs überhaupt nicht vorstellen!

also wenn ich dan den graph über den tchart ausgebe sieht es dann genau so aus wie bei der tpaintbox odet timage.(ohne jegliche einteilung)
wenn ich im design menü doppelklick auf tchart mache ..dankt ein menü über versch einstellungen un diagramme....aber was soll ich dort drin jetzt einstellen???

Looper 13. Mär 2008 21:15

Re: Quadratische fkt. Zeichnet nicht
 
Funktioniert dieser Quellcode richtig?
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.
Wenn ja, dann arbeite doch damit weiter.

mfg Looper

mortality 13. Mär 2008 21:20

Re: Quadratische fkt. Zeichnet nicht
 
arbeite weiter...bloß an was?
wir haben im informatik unterricht noch nie mit canvas programmiert....ich hab mir mit mühe hier das zeug herausgehollt.
hab aber wirklich kp wie ich weiter machen soll.... :wall:

DeddyH 13. Mär 2008 21:23

Re: Quadratische fkt. Zeichnet nicht
 
Naja, mir fällt da noch eine "Schummellösung" ein: eine Vektorgrafik (wmf, als Klassen TMetaFile und TMetaFileCanvas) im Speicher erzeugen, dort alles maßstabgetreu drauf zeichnen und diese dann per StretchBlt auf die PaintBox klatschen, erspart eine Menge Arbeit beim Skalieren.

mortality 13. Mär 2008 21:30

Re: Quadratische fkt. Zeichnet nicht
 
:shock:
ich bereuhe es informatik leistungskurs genommen zu haben....ich verstehe nur bahnhof :wiejetzt:

Looper 13. Mär 2008 21:41

Re: Quadratische fkt. Zeichnet nicht
 
Also ich gebe jetzt einfach mal ein Beispiel, wie ich das machen würde (vielleicht nicht die beste Methode, aber sie funktioniert und ist einfach zu verstehen - hoffe ich jedenfalls):

Du nimmst dir ein Image und gibst ihm eine gewisse Breite (Width, z.B. 800) und Höhe (Height, z.B. 600). Nun hat die Imagekomponente sein eigenes Canvas (=Leinwand). Auf diesem Canvas kannst du jedes einzelne Pixel ansprechen und färben oder auch Linien, Kreise, Rechtecke, etc. zeichnen. Als Angabe gibtst du immer die Pixel an und zwar ist die Position 0|0 oben links in der Ecke und 800|600 unten rechts.
Hoffe das hast du soweit verstanden, wenn du Fragen zu Befehlen des Canvas hast, siehe hier:
http://www.delphi-treff.de/tipps/grafik/tipp/263/

Und jetzt die Idee zum Zeichnen. Als erstes malst du ein Koordinatenkreuz mit den Methoden
Delphi-Quellcode:
//Koordinatenkreuz zeichnen
Image1.Canvas.MoveTo(Image1.Width div 2,0); //Cursor bewegt sich oben mitte
Image1.Canvas.LineTo(Image1.Width div 2,Image1.Height); //Cursor zeichnet unten mitte
Image1.Canvas.MoveTo(0, Image1.Height div 2); //Cursor bewegt sich nach links mitte
Image1.Canvas.LineTo(Image1.Width, Image1.Height div 2); //Cursor zeichnet rechts mitte
Nun legst du zwei Variablen an: EinheitX und EinheitY, beide vom Typ Single. Diese Einheiten brauchst du um eine Skalierung hinzubekommen und den Graph richtig zu zeichnen.
EinheitX ist leicht auszurechnen: Teile einfach die Breite des Images durch die Anzahl deiner X.
Wenn du z.B. den Graphen von -5 bis 5 X zeichnen willst, dann hats du 11x (Die 0 zählt mit) also ist
Delphi-Quellcode:
EinheitX := Image1.Width / 11;
Bei EinheitY brauchst du den maximalen Funktionswert für deine X-Spanne, also wenn du die Funktion X^2 zeichnest (von X = -2 .. 2) dann ist der maximale Funktionswert = 4, da 2^2 bzw. -2^2 = 4 ist.
Also rechnest du
Delphi-Quellcode:
EinheitY := Image1.Height / 4 * 2
Das "*2" ist wichtig, weil du ja das feste Koordinatenkreuz in der Mitte hast.
Wie du den maximalen Funktionswert herausbekommt kannst du ja mal überlegen. Tipp: Schleife

Nun musst du hinterher nur noch zeichnen und die Skalierungen vornehmen, aber versuche erstmal das oben genannte zu verstehen. Bei Fragen immer her damit. Ich werde mein Bestes versuchen :wink:

mfg Looper

[Edit] Gib nicht auf, wenn du den Grundgedanken raus hast, is es gnaz leicht!

DeddyH 13. Mär 2008 21:47

Re: Quadratische fkt. Zeichnet nicht
 
OK, schau Dir mal dieses Beispiel an (hat jetzt nix mit der Vektorgrafik zu tun):
Delphi-Quellcode:
procedure TForm1.ClearBox(); //Prozedur, die ein simples Koordinatensystemzeichnet
const Abst = 10;  //10 Pixel Abstand zwischen den Markierungen
var x,y,i: integer;
begin
  with FunctionBox do
  begin
    Canvas.Pen.Color:= clGray;
    Canvas.Brush.Color:= clWhite;
    Canvas.Rectangle(0,0,Width,Height); //zeichnet Rahmen
    y := round(Height/2);
    //Markierungen von der Mitte nach unten
    while y < Height do
      begin
        Canvas.MoveTo(round(Width/2) - 5, y);
        Canvas.LineTo(round(Width/2) + 5, y);
        inc(y,Abst);
      end;
    y := round(Height/2);
    //Markierungen von der Mitte nach oben
    while y > 0 do
      begin
        Canvas.MoveTo(round(Width/2) - 5, y);
        Canvas.LineTo(round(Width/2) + 5, y);
        dec(y,Abst);
      end;
    x := round(Width/2);
    //Markierungen von der Mitte nach rechts
    while x < Width do
      begin
        Canvas.MoveTo(x,round(Height/2) + 5);
        Canvas.LineTo(x,round(Height/2) - 5);
        inc(x,Abst);
      end;
    x := round(Width/2);
    //Markierungen von der Mitte nach links
    while x > 0 do
      begin
        Canvas.MoveTo(x,round(Height/2) + 5);
        Canvas.LineTo(x,round(Height/2) - 5);
        dec(x,Abst);
      end;
    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;

bluesbear 13. Mär 2008 21:58

Re: Quadratische fkt. Zeichnet nicht
 
Zitat:

Zitat von mortality
ich bereuhe es informatik leistungskurs genommen zu haben....ich verstehe nur bahnhof :

Bei Dir krieg ich jetzt langsam das entgegengesetzte Gefühl vom Paranoia (gibt es eigentlich ein Wort dazu?) Du bist IMHO zu schlau. Das ist wirklich so einfach! Mach Experimente! Solange rumklicken, bis das Programm tut, was du willst. Ich kann mich natürlich auch irren, aber Dein Verhalten erinnert mich grad an mich in Bezug auf Computer, als ich zum ersten mal damit in Kontakt kam.

DeddyH 13. Mär 2008 22:00

Re: Quadratische fkt. Zeichnet nicht
 
Zitat:

Zitat von bluesbear
Bei Dir krieg ich jetzt langsam das entgegengesetzte Gefühl vom Paranoia (gibt es eigentlich ein Wort dazu?)

Verfolgerwahn? :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz