Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

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)

Jelly 13. Mär 2008 20: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 20: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 20: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 20: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 20: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 20: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 20: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 20: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 20: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 21: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 22:19 Uhr.
Seite 4 von 5   « Erste     234 5      

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