|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Построение графика в 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
|
|||
|
|||
Ну тебе надо вместо функции передавать массив твоих точек и уже с ним работать
|
#3
|
|||
|
|||
Я так понимаю у меня должно быть два массива? Один точек по оси Х, другой по оси У? Я там где функция примерно разобрался что к чему, а вот как сделать чтоб массив вместо функции задать не понимаю, покажите пожалуйста как это сделать на примере рандомного массива и по Х и по У, если нетрудно
|
#4
|
|||
|
|||
Код:
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
|
|||
|
|||
Спасибо, но у меня нету функции, мне надо для рандомных Х, чтобы были рандомные У и строился график
|
#6
|
|||
|
|||
Типа код должен обладать телепатическими способностями и узнавать значения y по x без функции? Такого даже мой декан не может...
|
#7
|
|||
|
|||
"на компьютер приходит набор точек" - подробнее давай
|
#8
|
|||
|
|||
Сейчас расскажу совсем подробно)
Пишу программу для антенно-поворотного устройства. При помощи программы с компьютера вводим количество градусов, антенна поворачивается на это количество градусов и с блока управления на компьютер приходят значения амплитуды (сигнала с антенны), на каждые пол градуса приходит одно значение амлитуды. У меня в программе в одно поле memo приходит амплитуда, а в другое поле memo (которое находится напротив) пишутся градусы с шагом 0,5 (тоесть получается, что напротив градуса стоит соответсвующая ему амплитуда. Так вот мне надо, чтобы программа строила график зависимости этой амплитуды от угла поворота. Ниже я приложил архив с программой, чтоб было более понятно, там есть флажок АЦП, это для того чтобы, если он стоит то мы получаем в поле "Амплитуда" измерения, а если флажка нет, то антенна просто осуществляет поворот. |
#9
|
|||
|
|||
Ну примерно так, наверное )
|
Этот пользователь сказал Спасибо ART за это полезное сообщение: | ||
inosel (09.04.2013)
|
#10
|
|||
|
|||
Спасибо огромное, очень похоже именно на что надо! Буду разбираться
|