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

Delphi Sources



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

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

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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;

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
По умолчанию

Код:
1
2
3
4
5
6
type
 TCoord = record
  x, y: real;
 end;
 
TPoints = array of TCoords;

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

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

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

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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, время: 14:25.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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