Аутентичный фрактальный город или программируем вид за окном

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Эксперементируя с фрактальными функциями, я визуализировал 2д иображение, которое внешне мне очень напоминало мне обычный спальный район или строительные леса. Для glsl это будет примерно такая функция:

rgba=vec4((int(x)&int(y))>>(int(mod(floor(x),5.)*4.0))+(4-int(mod(floor(y),5.)))&1);

Если взять нужный масштаб, то получится то о чем я говорю. В примере я устанавливаю масштаб oxy*=49.91/2.50; Выполнив эти действия мы полуим строчки с деталиацией 2д-города. Попробую объяснить, что именно мы сделали этой функцией: Мы вяли треугольник серпинского (int(x)&int(y)) и расщипили его на квадратные матрицы 5x5 (не знаю как по другому выразить то что мы сделали, но слово расщипление наиболее точно выражает проделанную операцию). Затем мы выбираем нужные строчки и подстраиваем их под текущее разрешение экрана:

// fractal city
    float line=120.0;
    vec2 oxy=vec2(xy.y,xy.x);
    oxy=iResolution.y*2.5-oxy;
    if(iResolution.y>1000.0) {
        // fullscreen fix
        xy/=2.0;oxy=vec2(xy.y,xy.x);
        oxy=iResolution.y*2.5-oxy;
        oxy/=2.0;oxy.x-=135.0;
        oxy.x+=1000.0;line*=2.0;
    }if(xy.y<line){
        // all resolutions
        oxy.y+=400.0;oxy-=130.0/2.0;
        if(iResolution.y==281.0)oxy-=80.0;
        if(iResolution.y==236.0)oxy+=30.0;
        if(iResolution.y==288.0)oxy+=40.0;
        oxy*=49.91/2.50;//zoom
        // fractal city lines 
        rgba+=vec4((int(oxy.x)&int(oxy.y))
        >>(int(mod(floor(oxy.x),5.)*4.0))
        +(4-int(mod(floor(oxy.y),5.)))&1);
    }

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

Осталось только добавить праздничные салюты и вид будет точно как из окна:

bool firework(vec4 rgba, vec2 xy, float time){
    float t=time;
    rgba=vec4(0);
    float r=length(xy);
    float rad=atan(xy.y,xy.x);
    float deg=degrees(rad);
    xy=rotate(xy,deg);
    r=length(xy);
    rad=atan(xy.y,xy.x);
    deg=degrees(rad);
    float X=xy.x+sin(deg+t)*(deg+mod(t,100.0));
    float Y=xy.y+cos(deg+t)*(deg+mod(t,100.0));
    return (sqrt(X*X+Y*Y)<30.0&&r<150.0*(sin(t)));
}

Весь код целиком.

Источник: https://habr.com/ru/post/599641/


Интересные статьи

Интересные статьи

На Хабре время от времени появляются статьи про различные веб-сервисы и приложения, так или иначе анализирующие городскую среду. Такие сервисы, по задумке авторов, должны помогать жителям принимать ка...
Замена старых технологий на новые довольно редко проходит без проблем и забот. Чаще всего возникают инциденты. Сейчас, когда Adobe блокирует Flash по всему миру, у многих компаний и гос...
Всем привет. Когда я искал информацию о журналировании (аудите событий) в Bitrix, на Хабре не было ни чего, в остальном рунете кое что было, но кто же там найдёт? Для пополнения базы знаний...
Именно таким вопросом мы задались, встретив ребят оттуда на казанском PHP-митапе. Оказалось, всего за месяц они смогли раскачать местное сообщество — небольшое расследование со ссылками на городс...
Экскурсовод расcказывал группе экскурсантов о том, как коллектив Нижегородской радиолаборатории им. В.И. Ленина воплощал в жизнь заветы В.И. Ленина о «газете без проводов и расстояний». Но я пр...