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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2016, 10:04   #1
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
Восклицание Массив точек нарисованной линии

Всем Привет!

Возможно ошибся разделом...

Рисую на канве линию
Код:
      PaintBox1.Canvas.Pen.Color := clGreen;
      PaintBox1.Canvas.Pen.Width := 3;
      PaintBox1.Canvas.MoveTo(0,0);
      PaintBox1.Canvas.LineTo(55,155);
как получить весь массив точек которые "входят" в линию?

P.S. На канве может быть несколько пересекающихся (иметь общуюю точку А) линий с одинаковым цветом
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 16.08.2016 в 10:13.
spirit-ua вне форума Ответить с цитированием
Старый 16.08.2016, 10:14   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
как получить весь массив точек которые "входят" в линию?
никак.

Если не нравится - рисуйте линию по точкам (см. например, Алгоритм Брезенхэма) и сохраняйте их в нужный Вам массив.

или (лучше) меняйте логику задачи. (я, например, не могу даже предположить, зачем может понадобится подобный массив точек).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.08.2016, 10:22   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А найти точку пересечения по уравнениям двух прямых ни как?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.08.2016, 12:03   #4
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

побродив по просторах инета и данного форума слепил в кучу
Код:
var
    x1,x2,y1,y2,dx,dy,s1,s2,x,y,o,i,v,obmen   : integer;
begin
  x1:=25;
  y1:=115;
  x2:=255;
  y2:=25;
  x:=x1;
  y:=y1;
  dx:=(abs(x2-x1));
  dy:=(abs(y2-y1));
  if (x2-x1)<=0 then s1:=-1 else s1:=1;
  if (y2-y1)<=0 then s2:=-1 else s2:=1;
  if dy>dx then
  begin
    v:=dx;
    dx:=dy;
    dy:=v;
    obmen:=1;
  end
  else obmen:=0;
  o:=2*dy-dx;
  for i := 1 to dx do
  begin
    form1.Canvas.Pixels[x,y]:=clBlack;  // x,y - PIXEL ARRAY
    while o>=0 do
    begin
      if obmen=1 then
      x:=x+s1
      else
        y:=y+s2;
      o:=o-2*dx;
    end;
    if obmen=1 then y:=y+s2
    else x:=x+s1;  // ORIGINAL x:=x+x1;
    o:=o+2*dy;
  end;
  //form1.refresh;
  //self.Repaint; 
end;
может кому пригодится

но как быть с толщиной линии в 2,3..N пикселей? паралнльно рисовать еще одну линию со смещением по осях?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 16.08.2016, 12:17   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

spirit-ua, зачем Вам массив точек?

и, кстати, в данном коде Вы массив точек не формируете.
Так к чему эти танцы?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.08.2016, 12:38   #6
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
spirit-ua, зачем Вам массив точек
на счет массива может я и заганяюсь...
на канве нужно будет мышкой рисовать ломаную линию, т.е.
- клик 1 точка А
- клик 2 точка Б
...
- клик N точка N
- ESC (клик правой кнопкой) завершение рисования

таких линий будет много, так вот, нужно по клике правой кнопкой мыши на конкретную линию выполнить некое действие, например затереть, так вот чтобы определить что клик произошел именно по конкретной линии нужно иметь массив точек этой линии и дальше затереть именно эту линию, т.е. все точки которые "попадают" в эту линию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
spirit-uaи, кстати, в данном коде Вы массив точек не формируете.
в коде нет формирование массива
Код:
form1.Canvas.Pixels[x,y]:=clBlack;  // x,y - PIXEL ARRAY
в этой строке я просто добавил коммент что именно здесь можно собирать точки в массив

данный подход скорее всего неправильный но более простого решения не нашел, подскажите другие варианты
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 16.08.2016, 12:43   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Каждый отрезок держать как объект с информацией позволяющей отрисовать его. Плюс метод проверки - попадает ли заданные координаты на отрезок. При клике пробегаться по всем этим объектам и проверять
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.08.2016, 12:50   #8
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
держать как объект
объект?
можно поподробней? какая там должна быть инфа, точка А и Б явно не достаточно

а на чем отрисовывать и как поймать что клик именно по нему?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 16.08.2016 в 12:53.
spirit-ua вне форума Ответить с цитированием
Старый 16.08.2016, 13:34   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот забанили Миная, а он бы не только ответил на этот вопрос, но ещё бы и программку готовую красивую нарисовал. да ещё и с исходниками.
а пока попробуйте разобрать его примеры из этой темы - "Соединение кнопок между собой линией"

объекты в памяти и отображение их на экране - это разные задачи.
И правильный выбор сразу даст Вам кучу бонусов, начиная от возможности сделать откат (откатить последние действия), редактировать линии (изменять их позиции, характеристики и т.п.), удаление линий и ещё многое-многое другое.
Кстати, если вдруг не понимаете, о чём идёт речь, возьмите ЛЮБОЙ векторный редактор, поработайте с ним. Или, посмотрите видео, как с ним работать.
Поймёте, о чём идёт речь.

p.s. возможно, что Вам вся мощь и не нужна. Но структуру всё равно надо делать изначально корректную!

Цитата:
так вот чтобы определить что клик произошел именно по конкретной линии нужно иметь массив точек этой линии и дальше затереть именно эту линию, т.е. все точки которые "попадают" в эту линию
не надо иметь массив. достаточно иметь координаты начала и конца отрезка. и использовать процедуру, которая определяет расстояние от точки (куда кликнули) до отрезка (перебор всех отрезков, находите те, которые находятся менее(ближе), чем заданная чувствительность, от данной точки)

Последний раз редактировалось Serge_Bliznykov; 16.08.2016 в 13:37.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.08.2016, 13:44   #10
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
а пока попробуйте разобрать его примеры из этой темы - "Соединение кнопок между собой линией"
пробежался по теме, круто, но исходников нету чтоб посмотреть, все линки битые

все более-менне понятно, подозреваю что линия рисуется на канве и сохраняются координаты, при удалении просто перерысовыевается канва без удаленной линии, в правильную сторону думаю?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 16.08.2016 в 13:47.
spirit-ua вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стирание нарисованной линии. Ассемблер NevroZ Помощь студентам 7 14.06.2012 19:51
Задаnm n точек. Найти m=3,4... точек и построить на них m-угольник: количество точек , лежащих внутри и вне его мин. различается L.Rain Помощь студентам 0 11.12.2011 22:19
Массив Точек Alex_sim Общие вопросы .NET 0 15.06.2010 16:41
Массив точек Krezol Общие вопросы C/C++ 1 14.05.2010 14:56
начало второй нарисованной линии должно передвинутся к началу первой. Delphi maddamo4ka Помощь студентам 7 08.12.2008 19:19