Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.097 c
2-1334607403
Непомнящий
2012-04-17 00:16
2013.03.22
Кончается память


15-1343205350
Eu
2012-07-25 12:35
2013.03.22
До какого числа Double точно хранит целые?


2-1342699186
vasa777
2012-07-19 15:59
2013.03.22
правое меню


15-1330891352
KilkennyCat
2012-03-05 00:02
2013.03.22
Спутниковое телевидение


15-1331843403
Юрий
2012-03-16 00:30
2013.03.22
С днем рождения ! 16 марта 2012 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский