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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.09.2010, 02:59
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию график на основе данных массивов

Подскажите как построить график имея два массива а и в, где массив а - ось Х, а в - Y. Нарисовать надо канвой на Image.
Заранее благодарен!!!
Ответить с цитированием
  #2  
Старый 22.09.2010, 05:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Как-то примерно так:
Код:
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  
Старый 23.09.2010, 20:26
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию

Все намного проще (на мой взгляд) .. Длинна массивов 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: Пользуемся тегами!

Почему- то вторая процедура не выполняется, при чем вне зависимости от очередности, т.е. если начать со второй - она работает, но не работает первая... только при повторных кликах, и, почему-то рисует черным?????

Подскажите, что я не так делаю???

Последний раз редактировалось Admin, 23.09.2010 в 21:42.
Ответить с цитированием
  #4  
Старый 23.09.2010, 23:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Почему рисует черным - понятно. Ты обращаешься к Canvas формы. а рисуешь на имадже. Надо так: Image1.Canvas.Pen.Color:=ClRed;

по поводу выполняется/невыполняется...
а кто ее вызывает-то? При щелчке по кнопке вызывается ее, и ТОЛЬКО ЕЕ обработчик. Все. Если хочешь вызвать еще - пиши в нужном обработчике нужный вызов.
Ответить с цитированием
  #5  
Старый 24.09.2010, 01:17
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию

Нажимаю на первую кнопку - данные загружаются, все нормально. Нажимаю на вторую - в результате нули...? Если сначала нажимаю на вторую, то результат обратный... Вообще какой-то гон...

За цвет спасибо... Впарился
Ответить с цитированием
  #6  
Старый 24.09.2010, 01:57
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

м-м-м...
устанавливай начальное значение I внутри процедур. Вообще, счетчик лучше сделать локальным.

А вообще, диагностировать не видя всего кода (особенно, если сразу видно, что он зависит от чего-то, что в приведенном куске просто отсутсвует) довольно тяжело...
Ответить с цитированием
  #7  
Старый 25.09.2010, 17:05
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию

Спасибо огромное, помогло, а то я набуровил с одной I и ничего не получается...
Ответить с цитированием
  #8  
Старый 26.09.2010, 17:32
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию

Код:
// сохраняем данные средней скользящей
 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  
Старый 26.09.2010, 17:40
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию

Перед сохранением все значения присутствуют...
Ответить с цитированием
  #10  
Старый 26.09.2010, 18:02
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А на кой вы после создания файла и записи в него данных, снова его пытаетесь открыть?
А почему пустые значения пишутся без окончательного кода программы трудно сказать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 26.09.2010 в 18:05.
Ответить с цитированием
  #11  
Старый 26.09.2010, 18:22
Дмитрий Стариков Дмитрий Стариков вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 7
Репутация: 10
По умолчанию

Сохраняю, закрываю прогу, открываю и загружаю...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter