Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktionen mit Paintbox zeichnen (https://www.delphipraxis.net/130338-funktionen-mit-paintbox-zeichnen.html)

Konstantin H. 6. Mär 2009 17:37


Funktionen mit Paintbox zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

ich habe eine Aufgabe bekommen, ein Programm soll in einem Paintbox(400x400) ein nicht statisches Koordinatensystem und liniare Funktionen mit Angabe von "m" und "n" zeichnen. Ich habe ein bewegliches KS hingekriegt.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var      x1,x2,y1,y2,gx,gy,zx,zy,t:integer;

begin
          //t:=0;

          x1:=strtoint(edit1.text);
          x2:=strtoint(edit2.text);
          y1:=strtoint(edit3.text);
          y2:=strtoint(edit4.text);

          gx:=round(400/(x1-x2));
          gy:=round(400/(y1-y2));

          zx:=gx*x1;
          zy:=gy*y1;


          paintbox1.canvas.pen.color:=clblack;
          paintbox1.canvas.Pen.Width:=2;
          paintbox1.canvas.moveto(0,zy);
          paintbox1.canvas.lineto(400,zy);


          paintbox1.canvas.pen.color:=clblack;
          paintbox1.canvas.Pen.Width:=2;
          paintbox1.canvas.moveto(zx,0);
          paintbox1.canvas.lineto(zx,400);

          {repeat
          t:=t+1;
          paintbox1.canvas.pen.color:=clblack;
          paintbox1.canvas.Pen.Width:=2;
          paintbox1.canvas.moveto(zx,gx*t);
          paintbox1.canvas.lineto(zx-10,gx*t);
          until (gx*t)<=400;}
end;
Zuerst bitte ich euch mir zu helfen die Striche, die x und y Werte anzeigen, hinzukriegen.
So soll das Programm aussehen.

Konstantin H. 6. Mär 2009 17:56

Re: Funktionen mit Paintbox zeichnen
 
x1=X minimum(negativ)
x2=X maximum
y1=Y minimum(negativ)
y2=Y maximum

nuclearping 7. Mär 2009 08:53

Re: Funktionen mit Paintbox zeichnen
 
Und wo ist genau das Problem? Wie du in eine PaintBox zeichnest, weißt du ja bereits. Und wie du die Koordinaten berechnest, hast du in Mathe gelernt?

Satty67 7. Mär 2009 12:21

Re: Funktionen mit Paintbox zeichnen
 
Wenn ich das richtig verstanden hab' ist der Ablauf unklar?

Würde zuerst das Koordinatensystem anhand der Grenzwerte zeichnen, das kannst Du ja schon. Die Daten Min/Max hast Du ja auch schon in den TEdits erfasst.

Dann bei geraden Graphen einfach den kleinsten und größten Punkt (x/y) anhand der f(x) berechnen und mit moveto/lineto einzeichnen. Bei Kurven über eine Schleife mehrere Punkte (zw. min/max) berechnen und anzeigen.

Hoffe hab' die Aufgabenstellung jetzt nicht falsch verstanden ;)

Konstantin H. 7. Mär 2009 17:17

Re: Funktionen mit Paintbox zeichnen
 
was ich noch erstmal brauche, sind die striche auf der X und Y achse. Das Wert gx zeigt zeigt einen Abstand zwischen einzelnen werten.

nuclearping 7. Mär 2009 17:34

Re: Funktionen mit Paintbox zeichnen
 
Striche zeichnest du mit .MoveTo und .LineTo, so wie du's bereits in deinem Code, den du da gepostet hast, gemacht hast? :gruebel:

_frank_ 7. Mär 2009 22:36

Re: Funktionen mit Paintbox zeichnen
 
mit dem striche- zeichnen würde ich das so in etwa machen (lässt sich sicher noch optimieren):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const xoffset=300;
      yoffset=200;
      linespacing=10;
var i,xp,xn,yp,yn:integer;
begin
  paintbox1.Canvas.Rectangle(0,0,paintbox1.width-1,paintbox1.height);
  paintbox1.Canvas.MoveTo(xoffset,0);
  paintbox1.canvas.LineTo(xoffset,paintbox1.height);
  paintbox1.Canvas.MoveTo(0,yoffset);
  paintbox1.canvas.LineTo(paintbox1.width,yoffset);
  i:=1;
  repeat
    xp:=xoffset+i*LineSpacing;
    xn:=xoffset-i*LineSpacing;
    yp:=yoffset-i*LineSpacing;
    yn:=yoffset+i*LineSpacing;
    paintbox1.Canvas.MoveTo(xoffset-5,yp);
    paintbox1.Canvas.LineTo(xoffset+5,yp);
    paintbox1.Canvas.MoveTo(xoffset-5,yn);
    paintbox1.Canvas.LineTo(xoffset+5,yn);
    paintbox1.Canvas.MoveTo(xp,yoffset-5);
    paintbox1.Canvas.LineTo(xp,yoffset+5);
    paintbox1.Canvas.MoveTo(xn,yoffset-5);
    paintbox1.Canvas.LineTo(xn,yoffset+5);
    inc(i);
  until not ((yp>0) or (yn<Paintbox1.height) or (xn>0) or (xp<Paintbox1.width));
end;
ich hoffe, ich hab dich richtig verstanden...

Gruß Frank

Konstantin H. 10. Mär 2009 18:19

Re: Funktionen mit Paintbox zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

danke für alle eure Tipps! Ich hab am Wochenende und Montag daran gearbeitet, das Program vertig zu kriegen. Und ich habs geschafft!

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    PaintBox1: TPaintBox;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    a,b,c,d,e,f,g,h,k,j,xa,xe,ya,ye,i :Integer;{ Public-Deklarationen }
  end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button2Click(Sender: TObject);
    Var i,s,t:integer;
begin
a:=strtoint(edit3.text);  //kleinster x-Wert
b:=strtoint(edit4.text);  //größter x-Wert
c:=strtoint(edit5.text);  //kleinster y-Wert
d:=strtoint(edit6.text);  //größter y-Wert
e:=paintbox1.height;      //Höhe der Paintbox
f:=paintbox1.width;       //Weite der Paintbox
g:=round(f/(b-a));        //Pixel pro Einheit in x-Richtung
k:=round(e/(d-c));        //Pixel pro Einheit in y-Richtung
xa:=0;             //Anfang der x-Achse
//ya:=e div 2;
xe:=f;          //Ende der x-Achse
//ye:=ya;        
h:=(-a*g);    //Nullkoordinate x-achse
j:=(d*k);    //Nullkoordinate y-achse

  with paintbox1.canvas do begin
  pen.color:=clblue;
  Pen.Width:=3;
  moveto(xa,j);
  lineto(xe,j);
  Brush.color:=clred; //Farbe der Pfeilspitze x-Achse
  polygon([point(xe,j),point(xe-10,j+5),point(xe-10,j-5)]); //Pfeil x-Achse
   for i:=0 to ((b-a)-0) do begin
      pen.color:=clgreen; //Farbe der Striche an der x-Achse
      Pen.Width:=3;
      moveto(i*g,j);
      lineto(i*g,j-10); //Striche an der x-Achse
      end;
  moveto(h,e);
  lineto(h,0);
   Brush.color:=clyellow; //Farbe der Pfeilspitze y-Achse
   polygon([point(h,0),point(h-5,10),point(h+5,10)]); //Pfeil y-Achse
    for i:=0 to ((d-c)-0) do begin
      pen.color:=clblue; //Farbe der Striche an der y-Achse
      Pen.Width:=3;
      moveto(h,i*k);
      lineto(h+10,i*k); //Striche an der x-Achse
      s:=paintbox1.top;   //Abstand der oberen Kante der Paintbox von oben
      t:=paintbox1.left;  //Abstand der linken Kante der Paintbox von links
      label7.left:=t+h-g;  //Position von Label7 von Links
      label7.top:=s+j+k div 2; //Position von Label7 von oben
      label7.caption:='-1';     //Text von Label7
       label8.left:=t+h+g;   //Position von Label8 von Links
      //label8.top:=j;          //Position von Label8 von oben
      label8.top:=s+j+k div 2; //Position von Label8 von oben
      label8.caption:='+1';  //Text von Label8
       label9.left:=t+h-15;   //Position von Label9 von Links
      //label8.top:=j;          //Position von Label9 von oben
      label9.top:=s+j+k-10; //Position von Label9 von oben
      label9.caption:='-1';  //Text von Label9


       end;

 end;
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   with paintbox1.canvas do begin
   repaint;          //Löschen der Paintbox
   end;

end;

procedure TForm1.Button1Click(Sender: TObject);
Var m,n,i:integer;
begin
m:=strtoint(edit1.text);//Anstieg der FKT.
n:=strtoint(edit2.text);//y-Achsenabschnitt der FKT.
a:=strtoint(edit3.text); //kleinster x-Wert
b:=strtoint(edit4.text); //größter x-Wert
c:=strtoint(edit5.text); //kleinster y-Wert
d:=strtoint(edit6.text); //größter y-Wert
e:=paintbox1.height;   //Höhe der Paintbox
f:=paintbox1.width;  //Weite der Paintbox
g:=round(f/(b-a));   //Pixel pro Einheit in x-Richtung
k:=round(e/(d-c)); //Pixel pro Einheit in y-Richtung
xa:=0;           //Anfang der x-Achse
xe:=f;      //Ende der x-Achse
h:=(-a*g); //Nullkoordinate x-achse
j:=(d*k); //Nullkoordinate y-achse

    with paintbox1.canvas do begin //Zeichnen des Graphen, es geht sicher auch einfacher
    moveto(h,(-n*k)+j); //Bewegung zum Koordinatenursprung
    lineto(h+(b*g),j-((m*b*k)+(n*k))); //Zeichnen nach rechts
    moveto(h,(-n*k)+j);  //Bewegung zum Koordinatenursprung
    lineto(h-(abs(a)*g),j+(-1)*(-m*(-a)*k)+(-n*k)); //Zeichnen nach links
    End;
end;
end.
Danke für alle! :dp:

nuclearping 10. Mär 2009 20:53

Re: Funktionen mit Paintbox zeichnen
 
Hehe, Gratulation! :party:

Was macht die weisse Stelle da auf der Y-Achse?

Konstantin H. 11. Mär 2009 09:13

Re: Funktionen mit Paintbox zeichnen
 
Zitat:

Zitat von nuclearping
Hehe, Gratulation! :party:

Was macht die weisse Stelle da auf der Y-Achse?


Weiß nicht^^ Noch mal auf "KS Zeichnen" gedrückt, und die weisse Stelle war weg)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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