![]() |
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? |
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??? |
Re: Quadratische fkt. Zeichnet nicht
Funktioniert dieser Quellcode richtig?
Delphi-Quellcode:
Wenn ja, dann arbeite doch damit weiter.
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. mfg Looper |
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: |
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.
|
Re: Quadratische fkt. Zeichnet nicht
:shock:
ich bereuhe es informatik leistungskurs genommen zu haben....ich verstehe nur bahnhof :wiejetzt: |
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: ![]() Und jetzt die Idee zum Zeichnen. Als erstes malst du ein Koordinatenkreuz mit den Methoden
Delphi-Quellcode:
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.
//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 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:
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.
EinheitX := Image1.Width / 11;
Also rechnest du
Delphi-Quellcode:
Das "*2" ist wichtig, weil du ja das feste Koordinatenkreuz in der Mitte hast.
EinheitY := Image1.Height / 4 * 2
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! |
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; |
Re: Quadratische fkt. Zeichnet nicht
Zitat:
|
Re: Quadratische fkt. Zeichnet nicht
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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-2025 by Thomas Breitkreuz