forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Области в 2д массиве. (http://forum.boolean.name/showthread.php?t=8638)

Данил 10.07.2009 04:40

Области в 2д массиве.
 
В общем, задача:
Я имею 2мерный массив.
Массив - это карта.
т.е.:

Цитата:


0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 0 0 0
0 1 1 1 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0
0 0 0 0 1 1 1 1 0 0
0 0 0 0 1 0 0 0 0 0

Мне нужно сделать так, чтобы этот массив с помощью определенного алгоритма разбился на области, т.е:

Цитата:

0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 0 0 0 0 0
0 1 1 1 1 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0
0 0 0 0 2 0 0 0 0 0
0 0 0 0 4 4 4 4 0 0
0 0 0 0 4 4 4 4 0 0
0 0 0 0 3 0 0 0 0 0

Т.е. как бы где большое скопление - это одна область, где другое скопление - другая, ну и оставшееся тоже на области.

Условие: надо исключить создание областей типа:

Цитата:

0 0 0 0 0
2 2 2 2 0
2 2 2 2 2
2 2 2 2 0

Ну, короче говоря, разбить на чисто прямоугольные области.

Как именно будет разбиваться - значение не имеет, т.е. в первом случае такие области - сойдет, а если будет по-другому, но тоже прямоугольные, тоже ладно.

Есть идея , чтобы перем число 1 и смотрим рядом стоящие 1 - и если еще с рядом стоящей есть тоже числа 1 - то берем в область. Но как-то муторно это кажется.

Можно - смотрим. если есть 1 - то просмтариваем правее (левее) все 1, затем вниз идем(вверх) по ВСЕм этим 1 - то получается прямоугольник - то это область.
Но ведь это же куча if и forов будет?

Есть еще какие идеи?

Halk-DS 10.07.2009 05:50

Ответ: Области в 2д массиве.
 
Извиняюсь за оффтоп, скажу сразу- ответа незнаю, но что ти там уже такое примудрённое задумал? Может ти сможеш расказать зачем тебе такой алгоритм? Возможно есть какойто другой способ решения етой проблемы?
ЗЫ. Кажись темку надо было в раздел алгоритмы отправить.

Данил 10.07.2009 06:34

Ответ: Области в 2д массиве.
 
Э, глупо звучит - есть пол - там где еденички - и надо склеить для экономии полигонов о_О )

Halk-DS 10.07.2009 21:47

Ответ: Области в 2д массиве.
 
Наоборот звучит многообещяюще. Например ты меня сам натолкнул на одну мысль с генератором случайных уровней. (може кто играл в MineBombers :) )

Данил 12.07.2009 16:45

Ответ: Области в 2д массиве.
 
Так, экономить полигонвы - тыщей меньше, тыщей больше - не имеет значения.

А вот создание физического пола - очень даже поможет, ибо сколько зон - столько полигонов *2 .

или же там пол есть, 60х60 размиером ,а полигонов около 120, допустим, - как-то не охото такой пол вставлять в физ-модель, так как таких полов 100х100...

КТо-нибудь знает данный алгоритм разбивки на прямоугольники? или же только кучей ifов?

Данил 14.07.2009 01:38

Ответ: Области в 2д массиве.
 
спасибо всем за внимание)
тупо возможно, но работает.

Цитата:

Global Dim:Int[11,11]
Global cx:Int
Global cy:Int

Global i:Int
Global j:Int
Global i1:Int
Global j1:Int

Global m:Int=2

Global x1,y1,x2,y2

For i = 3 To 5
For j = 3 To 5
Dim[i,j] = 1
Next
Next

For i = 8 To 9
For j = 6 To 9
Dim[i,j] = 1
Next
Next

For i = 1 To 9
Dim[i,0] = 1
Next
dim[3,1] = 1



For i = 0 To 9
For j = 0 To 9

If dim[i,j] = 1 Then
'ЗАФТКСИРОВАЛИ
cx=i
cy=j
x1=cx
While dim[cx,cy]=1
cx:+1

If dim[cx,cy]<>1 Then x2=cx-1
Wend
cx=i
y1=cy
While dim[cx,cy]=1
cy:+1
If dim[cx,cy]<>1 Then y2=cy-1
Wend


For i1 = x1 To x2
For j1 = y1 To y2
dim[i1,j1]=m
Next
Next
m=m+1
End If

Next
Next















For i = 0 To 9
For j = 0 To 9
s:String = s + " " + dim[j,i]
Next
DebugLog s
s=""
Next

moka 17.07.2009 15:33

Ответ: Области в 2д массиве.
 
Я бы перебирал все возможные варрианты, тупо варируя от определённого пикселя, каждые варрианты записывая естественно в класс.
Затем вконце переберая все варрианты, находить что-то среднее между: величина сектора и колличество секторов. Исключая пересечения секторов конечно.

А ты уверен что такое автоматическим редактором выйдет лучше чем вручную? Или у тебя объёмы большие?

Данил 17.07.2009 19:32

Ответ: Области в 2д массиве.
 
В принципе, редактором тоже можно сделать, чтобы распределение на области - 10-50 таких областей будет.
затем и этой области созадем тупо плоский меш - и на физикс посылаем - вот и пол.
а визуалньо там будет совершенно другое, более сложное по графике.


Часовой пояс GMT +4, время: 09:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot