![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Все намного проще (на мой взгляд)
![]() Код:
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 внутри процедур. Вообще, счетчик лучше сделать локальным. А вообще, диагностировать не видя всего кода (особенно, если сразу видно, что он зависит от чего-то, что в приведенном куске просто отсутсвует) довольно тяжело... |