Консультация № 34002
24.01.2006, 20:15
0.00 руб.
0 1 1
Здравствуйте уважаемые эксперты.

Есть некий массив PRD[i, j] содержащий "1" и "0" например:

Y
A
|00000000000000000000000000000
|00000011111111111110000011110
|00011111111111111111111111000
|00000001111111111111110000000
|00000000000110000111111110000
|00000000000000000001111111000
|00000000011111111111111110000
|00000000000111111111000000000
|00000000000001111000000000000
|00000000000000000000000000000
------------------------------->X

Впрос: Нужно найти массив координат границы области заданной "1",
причем чтобы эти координаты были последовательными, в конечном итоге нужно обрисовать эту область
ф-ей Polygon или Polyline, т.е. если координаты не будут упорядочены то изображение области получается
многкратно перечеркнуто.

Помогите люди добрые.

Обсуждение

Неизвестный
25.01.2006, 07:41
общий
это ответ
Здравствуйте, Юрий Смирнов!
В приложении я привожу приложение. Из input.txt в массив A считываются необходимые данные. В массив и выводится оболочка области. Я думаю нет необходимости упорядочивать координаты точек. Достаточно пробежаться по массиву b один раз (за n квадрат) и если соответствующий элемент массива равен 8 (число можно конечно же поменять), то окрасить точку в необходимый цвет (напрмер в чёрный: Canvas.Pixels[i,j]:=clblack). Это будет легче, чем искать координаты в порядке их следования в оболочке.
Если всё таки необходимо строить Polyline то можете поискать в поисковиках алгоритм построения выпуклой оболочки.

Приложение:
program Project1;{$APPTYPE CONSOLE}uses SysUtils;var a,b:array [1..100,1..100] of byte;x,y,i,j:integer;str:string;function Sosed(x,y:integer):integer;begin result:=0; if a[x-1,y]=1 then inc(result); if a[x+1,y]=1 then inc(result); if a[x,y-1]=1 then inc(result); if a[x,y+1]=1 then inc(result);end;begin assignfile(input,‘input.txt‘); assignfile(output,‘output.txt‘); y:=0; while not eof do begin readln(str); x:=length(str); inc(y); for i:=1 to length(str) do a[i,y]:=strtoint(str[i]); end; for i:=1 to y do for j:=1 to x do b[j,i]:=4 ; for i:=1 to y do for j:=1 to x do if a[j,i]=1 then if sosed(j,i)<4 then b[j,i]:=8 else b[j,i]:=1; for i:=1 to y do begin for j:=1 to x do write(b[j,i]); writeln; end;end.
Форма ответа