Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.01.2010, 13:47
Аватар для SerginhoLD
SerginhoLD SerginhoLD вне форума
Новичок
 
Регистрация: 19.11.2009
Сообщения: 73
Репутация: 12
По умолчанию пиксельный график функции на отрезке

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  
Старый 04.01.2010, 15:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В принципе, можно, конечно, отрисовывать все в 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. Что бы каждый раз график не рассчитывался и не перерисовывался.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:01.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025