![]() |
Nullstellen grafisch darstellen
Hi erstmal!
Also ich soll ein Programm zur Nullstellenberechnung von ganzrationalen Funtionen maximal 5. Grades erstellen. Das Programm berechnet schon Nullstellen von Funktionen 1. Grades, Funktionen 2. Grades (mit der quadratischen Lösungsformel) und Funktionen 3.-5. Grades (mit dem Newton-Verfahren). So, nun hab ich es auch noch hinbekommen, dass sich die Funktion grafisch darstellen lässt (mit einem Image --> Canvas). So, nun wollte ich eigentlich die Nullstellen noch in der Grafik anzeigen lassen, d.h. dort wo die Funktion die x-Achse schneidet z.B. einen roten Strich zeichnen zu lassen mit dem jeweiligen Wert der Nullstelle... Kann mir da vielleicht irgendjemand helfen? Bis neulich! Doreen |
Re: Nullstellen grafisch darstellen
Was ist denn genau das Problem diese Linie einzuzeichnen?
Wenn du es schon geschafft hast es grafisch darzustellen musst du doch nur noch an der Nullstelle ein LineTo machen oder wo klemmts genau in der Umsetzung? |
Re: Nullstellen grafisch darstellen
Naja, ok.. ich kann ja mal meinen Quelltext darstellen (ich nutze mehrere Formen)...
Delphi-Quellcode:
Ähm, wie schaffe ich es, dass er z.B. die Nullstelle x0 = 4,5566 oder so darstellt?
unit Unit4;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Buttons, ComCtrls; type TForm4 = class(TForm) Bild: TImage; Label2: TLabel; edit1: TEdit; edit2: TEdit; Button2: TButton; Max: TScrollBar; Min: TScrollBar; Label3: TLabel; Label1: TLabel; Label4: TLabel; Button1: TButton; Label5: TLabel; Label6: TLabel; Label7: TLabel; BitBtn1: TBitBtn; procedure BitBtn1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure MinChange(Sender: TObject); procedure MaxChange(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; FUNCTION g(x:real):real; var Form4: TForm4; ym,xm,xmax,ymax,xb,yb,k,xb2 :word; x,y,u :real; implementation uses Unit2, Unit3, Unit1; {$R *.dfm} procedure koordinatensystem; var intervall_1,intervall_2,i,pos,neg,n:integer; a,b,c,d: TPoint; begin intervall_2 := strtoint(Form4.edit2.Text); intervall_1 := strtoint(Form4.edit1.text); if intervall_2<5 then k:=60; if (intervall_2>4) AND (intervall_2<10) then k:=40; if (intervall_2>9) AND (intervall_2<15) then k:=20; if intervall_2>14 then k:=15; xm := Form4.Bild.width DIV 2; //Hälfte der x-Achse ym := Form4.Bild.height DIV 2; //Hälfte der y-Achse xmax:= Form4.Bild.width; ymax:= Form4.Bild.height; form4.bild.Canvas.textout(xmax-10,ym-20,'x'); //"x" an der x-Achse form4.bild.canvas.textout(xm-10,1,'y'); //"y" an der y-Achse with Form4.Bild.canvas do begin font.name:='Arial'; font.Size:=8; { c | | | | | a———————————————————————— b | | | | | d } a.x := 1; a.y := ym; b.x := xmax; b.y := ym; c.x := xm; c.y := 1; d.x := xm; d.y := ymax; //Zeichnen durch Verbinden der Punkte moveto(a.x, a.y); lineto(b.x, b.y); moveto(c.x, c.y); lineto(d.x, d.y); xb:=xm-intervall_2*k; //Beginn für die Beschriftung der x-Achse //Achsenbeschriftung der x-Achse FOR i:=intervall_1 TO intervall_2 DO BEGIN moveto(xb,ym); lineto(xb,ym+3); Textout(xb-1,ym+10,IntToStr(i)); xb:=xb+k; END; {of for} yb:=ym+intervall_2*k; //Beginn für die Beschriftung der y-Achse pos:=intervall_2+5; neg:=intervall_1+5; i:= intervall_1; //Achsenbeschriftung der y-Achse if {1}(intervall_2>14) AND (intervall_2<21) then begin //Verrutschen der Achsenbeschriftung FOR n:=neg TO pos DO BEGIN moveto(xm,yb); lineto(xm+3,yb); IF i<> 0 THEN Textout(xm+10,yb-intervall_2+10,IntToStr(i)); yb:=yb-k; i:= i+1; END; {of for} //Verrutschen der Achsenbeschriftung bei Intervall kleiner [-5;5] if {2}intervall_2<5 then begin FOR n:=neg TO pos DO BEGIN moveto(xm,yb); lineto(xm+3,yb); IF i<> 0 THEN Textout(xm+10,yb-intervall_2-20,IntToStr(i)); yb:=yb-k; i:=i+1; END;{of for} end {of if2} end {of if1} else begin //Verrutschen der Achsenbeschriftung FOR n:=neg TO pos DO BEGIN moveto(xm,yb); lineto(xm+3,yb); IF i<> 0 THEN Textout(xm+10,yb-intervall_2,IntToStr(i)); yb:=yb-k; i:=i+1; END; {of for} end;{of else} end;{of with} end; procedure TForm4.BitBtn1Click(Sender: TObject); begin form2.PageControl1.ActivePageIndex:=1; form2.show; end; procedure TForm4.Button2Click(Sender: TObject); begin Form4.Bild.Canvas.Brush.Color:=clWhite; Form4.Bild.Canvas.Rectangle(0,0,form4.Bild.Width,form4.Bild.Height); koordinatensystem; Form4.Hide; end; FUNCTION g(x:real):real; BEGIN g:=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f; END; procedure TForm4.FormCreate(Sender: TObject); //Anzeigen Koordinatensystem begin Form4.Button1.Enabled:=true; Form4.Bild.Canvas.Brush.Color:=clWhite; Form4.Bild.Canvas.Rectangle(0,0,form4.Bild.Width,form4.Bild.Height); koordinatensystem; //Erstellen des Koordinatensystems xm := Form4.Bild.width DIV 2; ym := Form4.Bild.height DIV 2; xmax:= Form4.Bild.width; ymax:= Form4.Bild.height; Form4.Bild.Canvas.font.name:='Arial'; Form4.Bild.Canvas.font.Size:=8; Form4.Bild.Canvas.textout(xmax-10,ym-20,'x'); //"x" an der x-Achse Form4.Bild.Canvas.textout(xm-10,1,'y'); //"y" an der y-Achse end; procedure Achsen; //Löschen der Anzeige var intervall_1,intervall_2:integer; begin if form4.button1.enabled=false then begin Form4.Bild.Canvas.Brush.Color:=clWhite; Form4.Bild.Canvas.Rectangle(0,0,form4.Bild.Width,form4.Bild.Height); koordinatensystem; //Erstellen des Koordinatensystems intervall_2 := strtoint(form4.edit2.Text); intervall_1 := strtoint(form4.edit1.text); x:=intervall_1; REPEAT //Zeichnen der Funktion y:=g(x); xb:=round(xm+x*k); yb:=round(ym-y*k); form4.Bild.Canvas.Pixels[xb,yb]:=clBlue; x:=x+0.001; UNTIL x > intervall_2; end {of if} else begin Form4.Bild.Canvas.Brush.Color:=clWhite; Form4.Bild.Canvas.Rectangle(0,0,form4.Bild.Width,form4.Bild.Height); koordinatensystem; //Anzeigen des Koordinatensystems end; {of else} end; procedure TForm4.MinChange(Sender: TObject); //Intervall var x,x2:integer; begin //Sicherstellen, dass sich beide Regler parallel bewegen x := Min.Position; edit1.text := floattostr(x); x2:= -x; edit2.Text := FloatToStr(x2); Max.position:= x2; Achsen; end; procedure TForm4.MaxChange(Sender: TObject); //Intervall var x:integer; begin //Sicherstellen, dass sich beide Regler parallel bewegen x := Max.Position; edit1.text := floattostr(-x); edit2.Text := FloatToStr(x); Min.position:= -x; end; procedure TForm4.Button1Click(Sender: TObject); //Graph anzeigen var intervall_1,intervall_2:integer; begin button1.enabled:=false; //Button "Graph anzeigen" intervall_1 := strtoint(form4.edit1.text); //z.B. -10 intervall_2 := strtoint(form4.edit2.Text); //z.B. 10 //Graph löschen Bild.Canvas.Brush.Color:=clWhite; Bild.Canvas.Rectangle(0,0,Bild.Width,bild.Height); Koordinatensystem; //Parameter einlesen a:=StrToFloat(Form3.Edit1.Text); b:=StrToFloat(Form3.Edit2.Text); c:=StrToFloat(Form3.Edit3.Text); d:=StrToFloat(Form3.Edit4.Text); e:=StrToFloat(Form3.Edit5.Text); f:=StrToFloat(Form3.Edit6.Text); koordinatensystem; x:=intervall_1; //Graph zeichnen REPEAT y:=g(x); xb:=round(xm+x*k); yb:=round(ym-y*k); Bild.Canvas.Pixels[xb,yb]:=clBlue; x:=x+0.001; UNTIL x > intervall_2; end; end. |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Open-Source" nach "Sonstige Fragen zu Delphi" verschoben.
|
Re: Nullstellen grafisch darstellen
Hi,
lad dir event mal mein Prog runter ![]() cu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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