Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите построить график функции


Автор: Fifa 12.12.2004, 14:11
Люди добрые, помогите ,пожалуйста, программистке с маленьким мозгом написать прогу, которая бы рисовала график функции 3*x(SQR)+3*x+5. Заранее премного благодарна!

Автор: Fedor 12.12.2004, 14:28
Цитата(Fifa @ 12.12.2004, 13:11)
программистке с маленьким мозгом

блондинка?

Цитата(Fifa @ 12.12.2004, 13:11)
3*x(SQR)+3*x+5

Может быть, имелось в виду 3*SQR(x)+3*x+5

Строишь по точкам с каким-то конкретным шагом. Что именно непонятно?

Автор: Ddddddelphi 12.12.2004, 16:34
Fifa, загляни http://imi.sitc.ru/~pm02/2/21.htm

Автор: Pakshin A. S. 12.12.2004, 22:40
А где программистка с маленьким мозгом хочет нарисовать график?

Автор: Vladimir13 13.12.2004, 02:20
на Image по линиям рисуешь. А лучше найди в Архангельском.

Автор: sergejzr 13.12.2004, 02:31
Бери шаг в пиксель, начинай с нуля.

Ну, если совсем "с маленьким мозгом", то тогда возьми картинку с низу и перетащи на форму!

Но дело конечно не в величине мозга, а в количестве извилин..

Автор: Ddddddelphi 13.12.2004, 14:09
Код

unit grfunc_;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm1 = class(TForm)
   procedure FormPaint(Sender: TObject);
   procedure FormResize(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

// функция, график которой надо построить
Function f(x:real):real;
begin
   f:=3*sqr(x)+3*x+5;
end;

//процедура постройки графики
procedure GrOfFunc;
var
x1,x2:real;    // границы изменения аргумента функции
y1,y2:real;    // границы изменения значения функции
x:real;        // аргумент функции
y:real;        // значение функции в точке x
dx:real;       // приращение аргумента
l,b:integer;   // левый нижний угол области вывода графика
w,h:integer;   // ширина и высота области вывода графика
mx,my:real;    // масштаб по осям X и Y
x0,y0:integer; // точка - начало координат

begin
// определяем область вывода графики
l:=10;                     // X - координата левого верхнего угла
b:=Form1.ClientHeight-20;  // Y - координата левого нижнего угла
h:=Form1.ClientHeight-40;  // высота
w:=Form1.Width-40;         // ширина

x1:=0;     // нижняя граница диапазона аргумента
x2:=25;    // верхняя
dx:=0.01;  // шаг аргумента

// найдём максимальное и минимальное значения
// функции на отрезке  [x1,x2]
y1:=f(x1); // минимум
y2:=f(x1); // максимум
x:=x1;
repeat
  y := f(x);
  if y < y1 then y1:=y;
  if y > y2 then y2:=y;
  x:=x+dx;
until (x>=x2);

// задаём масштаб
my:=h/abs(y2-y1);  // по оси Y
mx:=w/abs(x2-x1);  // X

// оси
x0:=l;
y0:=b-Abs(Round(y1*my));

with form1.Canvas do
begin
  // рисуем оси x и y
  MoveTo(l,b);LineTo(l,b-h);
  MoveTo(x0,y0);LineTo(x0+w,y0);
  TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
  TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
  //строим график
  x:=x1;
  repeat
    y:=f(x);
    Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
    x:=x+dx;
  until (x>=x2);
end;
end;


procedure TForm1.FormPaint(Sender: TObject);
begin
 GrOfFunc;
end;

// при изменнение размера окна программы
procedure TForm1.FormResize(Sender: TObject);
begin
 //очистить форму
 form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
 // заново строим график
 GrOfFunc;
end;

end.

Автор: Bes 14.12.2004, 11:00
Простите, а что, компонент TChart нынче не в моде?.... :-)
Рисуй что хочешь, как хочешь да еще и наворотов там встроенных море типа масштабирования и пр...

Автор: _hunter 14.12.2004, 12:19
а он а моде никогда и небыл smile
ибо это недостойно истинного программиста юзать левые компоненты на пустяковых задачах smile

Автор: Bes 14.12.2004, 14:46
:-)
Левые?....
Каждый раз изобретать велосипед?....
Нечем заняться?....

P.S. Кстати, если рисовать прямо на канве, то график будет затираться при наезжании на другие окна, свертывании и пр. т.е. его надо будет перерисовывать... но конечно можно не мучаться с TChart-ом, а запоминать все параметры графика и функции и выполнять процедуру отрисовки при каждом событии On..... флрмы. Это проще и интереснее. :-)

Автор: SoWa 14.12.2004, 14:58
Ага, TChart- рульная вешь! Скоро на www.faraonsowa8.narod.ru выложу прогу для построенияграфиков любой функции... родолжение следует smile

Автор: _hunter 15.12.2004, 11:20
скажем так... в детстве, когда велосипеды изобретать нужно ( для практики ), все ( наверное ) писали построители графиков ( я -- еще на паскале ) и позже переводили в классы. почему бы их не юзать?
а преимуществ у TChart' a -- ноль ( даже тормознутее )
а прилепить к классу пару/тройку обработчиков -- не проблема

Автор: Bes 15.12.2004, 12:00
2hunter:
Согласен, я тоже когда еще в BP писал - тоже делал построители графиков, но когда я увидел TChart - навсегда заыл об этом. Не знаю, уважаемый, о чем вы говорите, может у вас там свой Chart, но я не понимаю что значит преимуществ 0 и тормознутее... ?
Я его пользую давно, строю графики далеко не х=у*у разных типов и пр. и никаких проблем.

Автор: Ddddddelphi 15.12.2004, 14:45
[/b]Bes[b], а ты не мог бы скинуть исходник, любой проги, подучиться чтобы

Автор: Bes 15.12.2004, 14:57
2Ddddddelphi: Это проверка на вшивость что ли? :-)
В чарте или на канве или в TB турбо паскаля давно накомпе не имею - так что если надо в нем топридется подождать... ну и есть плохая привычка не хранить исходники так что писать буду заново. Как писать?

Автор: Ddddddelphi 15.12.2004, 19:03
Цитата(Bes @ 15.12.2004, 14:57)
2Ddddddelphi: Это проверка на вшивость что ли? :-)
В чарте или на канве или в TB турбо паскаля давно накомпе не имею - так что если надо в нем топридется подождать... ну и есть плохая привычка не хранить исходники так что писать буду заново. Как писать?

да не, Bes, чего ты собрался там писать? smile

Автор: Bes 16.12.2004, 13:47
Не... ну надо, нет? без проблем. :-) смотрите сами как гриться....

Автор: Ddddddelphi 16.12.2004, 14:30
Bes, да не люблю я утруждать людей по вопросам, с которыми я в задачах ещё не сталкивался, а если тебе без проблем, то хотелось бы взглянуть на такой график функции который вырисовывается во всех четвертях.

Автор: Bes 16.12.2004, 14:54
Мля, график-то я сделал, а как его в сообщение запихнуть. :-(

Автор: Ddddddelphi 17.12.2004, 20:22
и что график прям вырисовывается во всем четвертях...и почему не помещается код чего там фантастического можно было написать... smile smile - шутка что-ли....и кидай мне на ящик...

Автор: Bes 20.12.2004, 07:26
А... да нет, я думал тебе надо сам график - я и не знал как отскриненую картинку в форум вставить дак я ее тебе на почту выслал а код простой щас накидаю.

Var
x,y,p:real;
begin
Series1.AddArrow(-1,0,0,1,'',clred);
Series1.AddArrow(0,1,1,0,'',clred);
Series1.AddArrow(1,0,0,-1,'',clred);
Series1.AddArrow(0,-1,-1,0,'',clred);


Series2.X0:=-0.1;
Series2.Y0:=0.1;
Series2.X1:=0.1;
Series2.Y1:=-0.1;

p:=0;

Repeat
p:=p+pi/100;
x:=cos(p)/5;
y:=sin(p)/5;

Series3.AddXY(x,y,'',clBlack);
Until p>=2*pi;

Вот, всяко разно во всех четвертях и как вы предлагали точками и линиями и еще одним способом.
P.S. Картинка несколько отличается от приведенного примера, т.к. я вая сейчас заново - не сохранял первый пример. :-)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)