Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ график функции

Автор: denis 9.12.2006 17:29

Задача состоит в следующем, нарисовать график функции с возможностью увеличения и уменьшения в дочке x,y. С масштабированием проблем нет, рисует как надо но с увеличением и уменьшением бред получается, весь инет перерыл нечего похожего не нашел.

Автор: Гость 9.12.2006 17:56

Код покажи...

Иначе ничего, кроме "ошибка в 17-ой строке" не услышишь...

Автор: Гость 9.12.2006 20:58

Цитата(Гость @ 9.12.2006 13:56) *

Код покажи...

Иначе ничего, кроме "ошибка в 17-ой строке" не услышишь...


Но это бред
Код

unit main;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Image1: TImage;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  sx,sy:integer;
implementation
{$R *.dfm}
function f_y(x:real):real;
begin
  f_y:=(((sin(x/2)/cos(x/2)))+cos(x))/(sin(1/x));
end;
procedure showGraf(dx,dy,scale:integer);
var x,y,a,b,h,mx,my,xx,yy:real;
begin
  with Form1 do begin
   a:=0; b:=9.42; h:=0.942;
   my:=dy/(20-(-20));
   mx:=dx/(10-(-10));
   x:=0;
   Image1.Canvas.Pen.Style:=psSolid;
   Image1.Canvas.Rectangle(0,0,500,300);
   x:=x+h;
   image1.Canvas.MoveTo(round(dx/2-x*mx),round(300/2-f_y(x)*my));
   while x<=b-0.94 do begin
    yy:=dy/2-f_y(x)*my;
    xx:=dx/2+x*my;;
    Image1.Canvas.LineTo(round(xx),round(yy));
    x:=x+h;
   end;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
sx:=500; sy:=300;
showGraf(sx,sy,0);
end;

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

procedure TForm1.Button3Click(Sender: TObject);
begin
Image1.Refresh;
sx:=sx-20; sy:=sy+10;
showGraf(sx,sy,1);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Image1.Refresh;
sx:=sx+20; sy:=sy-10;
showGraf(sx,sy,1);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin
  sx:=sx-10;
end;
if Button=mbRight then begin
  sx:=sx+10;
end;
showGraf(sx,sy,1);
end;

end.


Автор: regffgfd 10.12.2006 19:32

Вот переписал, но с увеличением и уменьшением нечего не получается.


Код
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}
var xtmin,xtmax:integer;

procedure show_f(mx,my:integer; ssx,ssy:double; xma,xmi:integer);
var x,y:array[1..10]of real;
     i:integer;
     h:real;
     xmin,xmax,ymin,ymax,sx,sy:double;
begin
  Form1.Image1.Refresh;
  Form1.Image1.Canvas.Pen.Style:=psSolid;
  Form1.Image1.Canvas.Rectangle(0,0,500,300);
  h:=0.94;
  i:=1;
  for i:=1 to 9 do begin
   x[i]:=h;
   y[i]:=(((sin(h/2)/cos(h/2)))+cos(h))/(sin(1/h));
   h:=h+0.94;
  end;
  xmin:=x[1]; xmax:=x[1]; ymin:=y[1]; ymax:=y[1];
  for i:=2 to 9 do begin
   if y[i]<ymin then ymin:=y[i];
   if y[i]>ymax then ymax:=y[i];
   if x[i]<xmin then xmin:=x[i]
   if x[i]>xmax then xmax:=x[i];
  end;
  sx:=Form1.Image1.Width/(xmax-xmin);
  sy:=Form1.Image1.Height/(ymax-ymin);
  with Form1.Image1.Canvas do begin
   moveto(trunc(sx*(x[1]-xmin)),Form1.Image1.height-trunc(sy*(y[1]-ymin)));
   for i:=2 to 9 do begin
    Lineto(trunc(sx*(x[i]-xmin)),Form1.Image1.height-trunc(sy*(y[i]-ymin)));
   end;
  end;
end;

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

procedure TForm1.Button1Click(Sender: TObject);
begin
show_f(1,1,1,1,1,1);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then begin
??????????????????????? ++++ ???????????????????????????
//  xtmax:=xtmax+1; xtmin:=xtmax-1;
//  show_f(1,1,1,1,xtmax,xtmin);
end;
if Button=mbRight then begin
??????????????????????? -----  ???????????????????????????
//  xtmax:=xtmax-1; xtmin:=xtmax+1;
//  show_f(1,1,1,1,xtmax,xtmin);
end;

end;

end.
[b][/b][b]