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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.07.2011, 13:53
AnderoN AnderoN вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 31
Репутация: 10
По умолчанию Построение графика в Image (по принятым значениям)

Всем доброе время суток, помогите пожалуйста.
Есть программа, которая рисует график в поле Image, вот код процедуры, которая осуществляет построение:

Код:
Type TFunc = function (x: real): real;

procedure DrawGraph (f: TFunc; a: real; b: real; C: TCanvas);

var x, y, h: real;

    max, min: real;

    sx, sy: real;

    xmid, ymid: integer;

begin

 sx := (c.ClipRect.Right)/(b-a);

 h := 1/sx;

 xmid := c.ClipRect.Right div 2;

 ymid := c.ClipRect.Bottom div 2;

 x := a;

 max := f( x);

 min := max;

 while x<=b do

   begin

     y := f( x);

     if y<min then min := y;

     if y>max then max := y;

     x := x + h;

   end;

  sy := c.ClipRect.Bottom/ (max-min);

  c.Brush.Color := clBlack;

  c.FillRect(Rect(0, 0, c.ClipRect.Right, c.ClipRect.Bottom));

  c.Pen.Color := clYellow;

  c.MoveTo(0, ymid);

  c.LineTo(c.ClipRect.Right, ymid);

  c.MoveTo(xmid, 0);

  c.LineTo(xmid, c.ClipRect.Bottom);

  x := a;

  y := f(x);

  c.Pen.Color := clWhite;

  c.MoveTo(xmid+round(sx*x), ymid-round(sy*y));

  while x<=b do

    begin

      y := f(x);

      c.LineTo(xmid+round(sx*x), ymid-round(sy*y));

      x := x + h;

    end;

end;

А вот сама программа, которая использует выше упомянутую процедуру построения графика:

Код:
Function f(x: real): real;

 begin

   Result := sin(x)*cos(x);

 end;

 

procedure TForm1.Button1Click(Sender: TObject);

 begin

   DrawGraph (f, -10, 10, Image1.Canvas);

 end;


При нажатии на кнопку мы получаем график, который указан в function f(x:real), в данном случае это sin(x)*cos(x).

Мне же необходимо, чтобы график строился по точкам ( то есть я не задаю функцию формулой, а у меня после некоторых измерений на компьютер приходит набор точек, если быть точнее значения амплитуды в зависимости от градусов поворота установки). Подскажите пожалуйста, как сделать, чтобы не забивать функцию, а при нажатии на кнопку график строился по точкам?
Ответить с цитированием
  #2  
Старый 07.07.2011, 14:09
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Ну тебе надо вместо функции передавать массив твоих точек и уже с ним работать
Ответить с цитированием
  #3  
Старый 08.07.2011, 13:10
AnderoN AnderoN вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 31
Репутация: 10
По умолчанию

Я так понимаю у меня должно быть два массива? Один точек по оси Х, другой по оси У? Я там где функция примерно разобрался что к чему, а вот как сделать чтоб массив вместо функции задать не понимаю, покажите пожалуйста как это сделать на примере рандомного массива и по Х и по У, если нетрудно
Ответить с цитированием
  #4  
Старый 08.07.2011, 13:33
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Код:
 type
  TCoord = record
   x, y: real;
  end;

 TPoints = array of TCoords;

И передаешь в процедуру вместо функции:

Код:
 procedure DrawGraph (var mass: TPoints; a: real; b: real; C: TCanvas);

Забить массив можно так:

Код:
 function Coord(x, y: real): TCoord;
 begin
  result.x := x;
  result.y := y;
 end;
 
 function getPoints: TPoints;
 var
  x: integer; //лучше real, но код немного другой будет
  Ps: TPoints;
 begin
 SetLength(Ps, 0);
  for x := -100 to 100 do begin
   SetLength(Ps, Length(Ps) + 1);
   Ps[High(Ps)] := Coord(x, f(x)); //f(x) - твоя функция
  end;
 Result := Ps;
 end;

Или еще можно значения брать из файла.
Ответить с цитированием
  #5  
Старый 08.07.2011, 13:46
AnderoN AnderoN вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 31
Репутация: 10
По умолчанию

Спасибо, но у меня нету функции, мне надо для рандомных Х, чтобы были рандомные У и строился график
Ответить с цитированием
  #6  
Старый 08.07.2011, 13:56
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Типа код должен обладать телепатическими способностями и узнавать значения y по x без функции? Такого даже мой декан не может...
Ответить с цитированием
  #7  
Старый 08.07.2011, 13:57
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

"на компьютер приходит набор точек" - подробнее давай
Ответить с цитированием
  #8  
Старый 08.07.2011, 14:11
AnderoN AnderoN вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 31
Репутация: 10
По умолчанию

Сейчас расскажу совсем подробно)

Пишу программу для антенно-поворотного устройства. При помощи программы с компьютера вводим количество градусов, антенна поворачивается на это количество градусов и с блока управления на компьютер приходят значения амплитуды (сигнала с антенны), на каждые пол градуса приходит одно значение амлитуды. У меня в программе в одно поле memo приходит амплитуда, а в другое поле memo (которое находится напротив) пишутся градусы с шагом 0,5 (тоесть получается, что напротив градуса стоит соответсвующая ему амплитуда.

Так вот мне надо, чтобы программа строила график зависимости этой амплитуды от угла поворота. Ниже я приложил архив с программой, чтоб было более понятно, там есть флажок АЦП, это для того чтобы, если он стоит то мы получаем в поле "Амплитуда" измерения, а если флажка нет, то антенна просто осуществляет поворот.
Вложения
Тип файла: rar Antenna (COM) 1.03.rar (203.3 Кбайт, 17 просмотров)
Ответить с цитированием
  #9  
Старый 08.07.2011, 14:47
ART ART вне форума
Продвинутый
 
Регистрация: 13.02.2006
Адрес: Магнитогорск
Сообщения: 669
Репутация: 14745
По умолчанию

Ну примерно так, наверное )
Вложения
Тип файла: rar G.rar (5.3 Кбайт, 56 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо ART за это полезное сообщение:
inosel (09.04.2013)
  #10  
Старый 08.07.2011, 14:54
AnderoN AnderoN вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 31
Репутация: 10
По умолчанию

Спасибо огромное, очень похоже именно на что надо! Буду разбираться
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter