![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() PaintBox
график функции Y=abs(COS(2*X)-SIN(2*X)) на отрезке [a, b]. у меня с этим пипец какая проблема, в голову вообще ниче не лезит, помогите плиз, в качестве примера возьмите любой график, хоть у=х*х, мне самое главное пример как это делать я так делал, но он мне вообще ниче рисовать не хочет: Код:
unit Unit15; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Math; type TForm1 = class(TForm) PaintBox1: TPaintBox; procedure PaintBox1Paint(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; function xs(x:double):integer; function ys(y:double):integer; var Form1: TForm1; a,b,px,py,qx,qy,ming,maxg,x,y: double; implementation {$R *.dfm} function f(x: double): double; begin result:=abs(cos(2*x)-sin(2*x)); end; procedure TForm1.FormCreate(Sender: TObject); begin a:=-12; b:=15; end; procedure TForm1.PaintBox1Paint(Sender: TObject); var i,j:integer; begin ming:=0.1; maxg:=0.1; for i:=0 to round(abs(a)+abs(b)) do begin x:=a+i; y:=f(x); if maxg<y then maxg:=y; if ming>y then ming:=y; end; px:=(PaintBox1.Width-PaintBox1.left)/(b-a); qx:=left-px*a; py:=(PaintBox1.top-PaintBox1.Height)/(maxg-ming); qy:=PaintBox1.top-py*maxg; for j:=PaintBox1.Left to PaintBox1.Width do PaintBox1.Canvas.Pixels[xs(j),ys(f(j))]:=clred; end; function xs(x:double):integer; //вычисляем экранные координаты begin result:=round(px*x+qx); end; function ys(y:double):integer; begin result:=round(py*y+qy); end; end. |
#2
|
|||
|
|||
![]() В принципе, можно, конечно, отрисовывать все в OnPaint. При этом незабудь преобразовать координаты по y, т.к. точка 0 по этой оси находится в другом месте.
Код:
function F(x : integer) : Integer; begin result := x*x; end; procedure TForm1.PaintBox1Paint(Sender : TObject); var x, y, i : Integer; begin // X in -100..100 // Y = X^2 x := -100 + Round(PaintBox1.Width / 2); y := f(-100) * -1 + Round(PaintBox1.Height / 2); With PaintBox.Canvas Do Begin Pen.Color := clBlack; Brush.Color := clWhite; FillRect(Rect(0,0,Width,Height); MoveTo(x,y); For I := -100 To 100 Do Begin x := -100 + Round(PaintBox1.Width / 2); y := f(-100) * -1 + Round(PaintBox1.Height / 2); LineTo(x,y); End; End; end; Но, вообще, лучше сделать отрисовку на буферном битмапе, а его уже выводить в OnPanit. Что бы каждый раз график не рассчитывался и не перерисовывался. |