Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2012, 16:50   #1
anthonyk
Пользователь
 
Регистрация: 15.12.2012
Сообщений: 18
По умолчанию Построение графика по заданным точкам Delphi

Здравствуйте!

Я новичок в делфи и вообще в программировании. Скажу даже больше - я учусь в лингвистическом вузе (об этом я как-то писал в другой теме), но так случилось, что нужно изучать делфи.

Я должен решить следующую задачу:

Цитата:
Даны целые числа t1, t2, ..., t21. Последовательность значений t1, t2, ..., t21 задаёт график температур за март. Построить график температур. Отрезки прямых, лежащих выше горизонтальной прямой, соответствующей нулевой температуре, и лежащие ниже этой прямой, должны быть окрашены в разные цвета.
Я не прошу вас решить мне задачу, я прошу подсказать, как мне ее решить. Дать хотя бы какой-нибудь намек.

К сожалению, я даже не знаю с чего начать, поэтому кода нет совсем. Но, насколько я понял, мне необходимо задать массив значений, например от -10 до 10 (это будет температура, всего будет 21 значение), затем надо сделать так, чтобы каждому значению соответствовала определенная точка в поле построения графика (думаю, что можно использовать для этого компонент Image).

Подскажите, пожалуйста, как можно реализовать такую задачу? Какие функции можно использовать?

Буду благодарен за любую помощь!
anthonyk вне форума Ответить с цитированием
Старый 17.12.2012, 18:18   #2
Om1cr0n
 
Регистрация: 08.08.2010
Сообщений: 3
По умолчанию

Самое простое что пришло в голову: генерируется 21 значение 0-60 (значения неравны температурам), затем рисуется график и все что ниже 101 пикселя по вертикали закрашивается синим, а все что выше 99 пикселя закрашивается красным.

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  t : array[1..21] of Integer;
  i,x,y : Integer;
begin
  Image1.Canvas.MoveTo(0,100);
  Image1.Canvas.LineTo(210,100);
  Randomize();
  t[1]:= Random(60);
  Image1.Canvas.MoveTo(0,t[1]*3);
  for i:=2 to 21 do
  begin
    t[i]:= Random(60);
    Image1.Canvas.LineTo(i*10,t[i]*3);
  end;
  for y:=0 to 99 do
    for x:=0 to 210 do
     begin
      if Image1.Canvas.Pixels[x,y] = clBlack then
          Image1.Canvas.Pixels[x,y] := clRed;
     end;

  for y:=101 to 200 do
    for x:=0 to 210 do
     begin
      if Image1.Canvas.Pixels[x,y] = clBlack then
          Image1.Canvas.Pixels[x,y] := clBlue;
     end;
  Image1.Canvas.TextOut(30,0,'График температур');
end;
Om1cr0n вне форума Ответить с цитированием
Старый 17.12.2012, 19:01   #3
anthonyk
Пользователь
 
Регистрация: 15.12.2012
Сообщений: 18
По умолчанию

Спасибо, Om1cr0n, большое за помощь!

Я бы хотел только уточнить из кода

Код:
Image1.Canvas.MoveTo(0,t[1]*3);
и
Код:
Image1.Canvas.LineTo(i*10,t[i]*3);
что означает t[1]*3 и t[i]*3 ?
anthonyk вне форума Ответить с цитированием
Старый 17.12.2012, 19:09   #4
Om1cr0n
 
Регистрация: 08.08.2010
Сообщений: 3
По умолчанию

График строится по координатам Х(ширина) и Y(Высота), данный код просто растягивает график по высоте.
Om1cr0n вне форума Ответить с цитированием
Старый 17.12.2012, 19:14   #5
anthonyk
Пользователь
 
Регистрация: 15.12.2012
Сообщений: 18
По умолчанию

Понял. Спасибо большое!
anthonyk вне форума Ответить с цитированием
Старый 26.12.2012, 12:45   #6
anthonyk
Пользователь
 
Регистрация: 15.12.2012
Сообщений: 18
По умолчанию

Если график строить не по случайным значениям, а по значениям из строки.
Мы создаем Edit там у нас будет 21 число-температура с '+', если положительная и '-' если отрицательная и нулевая. Например, строка будет такая '-1,+2,+5,+6,+1,0,0,-1,-6,+1'.

Значит если мы строим график на Image, и наша нулевая линия находится на 30 пикселе, значит нам надо прибавлять или отнимать наше значение от 30. Я правильно понимаю? Добавляя наши значения из строки в массив.

Подскажите, пожалуйста, как правильно это реализовать.

Вот, что получилось
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  t:array[1..21] of integer;
  i,k,n,x,y:integer;
  s:string;

begin
s:=Edit1.Text;
n:=length(s);

For i:=1 to n do
  If (s[i]=',') and (s[i-2]='-') then
  t[i]:=30-StrToInt(s[i-1]) else
  t[i]:=30+StrToInt(s[i-1]);

  with Canvas do
  Image1.Canvas.MoveTo(0,30);
  Image1.Canvas.LineTo(210,30);

  t[1]:=s[1];
  Image1.Canvas.MoveTo(0,t[1]);
  for i:=1 to 21 do
  begin
    t[i]:= s[i];
    Image1.Canvas.LineTo(i*10,t[i]);
  end;

  for y:=0 to 29 do
    for x:=0 to 210 do
     begin
      if Image1.Canvas.Pixels[x,y]=clBlack then
          Image1.Canvas.Pixels[x,y]:=clRed;
     end;

  for y:=31 to 60 do
    for x:=0 to 210 do
     begin
      if Image1.Canvas.Pixels[x,y]=clBlack then
          Image1.Canvas.Pixels[x,y]:=clBlue;
     end;

end;


procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Canvas.FillRect(ClientRect);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Canvas.FillRect(ClientRect);
end;


end.
Еще не совсем понятно, как загнать значение из строки в массив и дальше начать работать уже с массивом.

Последний раз редактировалось anthonyk; 26.12.2012 в 12:51.
anthonyk вне форума Ответить с цитированием
Старый 26.12.2012, 12:58   #7
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Мы создаем Edit
Лучше использовать все-таки Stringgrid
Цитата:
наша нулевая линия находится на 30 пикселе, значит нам надо прибавлять или отнимать наше значение от 30
верно
1 замечание
лучше все таки использовать масштаб:
то есть высоту image делить на разницу между максимумом и минимумом и получать шаг dy
аналогично и с dx:=image1.clientwidth div 21;
Цитата:
Image1.Canvas.LineTo(i*dx,t[i]*dy);
и график будет красивее и при смене размера формы/image - получите масштабирование

и y0 - задать переменной
чтобы в случае чего легко было менять одно значение, а не перелопачивать весь код
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 26.12.2012, 13:03   #8
anthonyk
Пользователь
 
Регистрация: 15.12.2012
Сообщений: 18
По умолчанию

Спасибо. Сейчас попробую сделать.
anthonyk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
построение графика по точкам Delphi Ilya_L Помощь студентам 1 22.11.2010 13:56
График по заданным точкам Dim2 Общие вопросы по Java, Java SE, Kotlin 6 20.05.2010 12:29
построение окружности по 3 точкам в Delphi ксона Помощь студентам 16 12.12.2009 17:14
Си++ Эллипс по заданным точкам serg777321 Помощь студентам 1 25.05.2009 11:58
В паскале написать программу которая по заданным точкам рисовала многоугольник. Anton1997 Паскаль, Turbo Pascal, PascalABC.NET 1 30.11.2008 19:26