![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. Что бы каждый раз график не рассчитывался и не перерисовывался. |