![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Подскажите как построить график имея два массива а и в, где массив а - ось Х, а в - Y. Нарисовать надо канвой на Image.
Заранее благодарен!!! |
|
#2
|
|||
|
|||
|
Как-то примерно так:
Код:
uses Math;
procedure TForm1.Button1Click(Sender: TObject);
var
A, B : Array Of Extended;
I : Integer;
J : Extended;
mX, mY, xX, xY, dX, dY : Extended;
kX, kY : Extended;
begin
SetLength(A,0);
SetLength(B,0);
J := -5;
While J < 5 Do
begin
SetLength(A,Length(A)+1);
A[High(A)] := J;
SetLength(B,Length(B)+1);
B[High(B)] := J*J;
J := J + 0.1;
end;
// Проверяем длинну массивов.
If (Length(A) <> Length(B)) Or (Low(A) <> Low(B)) Then
Raise Exception.create('Массивы не равны.');
// Рассчитываем коэф. для отрисовки.
mX := 0; mY := 0; xX := 0; xY := 0;
For I := Low(A) To High(A) Do
Begin
mX := Min(mX,A[i]);
mY := Min(mY,B[i]);
xX := Max(xX,A[i]);
xY := Max(xY,B[i]);
End;
dX := Abs(xX - mX) + 1;
dY := Abs(xY - mY) + 1;
kX := Image1.Width / (2*dX) ;
kY := Image1.Height / (2*dY) ;
// Выравниваем коэф по мин.
kX := Min(kX,kY);
kY := Min(kX,kY);
dX := (Image1.Width / 2);
dY := (Image1.Height / 2);
// Теперь рисуем
With Image1.Canvas Do
Begin
Pen.Color := clBlack;
MoveTo(Round(kX*A[Low(A)] + dX), Round(dY - kY*B[Low(B)]));
For I := Low(A) + 1 To High(A) Do
LineTo(Round(kX*A[i] + dX), Round(dY - kY*B[i]));
End;
end; |
|
#3
|
|||
|
|||
|
Все намного проще (на мой взгляд)
.. Длинна массивов 500 и не меняется. Значения только положительные, я нашел более простое решение, но возникла другая проблема.. поможете решить??Код:
procedure TFmEURUSD.ButLoadKotChasYesClick(Sender: TObject);
begin
AssignFile(SaveChasKot,'D:\sim\Программирование\Delhpi\Проект\Основная\EUR_USD_Chas_Kot.txt');
Reset(SaveChasKot);
while not Eof(SaveChasKot) do //читаем из файла....
begin
read(SaveChasKot,KotChas[i]);
Inc(i);
end;
CloseFile(SaveChasKot);
ImChas.Canvas.MoveTo(intVrChas[1], 500-KotChas[1]);
for i:=1 to length(intVrChas)-1 do
begin
ImChas.Visible:=True;
Canvas.Pen.Color:=ClRed;
ImChas.Canvas.LineTo(intVrChas[i], 500-KotChas[i]);
end;
procedure TFmEURUSD.ButLoadInrVrChasYesClick(Sender: TObject);
begin
AssignFile(SaveIntVrChas,'D:\sim\Программирование\Delhpi\Проект\Основная\EUR_USD_Chas_IntVr.txt');
Reset(SaveIntVrChas);
while not Eof(SaveIntVrChas) do //читаем из файла....
begin
read(SaveIntVrChas,intVrChas[i]);
Inc(i);
end;
CloseFile(SaveIntVrChas);
z:=IntVrChas[1];
// Для проверки
Edit2.Text:=IntToStr(intVrChas[1]);
Edit3.Text:=IntToStr(intVrChas[2]);
Edit4.Text:=IntToStr(intVrChas[3]);
end;Почему- то вторая процедура не выполняется, при чем вне зависимости от очередности, т.е. если начать со второй - она работает, но не работает первая... только при повторных кликах, и, почему-то рисует черным????? Подскажите, что я не так делаю??? Последний раз редактировалось Admin, 23.09.2010 в 21:42. |
|
#4
|
|||
|
|||
|
Почему рисует черным - понятно. Ты обращаешься к Canvas формы. а рисуешь на имадже. Надо так: Image1.Canvas.Pen.Color:=ClRed;
по поводу выполняется/невыполняется... а кто ее вызывает-то? При щелчке по кнопке вызывается ее, и ТОЛЬКО ЕЕ обработчик. Все. Если хочешь вызвать еще - пиши в нужном обработчике нужный вызов. |
|
#5
|
|||
|
|||
|
Нажимаю на первую кнопку - данные загружаются, все нормально. Нажимаю на вторую - в результате нули...? Если сначала нажимаю на вторую, то результат обратный... Вообще какой-то гон...
За цвет спасибо... Впарился ![]() |
|
#6
|
|||
|
|||
|
м-м-м...
устанавливай начальное значение I внутри процедур. Вообще, счетчик лучше сделать локальным. А вообще, диагностировать не видя всего кода (особенно, если сразу видно, что он зависит от чего-то, что в приведенном куске просто отсутсвует) довольно тяжело... |
|
#7
|
|||
|
|||
|
Спасибо огромное, помогло, а то я набуровил с одной I и ничего не получается...
![]() |
|
#8
|
|||
|
|||
|
Код:
// сохраняем данные средней скользящей begin AssignFile(SavessChas,'D:\sim\Программирование\Delhpi\Проект\Основная\save\EUR_USD_ssChas_IntVr.txt'); Rewrite(SavessChas); for srschas:=0 to 500 do //пишем в файл... write(SavessChas,ssChas[srschas]); Reset(SavessChas); CloseFile(SavessChas); srschas:=0; end; // сохраняем данные для MACD begin AssignFile(SaveMacdChas,'D:\sim\Программирование\Delhpi\Проект\Основная\save\EUR_USD_MacdChas_IntVr.txt'); Rewrite(SaveMacdChas); for macdchas:=0 to 500 do //пишем в файл... write(SaveMacdChas,MacdCh[macdchas]); Reset(SaveMacdChas); CloseFile(SaveMacdChas); macdchas:=0; end; Подскажите, почему второй оператор вставляет постоянно 10 пустых значений в начало??? При этом первый работает нормально, как и третий (такой-же)... |
|
#9
|
|||
|
|||
|
Перед сохранением все значения присутствуют...
|
|
#10
|
||||
|
||||
|
А на кой вы после создания файла и записи в него данных, снова его пытаетесь открыть?
![]() А почему пустые значения пишутся без окончательного кода программы трудно сказать. Последний раз редактировалось Страдалецъ, 26.09.2010 в 18:05. |
|
#11
|
|||
|
|||
|
Сохраняю, закрываю прогу, открываю и загружаю...
|