Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.04.2012, 18:05   #1
--Sashok--
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 76
Восклицание График, доделать delphi

Код:
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:=1/2*cos(x+1)+ sin(x);
 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:=-10;     // íèæíÿÿ ãðàíèöà äèàïàçîíà àðãóìåíòà
 x2:=10;    // âåðõíÿÿ ãðàíèöà äèàïàçîíà àðãóìåíòà
 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:=1;
 y0:=b-Abs(Round(y1*my));

 with form1.Canvas do
 begin
   // îñè
   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.
ВОт сам код графика я вставил свою функцию f(x) мне нужно чтобы оси правильно находились, может я что то не правильно делаю но на отрезке [-10;10] функция
--Sashok-- вне форума
Старый 09.04.2012, 18:30   #2
--Sashok--
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 76
По умолчанию

плиз посмотрите уж реальн оочень надо завтра здавать нужно..или уроют
--Sashok-- вне форума
Старый 09.04.2012, 23:06   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Если сегодня еще зайдете, то скажите четко, что вас не устраивает. Можете привести рисунок. сделанный в пэинте, как должно выглядеть.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума
Старый 10.04.2012, 16:57   #4
--Sashok--
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 76
По умолчанию


вот а мне надо отрезок -10 10. а тут хз короче до 0 должно видно от -10 до 0 и от 0 до 10 вправо
--Sashok-- вне форума
Старый 10.04.2012, 18:05   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Переписал чуток.
Теперь выводит, по идее, правильно.
Протестируйте.
Код:
unit Unit1;

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 := 1 / 2 * cos(x + 1) + sin(x);
end;

// строит график функции

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

begin
  top1 := 10;
  bottom1 := Form1.ClientHeight - 10;
  left1 := 10;
  right1 := Form1.ClientWidth - 10;

  w := right1 - left1;
  h := bottom1 - top1;

  x1 := -10; // нижняя граница диапазона аргумента
  x2 := 10; // верхняя граница диапазона аргумента
  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

  // оси
  y0 := top1 + round(h * abs(y1) / (abs(y1) + abs(y2)));
  x0 := left1 + round(w * abs(x1) / (abs(x1) + abs(x2)));

  with Form1.Canvas do
  begin
    // оси
    pen.Color := clBlack;
    MoveTo(x0, top1);
    LineTo(x0, bottom1);
    MoveTo(x0, top1);
    LineTo(x0 + 5, top1 + 10);
    MoveTo(x0, top1);
    LineTo(x0 - 5, top1 + 10);
    MoveTo(left1, y0);
    LineTo(right1, y0);
    MoveTo(right1, y0);
    LineTo(right1 - 10, y0 + 5);
    MoveTo(right1, y0);
    LineTo(right1 - 10, y0 - 5);

    TextOut(x0 + 10, bottom1 - 15, FloatToStrF(y1, ffGeneral, 6, 3));
    TextOut(x0 + 10, top1, FloatToStrF(y2, ffGeneral, 6, 3));
    TextOut(left1, y0 - 25, FloatToStrF(x1, ffGeneral, 6, 3));
    TextOut(right1 - 15, y0 - 25, FloatToStrF(x2, ffGeneral, 6, 3));

    // построение графика
    pen.Color := clRed;
    x := x1;
    y := f(x);
    MoveTo(round(x0 + x * mx), round(y0 - y * my));
    repeat
      y := f(x);
      LineTo(round(x0 + x * mx), round(y0 - y * my));
      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.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума
Старый 10.04.2012, 18:30   #6
--Sashok--
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 76
По умолчанию

форма выводится пустой
--Sashok-- вне форума
Старый 10.04.2012, 18:38   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Очень странно. Вот что у меня:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума
Старый 10.04.2012, 18:44   #8
--Sashok--
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 76
По умолчанию

это дельфи?
--Sashok-- вне форума
Старый 10.04.2012, 18:54   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Да, дельфи.
Проверил в Embarcadero Rad Studio 2010 (Delphi 2010) и Delphi TDLite (Delphi 2006).
Показывает, как на выше выложенном скриншоте.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума
Старый 19.04.2012, 18:11   #10
--Sashok--
Пользователь
 
Регистрация: 17.02.2011
Сообщений: 76
По умолчанию

посмотрите пожалуйста на моем дельфи 7 не работает =(
--Sashok-- вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доделать программку на delphi! kitty19 Фриланс 7 16.06.2011 16:19
Доделать программу на Delphi (за $) djendalf Фриланс 2 23.12.2010 15:18
Delphi Бинарный поиск (доделать) LoRD_ОЛЕДЖАН Фриланс 3 22.05.2010 17:40
Доделать проект на Delphi SNUPY Фриланс 3 06.05.2008 15:16
Задача Delphi. Помогите доделать! Oksana11 Помощь студентам 8 27.12.2007 23:00