Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Помогите с алгоритмом   Найти похожие ветки 

 
Vasili Lubavin   (2012-02-21 12:42) [0]

Добрый день! Столкнулся с проблемой составления алгоритма прорисовки последовательной линии из массива.
Есть динамический массив mat[x][y]: real;

в него загружены определенные данные (результаты расчета зоны ограничения застройки ПКАЭМО 4.0) эти величины могут изменятся от 0 до определенной величины, причем если эта величина больше 1 то образуются некоторые замкнутые зоны различной формы,
мне необходимо найти и последовательно записать координаты точек перехода где эта величина изменяется с меньше 1 на 1 или больше единицы.

сам попробовал вот что вышло только работает коряво и обрисовывает только одну зону а зон может быть несколько даже в определенной зоне может быть еще одна зона перехода

Прошу вашего совета в написании данного алгоритма!


for ix:= 0 to n_x do
begin
   for iy:= 0 to n_y do
    begin
     if iy>0 then
//        if ((mat[ix][iy-1]<=1)and(mat[ix][iy]>=1))  or  ((mat[ix][iy]>=1)and(mat[ix][iy+1]<=1)) then
       if ((mat[ix][iy-1]<=1)and(mat[ix][iy]>=1))  then
       if b1 then kp1:=addMassKoord(kp1,form10.setPAC2D(x0+ix*dx,y0+iy*dy))
             else begin
                     b1:=true;
                     kp1[0]:=x0+ix*dx;
                     kp1[1]:=y0+iy*dy;

                  end;
{            with Acb1.addline(form10.setpac(x0+ix*dx,y0+iy*dy,0),form10.setpac(x0+ix*dx,y0+iy*dy,0)) do
           begin
             color:=acByBlock;
             Lineweight:=acLnWtByBlock;
           end;     }
  end;
end;



 
Омлет ©   (2012-02-21 13:21) [1]

Не понятно. Что за зоны? Дайте картинку и более развернутое описание.


 
MBo ©   (2012-02-21 13:41) [2]

подозреваю, что можно бинаризовать массив, и использовать алгоритмы обнаружения краёв http://homepages.inf.ed.ac.uk/rbf/HIPR2/featops.htm


 
AV ©   (2012-02-21 14:44) [3]

не понятно,..
какие зоны..

Вот, допустим, сгенерил матрицу
http://zalil.ru/32749485
как там должны быть зоны эти?


 
oldman ©   (2012-02-21 14:48) [4]


> if b1 then kp1:=addMassKoord(kp1,form10.setPAC2D(x0+ix*dx,
> y0+iy*dy))
>              else begin
>                      b1:=true;


А где возврат в false?


 
AV ©   (2012-02-21 14:49) [5]


> oldman ©   (21.02.12 14:48) [4]

это, так понял, просто флаг,
первый раз или нет попалось число


 
oldman ©   (2012-02-21 15:03) [6]


> AV ©   (21.02.12 14:49) [5]


Ага. И в зависимости от флага зависит значение kp1, которое на фиг не нужно, поскольку не участвует в дальнейшем алгоритме.
:)))


 
oldman ©   (2012-02-21 15:06) [7]


> if ((mat[ix][iy-1]<=1)and(mat[ix][iy]>=1))  or  ((mat[ix][iy]>=1)and(mat[ix][iy+1]<=1))
> then
>        if ((mat[ix][iy-1]<=1)and(mat[ix][iy]>=1))  then
>        if b1 then kp1:=addMassKoord(kp1,form10.setPAC2D(x0+ix*dx, y0+iy*dy))
>              else begin
>                      b1:=true;
>                      kp1[0]:=x0+ix*dx;
>                      kp1[1]:=y0+iy*dy;
>
>                   end;


А это на фига, если следующей строкой убивается?


 
AV ©   (2012-02-21 15:06) [8]

не, походу для

> addMassKoord

нужна вторая координата.

Первую запоминаем, вторую уже плюсуем к первой
kp1 - указатель на начало вершин. Массив линейный, скорее всего


 
oldman ©   (2012-02-21 15:08) [9]

Вообще, автор, видимо, любит if :)))


> for iy:= 0 to n_y do
>     begin
>      if iy>0 then


Мдя...


 
AV ©   (2012-02-21 15:09) [10]


> oldman ©   (21.02.12 15:08) [9]

ну это очевидно - что бы не проверять граничную точку, иначе выход может быть за диапазон


 
oldman ©   (2012-02-21 15:10) [11]


> AV ©   (21.02.12 15:06) [8]


А нельзя это сделать перед входом в цикл и не загромождать код ненужными проверками?


 
AV ©   (2012-02-21 15:11) [12]


> Вот, допустим, сгенерил матрицу
> http://zalil.ru/32749485

там кстати тоже не проверяю первые-последние, просто лень было проверку вставить.

Автор бы взял, да на той картинке в Painte тупо линии нарисовал / закрасил так, как нужно


 
AV ©   (2012-02-21 15:15) [13]


> А нельзя это сделать перед входом в цикл и не загромождать
> код ненужными проверками?

Нужно :)
Вообще, лучше, имхо, писать функцию. типа, GetAroundForPset(X,Y): boolean;
а там проверить всех соседей и вернуть true|false

потом просто
по x
по y
 if GetAroundForPset(X,Y) then добавить ее куда надо.

а в коде
if iy>0 then
[iy+1]<=1)) then
      if ((mat[ix][iy-1]<=1)and(mat[ix][iy]>=1))  then
      if b1 then kp1:=addMassKoord(kp1,form10.setPAC2D(x0+ix*dx,y0+iy*dy))

через три дня сам же и  не разберешься


 
AV ©   (2012-02-21 15:43) [14]

подозреваю, что автору надо вроде этого
http://zalil.ru/32749899


 
Vasili Lubavin   (2012-03-15 16:05) [15]

тут суть такая есть массив приверно такого типа

0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 0 0
0 0 1 0 0 0 0 0 0 1 0 0
0 0 1 0 2 2 2 2 0 1 0 0
0 0 1 0 2 0 0 2 0 1 0 0
0 0 1 0 2 0 0 2 0 1 0 0
0 0 1 0 2 2 2 2 0 1 0 0
0 0 1 0 0 0 0 0 0 1 0 0
0 0 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0

Кое где иногда эти значения есть больше 1

эти данные описывают некую зону по координатам Х и У
массив проверяю сверху вниз в двух циклах по столбикам сначала первый столбик потом второй и т д

если значене больше или равно 1 то мне надо запомнить эту позицию,
собственно составить последовательную линию для отрисовки в автокаде


 
Vasili Lubavin   (2012-03-15 16:13) [16]

procedure TForm12.makeAcadBlockZO(NrowASG2:integer);
var
 ix,iy : integer;
 acB1: IAcadBlock;
 NameBlock: string;
 Kp1: olevariant;
 b1: boolean;
begin
// &#207;&#238;&#241;&#235;&#229;&#228;&#238;&#226;&#224;&#242;&#229;&#235;&#252;&# 237;&#238;
loadmas(asg2.Cells[10,NrowASG2],NrowASG2-1);
NameBlock:=asg2.Cells[1,NrowASG2];
blockDEL(NameBlock);
acb1:=form1.AcadDocument1.Blocks.Add(form10.setPAC(0,0,0),NameBlock);
b1:=false;
kp1:=VarArrayCreate([0, 2], varDouble) ;
for ix:= 0 to n_x do
begin
   for iy:= 0 to n_y do
    begin
     if iy>0 then
       if ((mat[ix][iy-1]<=1)and(mat[ix][iy]>=1))  then
       if b1 then kp1:=addMassKoord(kp1,form10.setPAC2D(x0+ix*dx,y0+iy*dy))
             else begin
                     b1:=true;
                     kp1[0]:=x0+ix*dx;
                     kp1[1]:=y0+iy*dy;

                  end;
  end;
end;

           with Acb1.AddLightWeightPolyline(kp1)do
           begin
             color:=acByBlock;
             Lineweight:=acLnWtByBlock;
           end;

application.ProcessMessages;

end;



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.064 c
2-1341236271
>|<
2012-07-02 17:37
2013.03.22
Повторная загрузка изображения на форму, которая в DLL


15-1338741213
М
2012-06-03 20:33
2013.03.22
Личная информация.


4-1259049838
Evger
2009-11-24 11:03
2013.03.22
Как определить модальное окно


15-1346248538
tesseract
2012-08-29 17:55
2013.03.22
Пэйнтбол


2-1339501345
ostryak5
2012-06-12 15:42
2013.03.22
Помогите решить задачу, пожалуйста.