Форум: "Начинающим";
Текущий архив: 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
// Ïîñëåäîâàòåëü&# 237;î
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.096 c