我对计算机图形学很感兴趣,想参加一些比赛。
我想了解新的(对我自己而言)方法来生成从相当简单的公式获得的各种分形或其他图像。
也就是说,比赛的标准是——使用简单的基本公式来获得有趣的图片。
比如有这样一个循环遍历图片中所有像素的实现:
let c = canvas.getContext('2d'), w = canvas.width, h = canvas.height
let formula = (x, y, cx, cy, m) => {
return [x/w+cx/w, y/h+cy/h, 0]
}
canvas.onmousemove = e => {
var img = c.getImageData(0, 0, w, h)
for(var x = 0; x<w; x++) {
for(var y = 0; y<h; y++) {
let value = formula(x, y, e.x, e.y)
let offset = (y*w + x)*4
img.data[offset] = value[0]*255
img.data[offset + 1] = value[1]*255
img.data[offset + 2] = value[2]*255
img.data[offset + 3] = 255
}
}
c.putImageData(img, 0, 0)
}
canvas.onmousemove({x: 456, y: 123})
<canvas width="600" height="175" id="canvas"/>
有必要实现一个函数formula来获得一个“有趣”的图像,鼠标坐标是额外的参数
语言 - 任何,但最好js是,因为在线可视化的可能性。
PS:递归方法对我来说不太有趣,特别是如果递归不是尾,因为将其移植到 glsl 将很困难,如果不是不可能的话。
PPS,为了吸引更多的观众,我选择了cpu,我为它写了图片的循环代码,但是如果你喜欢,我更喜欢webgl,所以下面是我绘制时显卡循环遍历所有像素的片段一个关闭整个屏幕的三角形和公式函数是片段着色器:)
let gl = canvas.getContext('webgl');
gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, 3, -1, -1, 3, -1]), gl.STATIC_DRAW);
let pid = gl.createProgram();
shader('vertex', gl.VERTEX_SHADER);
shader('fragment', gl.FRAGMENT_SHADER);
gl.linkProgram(pid);
gl.useProgram(pid);
let coords = gl.getAttribLocation(pid, "coords");
gl.vertexAttribPointer(coords, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(coords);
let mouse = gl.getUniformLocation(pid, 'mouse');
let resolution = gl.getUniformLocation(pid, 'resolution');
gl.uniform2f(resolution, gl.drawingBufferWidth, gl.drawingBufferHeight);
let changeCenter = e => {
e = e.touches ? e.touches[0] : e;
gl.uniform2f(mouse, e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop);
draw();
}
window.addEventListener('mousemove', changeCenter);
window.addEventListener('touchmove', changeCenter);
draw();
function draw() {
gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
gl.clearColor(0, 0, 0, 0);
gl.drawArrays(gl.TRIANGLES, 0, 3);
}
function shader(src, type) {
let sid = gl.createShader(type);
gl.shaderSource(sid, document.querySelector(`script[type="glsl/${src}"]`).textContent);
gl.compileShader(sid);
var message = gl.getShaderInfoLog(sid);
gl.attachShader(pid, sid);
if (message.length > 0) {
console.log(src.split('\n').map(function (str, i) {
return ("" + (1 + i)).padStart(4, "0") + ": " + str
}).join('\n'));
throw message;
}
}
<canvas width="600" height="175" id="canvas"/>
<script type="glsl/vertex">
attribute vec2 coords;
void main(void) {
gl_Position = vec4(coords.xy, 0.0, 1.0);
}
</script>
<script type="glsl/fragment">
precision highp float;
uniform vec2 mouse;
uniform vec2 resolution;
void main(void) {
vec2 m = mouse/resolution;
vec2 p = gl_FragCoord.xy/resolution - 0.5;
gl_FragColor = vec4(p, m);
}
</script>
我提请您注意超公式
超级公式是超级椭圆的推广,由 Johan Gielis 于 2003 年首次提出。Gielis 建议使用该公式来描述自然界中发现的复杂形状和曲线。
在极坐标中,具有
半径和
角度,超公式如下所示:
通过选择不同的参数值,
得到不同的形状。
我知道的最简单的事情,除了复平面中的分形,是分形
kali,以在分形论坛上发布此公式的人命名glsl 中的公式通常很简单:
js由于缺少对向量的操作,因此稍微复杂一些,但仍然非常简单:这是cpu版本的结果,鼠标改变公式中的变量以获得不同的图像:
GPU 变化和不同的调色板
分形的另一种变体
朱莉娅集
它的公式如下所示:
z是复数:В этом примере значение
cзависит от координат мышки, что позволяет одновременно наблюдать великое множество различных изображений множества ЖюлиаВсе эти изображения получены при помощи нижеприведенного сниппета с минимальными изменениями
По очень похожей формуле получается обобщение всех множеств Жюлиа - Множество Мандельброта (Mandelbrot set)
Пример с бассейном Ньютона.
Области подкрашиваются в соответствии с близостью к корням уравнения z3-1 = 0
Для урaвнения z5-1 = 0
Сетка Аполлона.
При возведении комплексного аргумента в 4 степень можно получить фрактал по форме напоминающий живой организм, такие фракталы называют биоморфами.
В продолжение темы фракталов в комплексной плоскости - вариация множества Мандельброта, но в каждой итерации компоненты комплексного
zберутся по модулю - имеет название Burning Ship, за визуальную похожесть деталей фрактала на корабль. Интересен очень высокой вариативностью геометрических узоров при большом увеличении.Если приближаться в район мачт кораблей можно найти интересные участки
PS: В сниппете работает колесо мышки и драг, при помощи слайдеров можно поменять кол-во итерация и палитру
Фрактал Ляпунова
Форма зависит от введенной строки включающей символы
AиB, а так же от выбранного квадрата в диапазоне [0x4, 0x4]Приведенный пример с конкретными параметрами также известен как Zircon City.
1)Модификация кривой Леви.
Посмотрите тут новые фракталы, модификация кривой Леви, есть онлайн построение. Формула одна меняется только кол-во углов. Скорей это уже больше L системы. https://habr.com/ru/post/328568/
2).Странные аттракторы с симметрией.
Обычно странные аттракторы бесформенная каша пикселей или траекторий, тут фотки как из хаоса можно получить симметрию. Вроде в той проге и коды есть…да и pdf можно нагуглить при желании. http://www.fractalsciencekit.com/tutorial/examples/symicon.htm
3). Снежинки из параметрических кривых Безье.
Формы и сложность можно создать бесконечную. Суть формула одна и также только разное количество кривых и координат опорных точек. Вот тут делал давно на GeoGebra 5. https://www.cyberforum.ru/mathcad/thread1271478.html#post6735492
Там еще где-то в теме была ссылка люди скидывали параметрические уравнения рисующие сложные цветки, форма менялась от параметров. Вот эти делал. https://www.cyberforum.ru/mathcad/thread1271478-page2.html#post6766654
4)Вообще по фракталам
Есть прога Fractal Science Kit, не видел больше нигде такого количества всяких таких штук, несколько сотен наверно с настройками.
5)Новый алгоритм генерации типа снежинок или лабиринтов.
Вот тут случайно открыл новый алгоритм генерации типа снежинок или лабиринтов, алгоритм чем-то похоже на игру жизнь. Делал реакцию диффузии и алгоритмически ошибся =). Получилось интересно. Можно генерировать всякие узоры типа вышиванки крестиком, алгоритм останавливает граница в 1 пиксель. Рост начинается с 1 пикселя. Вот тут делал 5 анимаций, а код там есть в теме чего-то вылетает после компиляции =(. Делал вроде на старом glut. https://www.cyberforum.ru/opengl/thread2749102-page3.html#post15131849
Вспомнил еще два новых для меня метода, насколько помню почти не упомянуты в литературе по фракталам.
6)Chaos_game.
最近我为自己发现了一种方法,我还没有尝试过任何方法。理论上,潜力是巨大的。 https://en.wikipedia.org/wiki/Chaos_game
7)循环对称多尺度图灵模式我的一个新算法是基于扩散反应。实际上,对她来说,我想通过基本扩散5分来接近。直到热情消退。但他以一种非常不寻常的方式画在那里,就像电子显微镜上的照片一样。