| 
| 
 | Вопрос # 4 596/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Помогите, пожалуйста решить следующую задачу. Необходимо программно определить координаты крайних точек объекта на изображении (цвет - отличный от белого фона) относительно начала координат, заданной
 x - координатой левой нижней точкой, y - верхней правой
 (по аналогии нач. координат - правый верхний угол, правый нижний угол, левый верхний угол, левый нижний угол)
 Пример прикреплён. Заранее благодарен!
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: Free (статус: Посетитель)Вопрос отправлен: 21 сентября 2010, 16:15
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 22 сентября 2010, 16:13; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 21 сентября 2010, 16:47 [#1]:У Вас на листике готовый алгоритм   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Free (статус: Посетитель), 21 сентября 2010, 16:55 [#2]:Я уже долгое время пытаюсь сделать реализацию, однако алгоритм работает либо недостаточно быстро, либо пропускает точки. Прошу помочь с реализацией. |  
|   | Егор (статус: 10-ый класс), 21 сентября 2010, 17:12 [#3]: Цитата (Free): Я уже долгое время пытаюсь сделать реализацию где код? посмотрим, скажем, где ошибки
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Free (статус: Посетитель), 21 сентября 2010, 17:17 [#4]:Вот фрагмент старой версии кода. Ошибок здесь очень много, вдобавок он абсолютно нерабочий, поэтому-то и легче заново его написать...
 
 var
 Y,X,
 _x,_y,_y_x,
 Count: Integer;
 FirstX,FirstY: Boolean;
 PointX,PointY: array [1..10000] of integer;
 begin
 Image1.Canvas.Brush.Color := clBlack;
 Image1.Canvas.Rectangle(0,0,10,12);
 Count:=0;
 FirstX  := true;
 FirstY  := true;
 _x:=0;
 _y:=0;
 _y_x:=0;
 for Y := 0 to Image1.Height do begin
 for X := 0 to Image1.Width do
 if Image1.Canvas.Pixels[X,Y] <> clWhite then begin
 if FirstX  = true then begin
 if FirstY  = true then begin   ///Здесь - то и начинаются ошибки
  FirstX := false;         // Только если по x и y - первая
 FirstY := false;
 inc(Count);
 PointX[Count]:=X+1;        // Координаты первой по X и Y
 PointY[Count]:=Y+1;
 end else
 begin
 FirstX := false;
 _y:=y;               // Координаты возможной последней по Y
 _y_x:=x;
 end;
 end else _x:=x;            // Координаты возможной последней по X
 end;   // Координата по x
 if _x <> 0 then
 begin
 inc(Count);
 PointX[Count]:=_x+1;  // Последняя координата по X
 PointY[Count]:=Y+1;
 FirstX  := true;
 _x:=0;
 end;
 end;
 if _y <> 0 then
 PointX[Count]:=_y_x+1;  // Последняя координата по Y
 PointY[Count]:=_Y+1;
 
 end;
 |  
|   | Вадим К (статус: Академик), 21 сентября 2010, 17:22 [#5]:меня строка if FirstX = true then begin
 уже наводит на грусть. тут две ошибки по дизайну.
 
 в целом, алгоритм то в общем простой. представьте себе вертикальную линию, которая передвигается слева на право. пока в ней все точки белые, идем дальше. Как только нашли хотя бы одну черную - стоп. теперь ещё три линии - справа, сверху и снизу.
 В результате получим прямоугольник, где находиться заданная фигура.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Free (статус: Посетитель), 21 сентября 2010, 17:46 [#6]:Дело в том, что нужны конкретные координаты точек фигуры, учитывая то, что по оси x,y их может быть несколько, а начало координат - так же переменная величина. Пожалуйста, приведите программную реализацию!!! |  
|   | Вадим К (статус: Академик), 21 сентября 2010, 17:51 [#7]:тогда наверно нужно формулировать вопрос так "координаты прямых, которые составляют фигуру"? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Free (статус: Посетитель), 21 сентября 2010, 17:54 [#8]:Ну, в таком случае - координаты начала\конца прямых, которые составляют фигуру. |  
|   | Free (статус: Посетитель), 22 сентября 2010, 16:13 [#11]:Я то и искал реализации этих алгоритмов, но не нашёл... |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |