|
Вопрос # 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]:
Я то и искал реализации этих алгоритмов, но не нашёл...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|