РедактироватьСоздать страницу
Моя фрактальная RGB вселенная

Тетраскоп

Пожалуй всё же надо запилить отдельную статью про это

Я назвал таким образом объект, который у меня получилось достать из матрицы, когда я эксперементировал с фракталами; На основе него я сделал фрактальный телевизор и еще несколько безделушек и других фракталов.

Оригинальная модель тетраскопа

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

Функция зависимости цвета от координат

rgb = function(x, y){ // где x*x+y*y < r*r - математическая формула круга z = x*x+y*y; while(z<'0x100000' && z) z=z<<4; while(z>'0xffffff' && z) z = Math.floor(z/16); return '#'+z.toString(16); }

Создаем canvas в контексте 2d:
R=1024; document.body.innerHTML=('<canvas id="C" width="'+(R*2)+'" height="'+(R*2)+'"></canvas>'); var canvas = document.getElementById('C'); var ctx = canvas.getContext('2d');

Циклично проходимся по всем точкам:
for(var x = 0;x<R;x++) { for(var y = 0;y<R;y++) { var X1 = R-x-1; var Y1 = R-y-1; var X2 = R+x; var Y2 = R+y; if ( ( x*x+y*y ) < R*R ) { ctx.fillStyle=rgb(x, y); ctx.fillRect(X1, Y1, 1, 1); ctx.fillRect(X1, Y2, 1, 1); ctx.fillRect(X2, Y1, 1, 1); ctx.fillRect(X2, Y2, 1, 1); } } }


Это JavaScript код для браузера для получения оригинальной модели.

Фрактальный телевизор

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

Использование шейдеров - еще раз запуская вселенную

Люди с хабра помогли мне реализовать анимацию на шейдерах, которую вы можете видеть в начале страницы. Она большого размера и быстро обновляется, а ее конец там где кончаются сами числа.

Тетраскоп на языке Go

Показать код
package main import ( "image" "image/color" "image/draw" "image/png" "os" "strings" "strconv" //"fmt" ) func ConvertToColor(s string) (r string) { r = s if len(s)<6 { r = s+strings.Repeat("0", 6-len(s)) } else if len(s)>6 { r = string(s[0:6]) } return r } func ParseHexColorFast(s string) (c color.RGBA) { c.A = 0xff if s[0] != '#' { return c } hexToByte := func(b byte) byte { switch { case b >= '0' && b <= '9': return b - '0' case b >= 'a' && b <= 'f': return b - 'a' + 10 case b >= 'A' && b <= 'F': return b - 'A' + 10 } return 0 } c.R = hexToByte(s[1])<<4 + hexToByte(s[2]) c.G = hexToByte(s[3])<<4 + hexToByte(s[4]) c.B = hexToByte(s[5])<<4 + hexToByte(s[6]) return } func main() { R:=1024 D:=R*2 new_png_file := "tetrascope.png" myimage := image.NewRGBA(image.Rect(0, 0, D, D)) bgcolor := color.RGBA{0, 0, 0, 0} draw.Draw(myimage, myimage.Bounds(), &image.Uniform{bgcolor}, image.ZP, draw.Src) for x:=0; x<R; x++ { for y:=0; y<R; y++ { x1 := R-x x2 := R+x-1 y1 := R-y y2 := R+y-1 if x*x+y*y <= R*R { var c int64; c = int64(x*x+y*y); col := "#"+ConvertToColor(strconv.FormatInt(c, 16)) //fmt.Println(col, x, y) color := ParseHexColorFast(col) pixel1 := image.Rect(x1, y1, x1+1, y1+1) pixel2 := image.Rect(x1, y2, x1+1, y2+1) pixel3 := image.Rect(x2, y1, x2+1, y1+1) pixel4 := image.Rect(x2, y2, x2+1, y2+1) draw.Draw(myimage, pixel1, &image.Uniform{color}, image.ZP, draw.Src) draw.Draw(myimage, pixel2, &image.Uniform{color}, image.ZP, draw.Src) draw.Draw(myimage, pixel3, &image.Uniform{color}, image.ZP, draw.Src) draw.Draw(myimage, pixel4, &image.Uniform{color}, image.ZP, draw.Src) } } } myfile, err := os.Create(new_png_file) if err != nil { panic(err) } png.Encode(myfile, myimage) }

Тетраскоп на Python

https://pastebin.com/h9rzbWQc
#тетраскоп#rgb#модель_вселенной#демо_сцены#шейдеры

Последние правки


Комментарии (1)