Хаос Шаоса

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Хаос Шаоса

Post by Shaos »

Решил вспомнить свою аспиранскую молодость и портировать некоторые свои старые программы под линух:

Image

Вышеприведенная картинка построена вот по этим правилам:

Code: Select all

0.3,0.7  -0.4,0.3  0.8,-0.7	-0.7,0.6
-10,-10    5,30     -100,0	-110,10

0.3  0.5  0.1  0.1
0.2  0.5  0.2  0.1
0.1  0.5  0.2  0.2
А описание алгоритма построения было опубликовано в 1999 году в сборнике тезисов докладов Уральского Государственного Технического Университета (бвыший УПИ, теперь часть Уральского Федерального Университета):
Шабаршин А.А. Генерация полутоновых и полноцветных изображений с помощью систем итерируемых функций / Информационные технологии и электроника: Тезисы докладов. Екатеринбург: УГТУ, 1999. С.67

Предлагается подход, с помощью которого, используя обычную систему итерируемых функций (IFS) с вероятностями, можно генерировать полутоновые и полноцветные изображения.

Система итерируемых функций или IFS (Iterated Function System) - это система простых сжимающих преобразований плоскости (обычно аффинных), которые составляют сжимающее отображение. Это отображение имеет аттрактор, представляющий из себя некое компактное множество точек плоскости. Это множество точек является самоподобным или фрактальным объектом. Как известно, с помощью фракталов достаточно хорошо описываются реальные объекты природы (деревья, линия берега, облака и т.д.). IFS позволяет, используя небольшое количество коэффициентов, генерировать такие фракталы. Обычно, с помощью IFS генерируют черно-белое изображение, где каждая точка плоскости окрашена либо в белый, либо в черный цвет (более точно - точка либо есть, либо ее нет). Для возможности представления полутоновых изображений, понятие IFS обобщают и вводят вероятности для каждого из преобразований. При этом в светлых частях объекта точки располагаются часто, а в темных - редко. Но получившееся изображение остается черно-белым. Для того чтобы превратить его в полутоновое, приходится разбивать изображение на одинаковые квадраты и подсчитывать количество белых точек в каждом из них - это и будет яркость - уровень серого для соответствующего квадрата. Для такого подхода приходится выполнять большое количество вычислений и занимать большое количество памяти.

Вместо этого предлагается подход, при котором поле, где будет генерироваться изображение, сразу разбито на квадраты. Причем каждый квадрат соответствует одному пикселу полутонового экрана. В процессе генерации изображения с помощью IFS, яркость пиксела понимается как количество точек, расположенных в соответствующем квадрате. В результате, такой алгоритм ведет к использованию массива не более чем из DX*DY ячеек памяти (DX - ширина экрана, DY - высота экрана в пикселах).

Аналогично можно подойти к генерации полноцветных изображений, при этом, вместо одного, вводится три набора вероятностей, соответствующих трем цветовым составляющим RGB, а также массив размером 3*DX*DY ячеек памяти.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Вот еще из той же серии: Image

Image

Image

Image

Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал для газеты Абзац:

Image
Image
Image
Image
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал
А потом портировал его на ZX-Spectrum ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote:
Shaos wrote:По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал
А потом портировал его на ZX-Spectrum ;)
А изначально они под ПЦ были?
Возникла идея - а что если мне их на Sphinx C-- или Fasm'е написать и потом к FLOPPY Loader'у прилепить?
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Romanich wrote:
Shaos wrote:
Shaos wrote:По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал
А потом портировал его на ZX-Spectrum ;)
А изначально они под ПЦ были?
Возникла идея - а что если мне их на Sphinx C-- или Fasm'е написать и потом к FLOPPY Loader'у прилепить?
Изначально были на сях с использованием libsdl и libjpeg (собиралось и работало в линухе и должно собираться везде где есть си и вышеуказанные либы).

А зачем что-то лепить к флоппилоадеру? ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Romanich
Banned
Posts: 608
Joined: 12 Oct 2006 16:44

Post by Romanich »

Shaos wrote: А зачем что-то лепить к флоппилоадеру? ;)
точнее не к нему лепить, а это то что могло запускаться им
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Shaos wrote:
Shaos wrote:По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал
А потом портировал его на ZX-Spectrum ;)
Image

Вот собственно оно - исходник на языке RW1 от 1 января 2006 года (исходнику уже больше года):

Code: Select all

robot "Gory"
author "Shaos"
+inc/rw1p2.rwi
+inc/rw1_std.rwi
@DX=256
@DY=192
@MAXT=512 // 16*16*2
@MAXP=867 // 17*17*3
@MAXS=51  // 17*3
@MAXG=256
@TRAN=128
@TRAM=16
@PIDX(2)=g_step*(((@1)*3)+((@2)*@MAXS))
main()
{
 text "\ === Начало главной функции ==="
 def ztile[9]
 text "\ Массив COS[16] для вычисления косинусов сдвинутых на 6 бит"
 def cos[16] = {64,60,45,23,0,-23,-45,-60,-64,-60,-45,-23,0,23,45,60}
 text "\ Массив SIN[16] для вычисления синусов сдвинутых на 6 бит"
 def sin[16] = {0,23,45,60,64,60,45,23,0,-23,-45,-60,-64,-60,-45,-23}
 text "\ Массивы для треугольников и их вершин"
 def p1[@MAXT]
 def p2[@MAXT]
 def p3[@MAXT]
 def po[@MAXP]
 text "\ Установить в качестве текущего цвета зеленый (с черным фоном)"
 color #07
 text "\ Начальные установки"
 d_line = 0 // for DD()
 g_step = 16
 g_num = 1
 g_m = @TRAM
 g_a = 6
 g_tmax = 1
 p1[0] = @PIDX(0,0)
 p2[0] = @PIDX(0,1)
 p3[0] = @PIDX(1,1)
 p1[1] = @PIDX(0,0)
 p2[1] = @PIDX(1,0)
 p3[1] = @PIDX(1,1)
 g_buf = 0
 text "\ Главный цикл"
 while(1)
 {
   clr()
   points()
   drawtri()
   say "PRESS SP,O,P or Q to quit"
   text "\ Ожидание нажатия клавиши"
   while(g_buf==0)
   {
     recv g_buf
   }         
   if(N==@keyboard)
   {
     text "\ Клавиша нажата - анализ"
     if(g_buf=='Q') break
     if(g_buf==#20 && g_step > 1) 
     {
        g_step = g_step>>1
	g_num = 16/g_step
	newtri()
     }
     if(g_buf=='O') 
     {
        g_a = g_a + 1
	if(g_a==16) g_a=0
     }	
     if(g_buf=='P') 
     {
        g_a = g_a - 1
	if(g_a==-1) g_a=15
     }	
     g_buf = 0
   }
 }
 say "--- OK ---"
 text "\ === Конец главной функции ==="
 ret
}

clr()
{
 text "\ --- CLR - Очистка экрана"
 A = #D000 // Address of ztile ???
 command @P2_TERMCLR
 say "(c) 2005, A.A.SHABARSHIN    "
 text "\ --- CLR - Конец подпрограммы"
}

moveto() // A-x B-y
{
 text "\ --- MOVETO - Запомнить начальные координаты"
 last_x = A
 last_y = B
 text "\ --- MOVETO - Конец подпрограммы"
}

lineto() // A-x B-y
{
 text "\ --- LINETO - Нарисовать линию из запомненных координат в заданные"
 l_x = A
 l_y = B
 l_dx = 0
 l_xlen = 0
 if(l_x > last_x)
 {
   l_dx = 1
   l_xlen = l_x - last_x
 }
 if(l_x < last_x)
 {
   l_dx = -1
   l_xlen = last_x - l_x
 }      
 l_dy = 0
 l_ylen = 0
 if(l_y > last_y)
 {
   l_dy = 1
   l_ylen = l_y - last_y
 }
 if(l_y < last_y)
 {
   l_dy = -1
   l_ylen = last_y - l_y
 }
 if(l_dy==0) 
 {
   l_step = 0
   l_mode = 1
 }      
 if(l_dx==0)
 {
   l_step = 0
   l_mode = 2
 }
 if(l_dx!=0 && l_dy!=0)
 {
   if(l_xlen > l_ylen)
   { 
     l_step = (l_xlen<<7)/l_ylen
     l_mode = 3
   }  
   else
   { 
     l_step = (l_ylen<<7)/l_xlen
     l_mode = 4
   }  
 }
 l_curs = l_step
 while(1)
 {
   if(last_x < 0 || last_x >= @DX || last_y <0 || last_y >= @DY) break
   pixel last_x last_y
   C = 0
   if(l_dx >= 0 && l_x-last_x < 2) C=C+1
   if(l_dx < 0 && last_x-l_x < 2) C=C+1
   if(l_dy >= 0 && l_y-last_y < 2) C=C+1
   if(l_dy < 0 && last_y-l_y < 2) C=C+1
   if(C==2)
   {
     if(l_x!=last_x || l_y!=last_y)
     {
       pixel l_x l_y
       last_x = l_x
       last_y = l_y
     }
     break
   }
   if(l_mode==1)
   {
     last_x = last_x + l_dx
     continue
   }
   if(l_mode==2)
   {
     last_y = last_y + l_dy
     continue
   }
   if(l_mode==3)
   {
     last_x = last_x + l_dx
     l_curs = l_curs - #80
     if(l_curs < #80)
     {
       l_curs = l_curs + l_step
       last_y = last_y + l_dy
     }
     continue
   }
   if(l_mode==4)
   {
     last_y = last_y + l_dy
     l_curs = l_curs - #80
     if(l_curs < #80)
     {
       l_curs = l_curs + l_step
       last_x = last_x + l_dx
     }
     continue
   }
   say "LINE ERROR"
   break
 }
 text "\ --- LINETO - Конец подпрограммы"
}

points() 
{
 text "\ --- POINTS - Пересчитать координаты точек для экрана"
 for(B=0;B<=g_num;B++)
 {
   for(A=0;A<=g_num;A++)
   {
      p_idx=@PIDX(A,B)
      p_x=A*g_step*g_m-@TRAN
      p_y=B*g_step*g_m-@TRAN
      p_z=(po[p_idx+2]>>8)&255
      p_x1=p_x*cos[g_a]-p_y*sin[g_a]
      p_y1=p_x*sin[g_a]+p_y*cos[g_a]
      p_xe=128+p_x1/100
      p_ye=14+20736/((p_y1>>6)+309)
      p_ze=(p_z<<7)/309
      po[p_idx]=p_xe
      po[p_idx+1]=p_ye
      po[p_idx+2]=(p_z<<8)|(p_ze&255)
   }
 }
 text "\ --- POINTS - Конец подпрограммы"
}

newtri() // A - number of points
{
 text "\ --- NEWTRI - Добавить следующую степень точности"
 t_k = 0
 t_m = g_step*g_m
 t_d = t_m>>2
 for(t_j=1;t_j<=g_num;t_j=t_j+2)
 {
   for(t_i=1;t_i<=g_num;t_i=t_i+2)
   {
      t_0_0 = @PIDX(t_i-1,t_j-1)
      t_1_0 = @PIDX(t_i,t_j-1)
      t_2_0 = @PIDX(t_i+1,t_j-1)
      t_0_1 = @PIDX(t_i-1,t_j)
      t_1_1 = @PIDX(t_i,t_j)
      t_2_1 = @PIDX(t_i+1,t_j)
      t_0_2 = @PIDX(t_i-1,t_j+1)
      t_1_2 = @PIDX(t_i,t_j+1)
      t_2_2 = @PIDX(t_i+1,t_j+1)
      t_z00 = (po[t_0_0+2]>>8)&255
      t_z01 = (po[t_0_2+2]>>8)&255
      t_z10 = (po[t_2_0+2]>>8)&255
      t_z11 = (po[t_2_2+2]>>8)&255
      t_rand = R
      t_z = ((t_z00+t_z10)>>1)-t_d+(t_rand%t_m)
      if(t_z<0) t_z=0
      if(t_z>255) t_z=255
      po[t_1_0+2] = t_z<<8
      t_rand = R
      t_z = ((t_z00+t_z01)>>1)-t_d+(t_rand%t_m)
      if(t_z<0) t_z=0
      if(t_z>255) t_z=255
      po[t_0_1+2] = t_z<<8
      t_rand = R
      t_z = ((t_z00+t_z11)>>1)-t_d+(t_rand%t_m)
      if(t_z<0) t_z=0
      if(t_z>255) t_z=255
      po[t_1_1+2] = t_z<<8
      t_rand = R
      t_z = ((t_z10+t_z11)>>1)-t_d+(t_rand%t_m)
      if(t_z<0) t_z=0
      if(t_z>255) t_z=255
      po[t_2_1+2] = t_z<<8
      t_rand = R
      t_z = ((t_z01+t_z11)>>1)-t_d+(t_rand%t_m)
      if(t_z<0) t_z=0
      if(t_z>255) t_z=255
      po[t_1_2+2] = t_z<<8
      p1[t_k] = t_0_0
      p2[t_k] = t_0_1
      p3[t_k] = t_1_1
      t_k = t_k+1
      p1[t_k] = t_0_0
      p2[t_k] = t_1_0
      p3[t_k] = t_1_1
      t_k = t_k+1
      p1[t_k] = t_1_0
      p2[t_k] = t_1_1
      p3[t_k] = t_2_1
      t_k = t_k+1
      p1[t_k] = t_1_0
      p2[t_k] = t_2_0
      p3[t_k] = t_2_1
      t_k = t_k+1
      p1[t_k] = t_0_1
      p2[t_k] = t_0_2
      p3[t_k] = t_1_2
      t_k = t_k+1
      p1[t_k] = t_0_1
      p2[t_k] = t_1_1
      p3[t_k] = t_1_2
      t_k = t_k+1
      p1[t_k] = t_1_1
      p2[t_k] = t_1_2
      p3[t_k] = t_2_2
      t_k = t_k+1
      p1[t_k] = t_1_1
      p2[t_k] = t_2_1
      p3[t_k] = t_2_2
      t_k = t_k+1
   }
 }
 g_tmax = t_k-1
 text "\ --- NEWTRI - Конец подпрограммы"
}

drawtri()
{
 text "\ --- DRAWTRI - Нарисовать треугольники"
 for(t_i=0;t_i<=g_tmax;t_i++)
 {
   t_z1 = po[p1[t_i]+2]&255
   t_y1 = po[p1[t_i]+1]-t_z1
   t_x1 = po[p1[t_i]]
   t_z2 = po[p2[t_i]+2]&255
   t_y2 = po[p2[t_i]+1]-t_z2
   t_x2 = po[p2[t_i]]
   t_z3 = po[p3[t_i]+2]&255
   t_y3 = po[p3[t_i]+1]-t_z3
   t_x3 = po[p3[t_i]]
   moveto(t_x1,t_y1)
   lineto(t_x2,t_y2)
   lineto(t_x3,t_y3)
   lineto(t_x1,t_y1)
 }
 text "\ --- DRAWTRI - Конец подпрограммы"
}

dd()
{
 A=0
 B=d_line
 C=1
 command @P2_SETSAY 
 d_line=d_line+1
}
А вот архив с исходником RW1, а также собранными TAP и TRD: gory_01_2006.zip (16K)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Хаос Шаоса

Post by Shaos »

Восстановил картинки в первых сообщениях топика
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Хаос Шаоса

Post by Shaos »

Вот ещё из старины глубокой - картинки высокого разрешения 1024x768 из множества Мандельброта, полученные мною в июле 1997 года (26 с лишним лет назад) - они были в моём собственном 8-битном формате без сжатия и вот сегодня я преобразовал их в PNG без потерь:
view1024_000.png
view1024_001.png
view1024_002.png
view1024_003.png
Координаты картинок (сделать что ли современную мандельбротоходилку?):

Code: Select all

mndlbrt0.gra  x0=-0.280000 y0= 1.500000 dx=4.000000
mndlbrt1.gra  x0=-0.219759 y0=-0.813599 dx=0.000977
mndlbrt2.gra  x0= 0.300260 y0= 0.025391 dx=0.007812
mndlbrt3.gra  x0=-0.175000 y0=-1.023438 dx=0.031250
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Pinokio240
Fanat
Posts: 57
Joined: 23 May 2023 23:14

Re: Хаос Шаоса

Post by Pinokio240 »

Фракталы, это всегда красиво))
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

Re:

Post by Alikberov »

Shaos wrote:По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал для газеты Абзац:

Image
Image
Image
Image
Я эти картинки все 90-е в Бейсике РАДИО-86РК пытался воспроизвести безуспешно. :-?
Пока не понял принцип лишь многим позже:
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Хаос Шаоса

Post by Shaos »

Надо на РК портировать мою прогу генерации гор :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Alikberov
Doomed
Posts: 347
Joined: 14 Oct 2019 18:10
Location: Tashkent

Re: Хаос Шаоса

Post by Alikberov »

Shaos wrote:Надо на РК портировать мою прогу генерации гор :)
Она и в SVG жутко тормозит. :roll:
Даёшь анимацию гор на РК с 50 fps!? :lol:
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Хаос Шаоса

Post by Shaos »

Не - 50FPS конечно же не выйдет :)

Хотя у меня когда-то были мысли сделать "сопроцессор" для ретрокомпьютеров на PIC16 (он тоже 8-битный, но с частотами до 20 МГц и 4-мя тактами на команду), который бы "помогал" в некоторых матрасчётах слабенькому ретропроцу...
Я тут за главного - если что шлите мыло на me собака shaos точка net