| 
| 
 | Вопрос # 6 522/ вопрос открыт / | 
 |  Здравствуйте! Уважемые эксперты!Есть три линии в фале 1.bmp. Как можно праивльно написать условие, чтобы програ распазнала эти три отдельные линии и вевыла их координаты в Мемо.
 Line 1
 1,  610
 1,  609 и т.д, потом
 Line 2
 координаты
 Line 3
 координаты.
 У меня закрашивает все подраяд как одну линию и координаты все подряд без разделений линий.
 procedure TForm1.Button1Click(Sender: TObject);
 var i,j,n,x,y:integer;
 a:array of TPoint; //N точек
 begin
 with Image1.Canvas do
 begin
 n:=0;
 for i:=1 to Height do
 for j:=1 to Width do
 if Pixels[i,j]=clRed then
 begin
 Memo1.Lines.Add(IntToStr(i)+ ',  '+IntToStr(Height-j));
 n:=n+1;
 setlength(a,n);
 a[n-1].x:=i;
 a[n-1].y:=j;
 end;
 
 
 MoveTo(a[0].x,a[0].y);
 for i:=1 to  n-1 do
 LineTo(a[i].x,a[i].y);
 end;
 end;
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: senyor (статус: Посетитель)Вопрос отправлен: 11 марта 2014, 14:04
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 13 марта 2014, 20:21; участников в обсуждении: 2. 
|   | min@y™ (статус: Доктор наук), 11 марта 2014, 16:07 [#1]:Что значит "распознавать линии"? Сформулируй, плиз, по-русски. Допустим, на входе алгоритма есть bitmap, цвет его фона и/или цвет линий (отрезков), координаты начал и концов которых надо найти. Как это должно выглядеть на практике? И как алгоритм должен обработать, к примеру, вот такие картинки: 
   Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | senyor (статус: Посетитель), 11 марта 2014, 16:57 [#2]:Цвет фона белый, цвет линий красный,(больше цветов нету). координаты пикселей красного цвета которые выводится в Мемо, должны идти в порядке очереди, т.е. прог. сначала нашла первый красный пиксель, потом второй красный пиксель рядом стоящий на растоянии одного пикселя, третий и т.д. пока цвет пикселя не станет белым. (т.е. конец первой линии), потом надо чтобы мемо появилась пустая строка отделяющая, координаты первой линии от второй, и заново запустить цикл для второй линии. Немогу написать такой цикл? |  
|   | min@y™ (статус: Доктор наук), 11 марта 2014, 18:46 [#3]: Цитата (senyor): Цвет фона белый, цвет линий красный,(больше цветов нету) А толщина линий? А их пересечение? А кривизна?
 Как алгоритм должен сработать вот в таких ситуациях, например?
 
 
  
 
 Цитата (senyor): координаты пикселей красного цвета которые выводится в Мемо Да погоди ты про вывод! Главное - алгоритм вычисления начала и конца линии.
 
 Цитата (senyor): Немогу написать такой цикл?  Это вопрос?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | senyor (статус: Посетитель), 11 марта 2014, 19:51 [#4]:Там прикреплен файл 1.bmp Толщина линий примерно 2 пикселя. Пересечений между линиями не бывает. Попробуйте вставьте мой код вставить в Дельфи и открыт рисунок 1.bmp, через application.ProcessMessages там увидите как считывается каждый пиксель длинной линии и потом он резко переходит на паралельнную линию которая идет выше и получается все это одна сплошная линия, а насчет алгоритма я вот пытался так условие прописать: но ничего не получается больше подходит к концу линии, а не к середине
 if (Pixels[i-1,j-1]) and (Pixels[i-1,j]) and (Pixels[i+1,j-1]) and
 (Pixels[i,j+1]) and
 (Pixels[i-1,j+1]) and (Pixels[i,j+1]) and (Pixels[i+1,j+1]) = clWhite then
 |  
|   | min@y™ (статус: Доктор наук), 11 марта 2014, 20:31 [#5]: Цитата (senyor): Там прикреплен файл 1.bmp Вижу. В нём 3 кривых отрезка.
 
 Цитата (senyor): Толщина линий примерно 2 пикселя. ЩИТО? Моя твоя не понимай, однако!
 
 Цитата (senyor): Пересечений между линиями не бывает. А как программа должна отреагировать, если ей ей подсунуть картинку с ошибкой?
 
 Цитата (senyor): Попробуйте вставьте мой код вставить в Дельфи И не подумаю. Оно мне надо? И невооружённым глазом косяки видны сразу:
 
 procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, n, x, y: integer;
  a: array of TPoint; // N точек
begin
  with Image1.Canvas do
    begin
      n:= 0;
 
      for i:= 1 to Height do    // Width и Height - свойства какого объекта-то?
        for j:= 1 to Width do   // i и j не с нуля до Z - 1, айяйяй, как нехорошо!
          if Pixels[i, j] = clRed // Не забывай, что i - это № столбца, а y - строки (перепутал местами).
            then begin
                   Memo1.Lines.Add(IntToStr(i) + ', ' + IntToStr(Height - j));
                   n:= n + 1;
                   SetLength(a, n); // Height · Width перераспределений памяти! НАХРЕНА?
                   a[n - 1].x:= i;
                   a[n - 1].y:= j;
                 end;
 
      // Отрисовка отрезков между найденными точками на том же Canvas тем же цветов. НАХРЕНА?
      // Посмотрел бы для начала количество найденных точек.
      MoveTo(a[0].x, a[0].y);
      for i:= 1 to n - 1 do
        LineTo(a[i].x, a[i].y);
    end; // with
end;Цитата (senyor): а насчет алгоритма я вот пытался так условие прописать: но ничего не получается больше подходит к концу линии, а не к середине if (Pixels[i-1,j-1]) and (Pixels[i-1,j]) and (Pixels[i+1,j-1]) and (Pixels[i,j+1]) and (Pixels[i-1,j+1]) and (Pixels[i,j+1]) and (Pixels[i+1,j+1]) = clWhite then  Я просил набросать примерный алгоритм, а не код. Напиши просто по-русски, чего ты хочешь от программы. Только потом можно будет писать код и отлаживать его.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | senyor (статус: Посетитель), 11 марта 2014, 21:04 [#6]:надо так, чтобы отрисовка была сначала одной линии, потом другой и координты в мемо выдавал сначала одной линии потом другой, если сможешь, просьба помоги с кодом для меня трудно |  
|   | min@y™ (статус: Доктор наук), 11 марта 2014, 21:52 [#7]: Цитата (senyor): надо так, чтобы отрисовка была сначала одной линии, потом другой Допустим. Тут надо применить что вроде волнового алгоритма: нашёл красную точку и двигаешься от неё по всем направлениям (а не просто простым квадратно-гнездовым перебором).
 
 Цитата (senyor): если сможешь, просьба помоги с кодом Я тебя научить пытаюсь. Сначала надо представить себе (разработать) алгоритм, по которому затем писать код.
 А "помоги с кодом" - это "напиши программу за меня", да? Это можно. Только у тебя в голове ничего не останется.
 
 Вообще, откуда такая задача взялась-то? Как и кем её решение будет использоваться на практике?
 
 Запрсы авторизации в ICQ не принимаю. Присылай сообщения.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | senyor (статус: Посетитель), 11 марта 2014, 21:59 [#8]:давай в skype напишу тебе объясню все подробно, мой ник Erlan19772 или в аське тебе вроде запрос отправил я аську впревый раз пользуюсь |  
|   | min@y™ (статус: Доктор наук), 11 марта 2014, 22:03 [#9]: Цитата (senyor): давай в skype напишу тебе объясню все подробно Не, скайп я редко юзаю. И разговариваю только с сильно знакомыми людьми. В аську!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 13 марта 2014, 20:21 [#10]: 
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |