Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
1

Canvas. Отрисовка заданного количества вертикальных линий с определенным шагом

03.11.2013, 22:32. Показов 3515. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите разобраться с проблемой. Есть таблица StringGrid1. В ней будет определенное количество строк. Каждый раз разное. К примеру 10 записей. Необходимо отрисовать графически промежутки между этим количеством строк. Если записей 10, то соответственно промежутков между ними на 1 меньше (9 шт).
Я сначала получаю количество участков с таблицы:
Delphi
1
k:=Form1.StringGrid1.RowCount-2;
Затем получаю пропорциональное расстояние, на каком будут эти разделители отрисовываться на Image1:
Delphi
1
l:=Image1.Width/k;
На канве рисую сначала горизонтальные линии: верх и низ, начало, конец. Затем необходимо нарисовать начиная с начала координат гор. линий - вертикальные. Их высота 40 пикселей. количество промежутков между верт линиями = количеству промежутков между записями в таблице.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TUklonForm.BitBtn1Click(Sender: TObject);
var
k:integer;
l:extended;
begin
k:=Form1.StringGrid1.RowCount-2;
l:=Image1.Width/k;
//меняем цвет линии
Image1.Canvas.Pen.Color:=clRed;
//меняем толщину линии
Image1.Canvas.Pen.Width:=2;
//чертим линию
//гор верх
Image1.Canvas.MoveTo(10,50);
Image1.Canvas.LineTo(Image1.Width-10,50);
 //гор низ
Image1.Canvas.MoveTo(10,90);
Image1.Canvas.LineTo(Image1.Width-10,90);
 //верт первая
Image1.Canvas.MoveTo(10,50);
Image1.Canvas.LineTo(10,90);
   //верт последняя
 Image1.Canvas.MoveTo(Image1.Width-10,50);
Image1.Canvas.LineTo(Image1.Width-10,90);
end;
Благодарю всех кто поможет!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2013, 22:32
Ответы с готовыми решениями:

Прямоугольная решетка из n горизонтальных и m вертикальных линий
Здравствуйте. Помогите пожалуйста решить такую задачу: Поместите на форму два компонента...

Прорисовка вертикальных линий на видимой части графика
Добрый вечер! Имеется некоторая функция, которая минимизируется с помощью алгоритма Фибоначчи....

Можно ли создать гистограмму без вертикальных линий?
Можно ли в Матлабе создать гистограмму без вертикальных линий: как на примере? Как? второй...

Изобразить на экране компьютера решётку, состоящую из n вертикальных и m горизонтальных линий
Изобразить на экране компьютера решётку, состоящую из n вертикальных и m горизонтальных линий....

14
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
04.11.2013, 11:43  [ТС] 2
Вот картинка для наглядности
Миниатюры
Canvas. Отрисовка заданного количества вертикальных линий с определенным шагом  
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
04.11.2013, 13:07 3
А в чём проблема-то? Отрисовать вертикальные линии с определённым шагом? Так пройдитесь циклом, к примеру так:

Delphi
1
2
3
4
5
for i:=0 to k-1 do
begin
Image1.Canvas.MoveTo(i*l, 0);
Image1.Canvas.LineTo(i*l, 40);
end;
Если честно, постановка задачи не совсем ясна.
0
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
04.11.2013, 23:14  [ТС] 4
Вот такая задача и есть. Спасибо! Но есть проблема при умножении i*l:
i:integer;
l:extended;
Если при умножении округлить trunc(l), то сбивается сам промежуток.
0
angstrom
04.11.2013, 23:17 5
Цитата Сообщение от Softvok Посмотреть сообщение
Если при умножении округлить trunc(l)
Round, Ceil, Floor - выбирай по вкусу.
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
04.11.2013, 23:41  [ТС] 6
Благодарю. Округляя с помощью Round, Ceil, Floor - я теряю (или же добавляю) доли этих самых пикселей. вроде как 0,5 пикселей немного, но если участков 30, то 0,5*30=15. Итого накапливается потеря 15 пикселей.
0
120 / 110 / 19
Регистрация: 04.11.2013
Сообщений: 471
04.11.2013, 23:44 7
Цитата Сообщение от Softvok Посмотреть сообщение
Итого накапливается потеря 15 пикселей.
Ничего там не накапливается, поверьте. Просто длина некоторых промежутков будет +/-1.
0
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
05.11.2013, 00:52  [ТС] 8
Запутался я наверное. Все равно не выходит путное.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TUklonForm.BitBtn1Click(Sender: TObject);
var
i,k:integer;
l:extended;
begin
k:=Form1.StringGrid1.RowCount-2;
l:=(Image1.Width-20)/k;
//меняем цвет линии
Image1.Canvas.Pen.Color:=clBlack;
//меняем толщину линии
Image1.Canvas.Pen.Width:=1;
//рисуем вертикальные линии
for i:=0 to k-1 do
begin
Image1.Canvas.MoveTo((i*Ceil(l))+10, 140);
Image1.Canvas.LineTo((i*Ceil(l))+10, 180);
end;
//чертим линию
//гор верх
Image1.Canvas.MoveTo(10,140);
Image1.Canvas.LineTo(Image1.Width-10,140);
 //гор низ
Image1.Canvas.MoveTo(10,180);
Image1.Canvas.LineTo(Image1.Width-10,180);
end;
В итоге получается такая вот картинка(13 участков):
Миниатюры
Canvas. Отрисовка заданного количества вертикальных линий с определенным шагом  
0
angstrom
05.11.2013, 00:58 9
Участков 13, но линий 14.
Delphi
1
2
3
4
5
for i := 0 to k do
begin
  Image1.Canvas.MoveTo((i * Ceil(l)) + 10, 140);
  Image1.Canvas.LineTo((i * Ceil(l)) + 10, 180);
end;
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
05.11.2013, 01:17  [ТС] 10
Да, пробовал и такое. Помогает при 14 линиях. Но при 22 линиях и for i := 0 to k do выходит:
Миниатюры
Canvas. Отрисовка заданного количества вертикальных линий с определенным шагом  
0
angstrom
05.11.2013, 01:34 11
А так, рисование на канве формы (без TImage)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.Button4Click(Sender: TObject);
var
  I, K : Integer;
  L : Extended;
begin
  K := StringGrid1.RowCount - 2;
  L := (ClientWidth - 20) / k;
  // меняем цвет линии
  Canvas.Pen.Color := clBlack;
  // меняем толщину линии
  Canvas.Pen.Width := 1;
  // рисуем вертикальные линии
  for I := 0 to k do
  begin
    Canvas.MoveTo((I * Round(L)) + 10, 140);
    Canvas.LineTo((I * Round(L)) + 10, 180);
  end;
  // чертим линию
  // гор верх
  Canvas.MoveTo(10, 140);
  Canvas.LineTo(Round(L * K), 140);
  // гор низ
  Canvas.MoveTo(10, 180);
  Canvas.LineTo(Round(L * K), 180);
end;
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
05.11.2013, 02:07  [ТС] 12
А так отлично, только в конце еле заметный пиксель или два пустоты. И отчего же на TImage не получается нормально, а на форме почти что отлично?
Миниатюры
Canvas. Отрисовка заданного количества вертикальных линий с определенным шагом  
0
angstrom
05.11.2013, 02:12 13
И на TImage будет так же, мне лень было на форму кидать.
Пустота из-за того, что
Delphi
1
    Canvas.LineTo((I * Round(L)) + 10, 180);
The LineTo function draws a line from the current position up to, but not including, the specified point.
исправь на
Delphi
1
    Canvas.LineTo((I * Round(L)) + 10, 181);
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
05.11.2013, 02:29  [ТС] 14
Благодарю) Насчет 180 на 181 - не совсем понял, ведь это будет координата по игреку, то есть вертикали. А пустой пиксель вылазит по горизонтали. Утром уже буду разбираться дальше)
0
angstrom
05.11.2013, 02:32 15
Когда указывается 180, реально рисуется до 179. Не хочешь по Y, исправь по X
Delphi
1
Canvas.LineTo(Round(L * K), 181);
05.11.2013, 02:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.11.2013, 02:32
Помогаю со студенческими работами здесь

Отображение вертикальных линий, соединяющих фигурные скобки в редакторе кода
В VS 2013 в C# можно то ли включить, то ли установить плагин, чтобы отображались вертикальные...

Нарисовать 10 разноцветных вертикальных линий отстоящих друг от друга на равном расстоянии
Нарисовать 10 разноцветных вертикальных линий отстоящих друг от друга на равном расстоянии, причем...

Нарисовать 10 разноцветных вертикальных линий отстоящих друг от друга на равном расстоянии
Нарисовать 10 разноцветных вертикальных линий отстоящих друг от друга на равном расстоянии, причем...

Написать программу рисования в текстовом режиме вертикальных и горизонтальных линий по нажатию соответствующих клавиш
написать программу рисования в текстовом режиме вертикальных и горизонтальных линий по нажатию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru