krt17, в каждой следующей матрице в 4 раза больше чисел. Напрашивается не 2 в степени, а 4^(n-1).
Вид для печати
krt17, в каждой следующей матрице в 4 раза больше чисел. Напрашивается не 2 в степени, а 4^(n-1).
число столбцов/строк 2^n (n=2...), число элементов будет (2^n)*(2^n)=2^(2n)=4^n зачем делить еще на 4 я не очень понял.
Для случая n=3 число строк/столбцов будет 2^3=8 элементов 4^3=64
n=4 - 16, 256
видимо у тебя n немного другое обозначает.
Внезапно на подобной хрене возможен многомерный детеринг :)
add
так да стоп я что то упустил. Сейчас шлифанем.
- - - Добавлено - - -
Все верно Reobne, был прав, я затупил
правильная формула:
e(n,x,y)=e(n-1,x div 2,y div 2)+e(1,x mod 2,y mod 2)*4^(n-1)
e(n,x,y)=e(n-1,x div r,y div r)+e(1,x mod r,y mod r)*r^2(n-1)
- - - Добавлено - - -
Ну и до кучи Lua демо
Код:function elem(n,y,x)
--print (n,y,x)
if n==1 then return pattern[y+1][x+1]
else return elem(n-1,math.floor(y/2),math.floor(x/2))+elem(1,y%2,x%2)*4^(n-1)
end
end
pattern={{3,1},{0,2}}
cur=3
for y=0,2^cur-1 do
io.write (y.."\t")
for x=0,2^cur-1 do
io.write (elem(cur,y,x).."\t")
end
io.write ("\n")
end
Попробовал перевести на PureBasic. Получается что-то не то...
PHP код:Global Dim Pattern.l(16,16)
Procedure elem(n,y,x)
; Print( Str(n) )
; Print( Str(x) )
; PrintN( Str(y) )
If n=1
ProcedureReturn Pattern(y+1,x+1)
Else
ProcedureReturn elem(n-1, Round(y/2,#PB_Round_Down), Round(x/2,#PB_Round_Down)) + elem(1, y%2, x%2) * Pow(4,(n-1))
EndIf
EndProcedure
OpenConsole("")
; Pattern={{3,1},{0,2}}
Pattern(0,0) = 3
Pattern(0,1) = 1
Pattern(1,0) = 0
Pattern(1,1) = 2
cur = 3
For y=0 To Pow(2,cur-1)
Print( Str(y) ); io.write (y.."\t")
For x=0 To Pow(2,cur-1)
Print( Str(elem(cur,y,x)) ); io.write (elem(cur,y,x).."\t")
elem(cur,y,x)
Next x
PrintN(""); io.write ("\n")
Next y
CallDebugger
Для деления воспользуйся >> , видимо что то там с округлением суровое . Я не в курсе что там с басиком, на lua 100% рабочий вариант, проверял с разными cur.
- - - Добавлено - - -
О а на фига еще один elem(cur,y,x) ? Это не нужно. И что собственно получается то?
- - - Добавлено - - -
Мое при cur=4
Код:D:\Dropbox\lua>lua53.exe test1.lua
0 255 127 223 95 247 119 215 87 253 125 221 93 245 117 213 85
1 63 191 31 159 55 183 23 151 61 189 29 157 53 181 21 149
2 207 79 239 111 199 71 231 103 205 77 237 109 197 69 229 101
3 15 143 47 175 7 135 39 167 13 141 45 173 5 133 37 165
4 243 115 211 83 251 123 219 91 241 113 209 81 249 121 217 89
5 51 179 19 147 59 187 27 155 49 177 17 145 57 185 25 153
6 195 67 227 99 203 75 235 107 193 65 225 97 201 73 233 105
7 3 131 35 163 11 139 43 171 1 129 33 161 9 137 41 169
8 252 124 220 92 244 116 212 84 254 126 222 94 246 118 214 86
9 60 188 28 156 52 180 20 148 62 190 30 158 54 182 22 150
10 204 76 236 108 196 68 228 100 206 78 238 110 198 70 230 102
11 12 140 44 172 4 132 36 164 14 142 46 174 6 134 38 166
12 240 112 208 80 248 120 216 88 242 114 210 82 250 122 218 90
13 48 176 16 144 56 184 24 152 50 178 18 146 58 186 26 154
14 192 64 224 96 200 72 232 104 194 66 226 98 202 74 234 106
15 0 128 32 160 8 136 40 168 2 130 34 162 10 138 42 170
Да затупил, там еще в цикле -1 не туда поставил.
Теперь получается вот что:
код такойPHP код:
0 170 042 138 010 162 034 130 002 168 040 136 008 160 032 128 000
1 042 042 010 010 034 034 002 002 040 040 008 008 032 032 000 000
2 138 010 138 010 130 002 130 002 136 008 136 008 128 000 128 000
3 010 010 010 010 002 002 002 002 008 008 008 008 000 000 000 000
4 162 034 130 002 162 034 130 002 160 032 128 000 160 032 128 000
5 034 034 002 002 034 034 002 002 032 032 000 000 032 032 000 000
6 130 002 130 002 130 002 130 002 128 000 128 000 128 000 128 000
7 002 002 002 002 002 002 002 002 000 000 000 000 000 000 000 000
8 168 040 136 008 160 032 128 000 168 040 136 008 160 032 128 000
9 040 040 008 008 032 032 000 000 040 040 008 008 032 032 000 000
10 136 008 136 008 128 000 128 000 136 008 136 008 128 000 128 000
11 008 008 008 008 000 000 000 000 008 008 008 008 000 000 000 000
12 160 032 128 000 160 032 128 000 160 032 128 000 160 032 128 000
13 032 032 000 000 032 032 000 000 032 032 000 000 032 032 000 000
14 128 000 128 000 128 000 128 000 128 000 128 000 128 000 128 000
15 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
PHP код:Global Dim Pattern.l(16,16)
Procedure elem(n,y,x)
If n=1
ProcedureReturn Pattern(y+1,x+1)
Else
ProcedureReturn elem(n-1, y>>1, x>>1) + elem(1, y%2, x%2) * Pow(4,(n-1))
EndIf
EndProcedure
OpenConsole("")
Pattern(0,0) = 3
Pattern(0,1) = 1
Pattern(1,0) = 0
Pattern(1,1) = 2
cur = 4
For y=0 To Pow(2,cur)-1
Print( LSet(Str(y), 3, " ") )
For x=0 To Pow(2,cur)-1
Print( RSet( Str(elem(cur,y,x)),3, "0") + " " )
Next x
PrintN("")
Next y
CallDebugger
Pattern(y+1,x+1) не то, у тебя индексы массива с 0, а в луа с 1 поэтому я прибавлял поменяй на
Pattern(y,x)
Всё, это уже решение. Теперь надо сделать RET. :)
Для чего это решение было нужно?
Если конвертер картинок, то картинку нужно масштабировать, цвета нормировать от 0 до (4^n)+1, заменить цветные пиксели на чанки.
Однобитные пиксели внутри чанок получаются после сравнения цвета и соответствующего элемента матрицы.
Вообще я хотел сделать трехмерный чаночный фрактал. Поэтому уже готовые рисунки не годились. А нужна была формула их генерации, что бы потом добавить ей 3-е измерение.
Ну то есть есть чанк (кубик 4х4х4), в нем каждый пиксель это тоже чанк, в котором каждый пиксель тоже чанк и т.п.
Это интересно! :)
Для начала надо изобрести 3Д паттерн 2х2х2.
- - - Добавлено - - -
Возможно (((0,4),(6,2)),((3,7),(5,1)))
- - - Добавлено - - -
А в формулу добавим координату:
e(n,x,y,z)=e(n-1,x div 2,y div 2,z div 2)+e(1,x mod 2,y mod 2,z mod 2)*8^(n-1)