wykresy i osie

0

Mam pytanie na temat wykresów a konkretnie jak w ogóle w delphim robi sie jakiś wykres np x do kwadratu czy x do 3, i jak dodaje sie osie bo widziałem kiedyś taki program co rysował wykresy napisany w delphi ale w ogóle nie było osi...

0

Jaki widzisz problem ? - rysuj na Canvas`ie : Canvas.LineTo, a strzałki: canvas.Polygon().

0

A może napisał byś jakiś prosty przykład bo nie bardzo wiem jak to ma być... np x do 3. Z góry dzięki

0

A może napisał byś jakiś prosty przykład bo nie bardzo wiem jak to ma być... np x do 3. Z góry dzięki

0

A może to ty powinieneś zadać sobie troche trudu i poszukać ?...

http://4programmers.net/Forum/viewtopic.php?id=71747
http://4programmers.net/Forum/viewtopic.php?id=71862

0

Po raz kolejny odpowiadam na tego samego typu pytanie - ale cóż:)

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Label2: TLabel;
    PopupMenu1: TPopupMenu;
    sinx1: TMenuItem;
    cosx1: TMenuItem;
    tgx1: TMenuItem;
    ctgx1: TMenuItem;
    Button2: TButton;
    Button3: TButton;
    SpinEdit1: TSpinEdit;
    Image1: TImage;
    funkcjaliniowa1: TMenuItem;
    funkcjakwadratowa1: TMenuItem;
    procedure Button1Click(Sender: TObject);
    procedure SpinEdit1Change(Sender: TObject);
    procedure sinx1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure cosx1Click(Sender: TObject);
    procedure tgx1Click(Sender: TObject);
    procedure ctgx1Click(Sender: TObject);
    procedure funkcjaliniowa1Click(Sender: TObject);
    procedure funkcjakwadratowa1Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public

    { Public declarations }
  end;
  funkcja=function(x:real):real; //deklaracja typu funkcyjnego

var
  Form1: TForm1;
  dx:integer;   //wielkość jednostki
  ox,oy:integer;
  uklad:boolean;
  a,b,c:double;

implementation

{$R *.DFM}

procedure czysc;
begin
    uklad:=False;
    Form1.Image1.Picture:=nil;
end;

procedure rysuj_uklad;
begin
       with Form1.Image1.Canvas do
       begin
           //oś ox
           Moveto(0,oy);
           Lineto(Form1.Width,oy);
           //strzałka
           Lineto(Form1.Width-15,oy-5);
           Moveto(Form1.Width,oy);
           Lineto(Form1.Width-15,oy+5);
           //oś oy
           Moveto(ox,0);
           Lineto(ox,Form1.Height);
           //strzałka
           Moveto(ox,0);
           Lineto(ox-5,10);
           Moveto(ox,0);
           Lineto(ox+5,10);
       end;
end;

procedure jednostki;
var i:integer;
    x,y:integer;
begin
        x:=ox;
        y:=oy+10;
        Form1.Image1.Canvas.TextOut(x,y,'0');
        //oś ox
        for i:= 1 to round(ox/dx)do
        begin
            x:=x+dx;
            Form1.Image1.Canvas.TextOut(x-2,y,inttostr(i));
            Form1.Image1.Canvas.Moveto(x,y-13);
            Form1.Image1.Canvas.Lineto(x,y-3);
        end;
        x:=ox;
        for i:= -1 downto -round(ox/dx)do
        begin
            x:=x-dx;
            Form1.Image1.Canvas.TextOut(x-6,y,inttostr(i));
            Form1.Image1.Canvas.Moveto(x,y-13);
            Form1.Image1.Canvas.Lineto(x,y-3);
        end;
       //oś y
       y:=oy;
       x:=ox ;
       for i:= 1 to Round(oy/dx)do
       begin
           y:=y-dx;
           Form1.Image1.Canvas.TextOut(x+8,y-10,IntToStr(i));
           Form1.Image1.Canvas.MoveTo(x-3,y);
           Form1.Image1.Canvas.LineTo(x+3,y);
       end;
       y:=oy;
       for i:= -1 downto -round(oy/dx)do
       begin
           y:=y+dx;
           Form1.Image1.Canvas.Textout(x+8,y-10,IntToStr(i));
           Form1.Image1.Canvas.Moveto(x-3,y);
           Form1.Image1.Canvas.Lineto(x+3,y);
       end;
end;

function sinx(x:real):real;
begin
    sinx:=sin(x)
end;

function cosx(x:real):real;
begin
    cosx:=cos(x)
end;

function tgx(x:real):real;
begin
    if cos(x)<>0 then
       tgx:=(sin(x)/cos(x));
end;

function ctgx(x:real):real;
begin
    if sin(x)<>0 then
       ctgx:=(cos(x)/sin(x))
end;

function liniowa(x:real):real;
begin
    liniowa:=a*x+b;
end;

function kwadratowa(x:real):real;
begin
    kwadratowa:=a*x*x+b*x+c;
end;

procedure wykres(f:funkcja; kolor:TColor);
var
   x,y:real;  //współrzędne matematyczne
   xf,yf,h:integer;//współrzędne ekranowe,
begin
       h:=1;
       xf:=ox;
       x:=0;
       y:=f(x);
       yf:=oy-round(y/dx);
       Form1.Image1.Canvas.Pixels[xf,yf]:=kolor;
       //rysowanie wykresu na dodatniej półosi ox
       while xf<2*ox do
       begin
           xf:=xf+h;
           x:=(xf-ox)/dx;
           y:=f(x);
           yf:=round(oy-y*dx);
           Form1.Image1.Canvas.Pixels[xf,yf]:=kolor;
       end;
       xf:=ox;
       x:=0;
       y:=f(x);
       yf:=oy-round(y/dx);
       Form1.Image1.Canvas.Pixels[xf,yf]:=kolor;
       //rysowanie wykresu na ujemnej półosi ox
       while xf>0 do
       begin
           xf:=xf-h;
           x:=(xf-ox)/dx;
           y:=f(x);
           yf:=round(oy- y*dx);
           Form1.Image1.Canvas.Pixels[xf,yf]:=kolor;
       end;
end;

//funkcje obsługi zdarzeń

procedure TForm1.FormActivate(Sender: TObject);
begin
    uklad:=False;
    Form1.Color:=clWhite;
    ox:=Form1.Width div 2; //współrzędna x osi y
    oy:=(Form1.Height - Panel1.Height) div 2;//współrzędna y osi x
    dx:=ox;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    Close;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
    if SpinEdit1.Value> 0 then
       dx:=round(ox/SpinEdit1.Value);
end;

procedure TForm1.sinx1Click(Sender: TObject);
begin
    wykres(sinx, clBlue)
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    czysc;
end;


procedure TForm1.Button3Click(Sender: TObject);
begin
   if not uklad then
   begin
       czysc;
       rysuj_uklad;
       jednostki;
   end;
end;


procedure TForm1.cosx1Click(Sender: TObject);
begin
    wykres(cosx, clRed)
end;

procedure TForm1.tgx1Click(Sender: TObject);
begin
    wykres(tgx, clNavy)
end;

procedure TForm1.ctgx1Click(Sender: TObject);
begin
    wykres(ctgx, clGreen)
end;

procedure TForm1.funkcjaliniowa1Click(Sender: TObject);
var
    blad:boolean; //czy jest błąd podczas wprowadzania współczynników równania
begin
    repeat
        blad:=false;
        try
           a:=StrToFloat(InputBox('Współczynniki równania','Podaj współczynnik a','0'));
        except
           blad:=true;
        end;
    until blad=false;
    repeat
        blad:=false;
        try
           b:=StrToFloat(InputBox('Współczynniki równania','Podaj współczynnik b','0'));
        except
           blad:=true;
        end;
    until blad=false;
    wykres(liniowa, clPurple);
end;

procedure TForm1.funkcjakwadratowa1Click(Sender: TObject);
var
    blad:boolean; //czy jest błąd podczas wprowadzania współczynników równania
begin
    repeat
        blad:=false;
        try
           a:=StrToFloat(InputBox('Współczynniki równania','Podaj współczynnik a','0'));
        except
           blad:=true;
        end;
    until blad=false;
    repeat
        blad:=false;
        try
           b:=StrToFloat(InputBox('Współczynniki równania','Podaj współczynnik b','0'));
        except
           blad:=true;
        end;
    until blad=false;
    repeat
        blad:=false;
        try
           c:=StrToFloat(InputBox('Współczynniki równania','Podaj współczynnik c','0'));
        except
           blad:=true;
        end;
    until blad=false;
    wykres(kwadratowa, clMaroon);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
    uklad:=False;
    Form1.Color:=clWhite;
    ox:=Form1.Width div 2; //współrzędna x osi y
    oy:=(Form1.Height - Panel1.Height) div 2;//współrzędna y osi x
    dx:=ox;
end;

end.
0

a moglbys na maila to wyslac ten program bo mi (nie wiem czemu) nie działa
[email protected]

1 użytkowników online, w tym zalogowanych: 0, gości: 1