AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nullstellen grafisch darstellen

Ein Thema von bertaruessel · begonnen am 25. Mär 2005 · letzter Beitrag vom 25. Mär 2005
Antwort Antwort
bertaruessel

Registriert seit: 3. Jan 2005
2 Beiträge
 
#1

Nullstellen grafisch darstellen

  Alt 25. Mär 2005, 17:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Wuaegner
Wuaegner

Registriert seit: 8. Feb 2004
406 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Nullstellen grafisch darstellen

  Alt 25. Mär 2005, 17:05
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?
Wuaegner
Gruß Flo
Unternehmensberatung
  Mit Zitat antworten Zitat
bertaruessel

Registriert seit: 3. Jan 2005
2 Beiträge
 
#3

Re: Nullstellen grafisch darstellen

  Alt 25. Mär 2005, 17:14
Naja, ok.. ich kann ja mal meinen Quelltext darstellen (ich nutze mehrere Formen)...

Delphi-Quellcode:
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.
Ähm, wie schaffe ich es, dass er z.B. die Nullstelle x0 = 4,5566 oder so darstellt?
  Mit Zitat antworten Zitat
25. Mär 2005, 18:02
Dieses Thema wurde von "sakura" von "Open-Source" nach "Sonstige Fragen zu Delphi" verschoben.
Benutzerbild von GLaforge
GLaforge

Registriert seit: 16. Nov 2003
Ort: Halle
106 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Nullstellen grafisch darstellen

  Alt 25. Mär 2005, 18:14
Hi,
lad dir event mal mein Prog runter Delphipraxis. Hab zwar die Nullstellen auch nicht grafisch ausgegeben, aber in dem QT wird die Achse in Bezug zum Image eingeteilt. Du musst also den errechneten Wert im Bezug zur Imageweite setzen.

cu
Cogito ergo sum - Ich denke also bin Ich
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
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