nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 08:42



Reply to topic  [ 17 posts ]  Go to page 1, 2  Next
Хаос Шаоса 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Решил вспомнить свою аспиранскую молодость и портировать некоторые свои старые программы под линух:

Image

Вышеприведенная картинка построена вот по этим правилам:
Code:
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 году в сборнике тезисов докладов Уральского Государственного Технического Университета (бвыший УПИ, теперь часть Уральского Федерального Университета):

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

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

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

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

Аналогично можно подойти к генерации полноцветных изображений, при этом, вместо одного, вводится три набора вероятностей, соответствующих трем цветовым составляющим RGB, а также массив размером 3*DX*DY ячеек памяти.

_________________
:dj: https://mastodon.social/@Shaos


17 Dec 2005 00:03
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Вот еще из той же серии: Image

Image

Image

Image

Image

_________________
:dj: https://mastodon.social/@Shaos


17 Dec 2005 00:28
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал для газеты Абзац:

Image
Image
Image
Image

_________________
:dj: https://mastodon.social/@Shaos


17 Dec 2005 15:43
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал


А потом портировал его на ZX-Spectrum ;)

_________________
:dj: https://mastodon.social/@Shaos


11 Jan 2006 21:10
Profile WWW
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал


А потом портировал его на ZX-Spectrum ;)


А изначально они под ПЦ были?
Возникла идея - а что если мне их на Sphinx C-- или Fasm'е написать и потом к FLOPPY Loader'у прилепить?


16 Feb 2007 00:12
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Romanich wrote:
Shaos wrote:
Shaos wrote:
По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал


А потом портировал его на ZX-Spectrum ;)


А изначально они под ПЦ были?
Возникла идея - а что если мне их на Sphinx C-- или Fasm'е написать и потом к FLOPPY Loader'у прилепить?


Изначально были на сях с использованием libsdl и libjpeg (собиралось и работало в линухе и должно собираться везде где есть си и вышеуказанные либы).

А зачем что-то лепить к флоппилоадеру? ;)

_________________
:dj: https://mastodon.social/@Shaos


16 Feb 2007 19:44
Profile WWW
Banned

Joined: 12 Oct 2006 16:44
Posts: 608
Reply with quote
Post 
Shaos wrote:
А зачем что-то лепить к флоппилоадеру? ;)


точнее не к нему лепить, а это то что могло запускаться им


17 Feb 2007 03:00
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал


А потом портировал его на ZX-Spectrum ;)


Image

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

Code:
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)

_________________
:dj: https://mastodon.social/@Shaos


15 Mar 2007 22:02
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Восстановил картинки в первых сообщениях топика

_________________
:dj: https://mastodon.social/@Shaos


07 Dec 2021 22:16
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Вот ещё из старины глубокой - картинки высокого разрешения 1024x768 из множества Мандельброта, полученные мною в июле 1997 года (26 с лишним лет назад) - они были в моём собственном 8-битном формате без сжатия и вот сегодня я преобразовал их в PNG без потерь:

Attachment:
view1024_000.png
view1024_000.png [ 39.32 KiB | Viewed 3353 times ]


Attachment:
view1024_001.png
view1024_001.png [ 320 KiB | Viewed 3353 times ]


Attachment:
view1024_002.png
view1024_002.png [ 247.29 KiB | Viewed 3353 times ]


Attachment:
view1024_003.png
view1024_003.png [ 138.38 KiB | Viewed 3353 times ]


Координаты картинок (сделать что ли современную мандельбротоходилку?):
Code:
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

_________________
:dj: https://mastodon.social/@Shaos


04 Jan 2024 23:52
Profile WWW
Novelist
User avatar

Joined: 23 May 2023 23:14
Posts: 42
Reply with quote
Фракталы, это всегда красиво))


12 Jan 2024 12:28
Profile
Maniac
User avatar

Joined: 14 Oct 2019 18:10
Posts: 273
Location: Tashkent
Reply with quote
Post Re:
Shaos wrote:
По просьбе Axora вспомнил и запрограммировал алгоритм генерации скал для газеты Абзац:

Image
Image
Image
Image
Я эти картинки все 90-е в Бейсике РАДИО-86РК пытался воспроизвести безуспешно. :-?
Пока не понял принцип лишь многим позже:


18 Mar 2024 09:16
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Надо на РК портировать мою прогу генерации гор :)

_________________
:dj: https://mastodon.social/@Shaos


18 Mar 2024 10:21
Profile WWW
Maniac
User avatar

Joined: 14 Oct 2019 18:10
Posts: 273
Location: Tashkent
Reply with quote
Shaos wrote:
Надо на РК портировать мою прогу генерации гор :)
Она и в SVG жутко тормозит. :roll:
Даёшь анимацию гор на РК с 50 fps!? :lol:


20 Mar 2024 05:23
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Не - 50FPS конечно же не выйдет :)

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

_________________
:dj: https://mastodon.social/@Shaos


20 Mar 2024 09:56
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 17 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 19 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.