Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как будет выглядеть функция? И напишите шейдер, строящий ее.

ze_imposter Профи (777), на голосовании 1 год назад
напишите параметры шейдера для сайта FractalLab, строящий функцию f(z) = z - sum(Cn * z^(n+1)) / (1 + sum(Dn * z^(n+1))), где Cn и Dn - константы, n - номер члена ряда, а z - комплексный аргумент, а подстановка различных значений z приводит к созданию фрактальных изображений, ограниченных кривой, которая имеет бесконечную степень гладкости?
Дополнен 1 год назад
и дополните ответ фотографией графика функции!!
Голосование за лучший ответ
Denis Derv Профи (619) 1 год назад
#define MAX_ITER 100
#define THRESHOLD 4.0

uniform vec2 c;
uniform vec2 d;
uniform float n;

vec2 complex_pow(vec2 z, float p) {
return vec2(pow(length(z), p) * cos(p * atan(z.y, z.x)), pow(length(z), p) * sin(p * atan(z.y, z.x)));
}

vec2 complex_div(vec2 a, vec2 b) {
return vec2((a.x * b.x + a.y * b.y) / (b.x * b.x + b.y * b.y), (a.y * b.x - a.x * b.y) / (b.x * b.x + b.y * b.y));
}

vec2 complex_sum(vec2 a, vec2 b) {
return vec2(a.x + b.x, a.y + b.y);
}

vec2 complex_sub(vec2 a, vec2 b) {
return vec2(a.x - b.x, a.y - b.y);
}

void main() {
vec2 z = vec2(gl_FragCoord.x, gl_FragCoord.y);
vec2 z_n = vec2(0.0, 0.0);
vec2 c_n = vec2(0.0, 0.0);
vec2 d_n = vec2(0.0, 0.0);
int i;
for (i = 0; i < MAX_ITER; i++) {
c_n = complex_sum(c_n, complex_pow(z, i + 1) * c[i % 2]);
d_n = complex_sum(d_n, complex_pow(z, i + 1) * d[i % 2]);
z_n = complex_sub(z, complex_div(c_n, complex_sum(vec2(1.0, 0.0), d_n)));
if (length(z_n - z) > THRESHOLD) {
break;
}
z = z_n;
}
gl_FragColor = vec4(vec3(float(i) / float(MAX_ITER)), 1.0);
}

В этом шейдере c и d - однородные параметры, представляющие постоянные значения Cn и Dn в функции. Параметр n представляет собой количество членов в серии. Функции complex_pow, complex_div, complex_sum и complex_sub выполняют сложные арифметические операции над двумерными векторами, представляющими комплексные числа.

В главной функции происходит итерация. Переменная z инициализируется координатой текущего фрагмента, а затем итеративно обновляется результатом функции `f(
ze_imposterПрофи (777) 1 год назад
SyntaxError: JSON Parse error: Unrecognized token '#'
Denis Derv Профи (619) ze_imposter, { "key_with_#_symbol": "value" }
ze_imposterПрофи (777) 1 год назад
как?
Denis Derv Профи (619) ze_imposter, ну раз ты посчитал этот ответ бесполезным, то никак, увы.
Dmitrii DNK Мастер (1255) 1 год назад
  • Cn: массив констант, представляющих коэффициенты членов в числителе функции.
  • Dn: массив констант, представляющих коэффициенты членов в знаменателе функции.
  • num_terms: целое число, представляющее количество членов в серии.
  • max_iter: целое число, представляющее максимальное количество итераций для вычисления функции.
  • threshold: плавающая величина, представляющая порог для определения того, находится ли точка во фрактале или нет.
  • viewport: 4-компонентный вектор, представляющий границы области просмотра в комплексной плоскости.
  • max_distance: плавающая величина, представляющая максимальное расстояние от начала координат, которого могут достичь точки, прежде чем они будут считаться находящимися за пределами фрактала.

Фрактал, создаваемый этой функцией, широко известен как "фрактал Ньютона". Поэтому загугли фотку и всё тут. Удачи.
ze_imposterПрофи (777) 1 год назад
че это за ответ? нахера мне ответы нейросети, которые вообще не несут никакой пользы? я спросил четко и ясно что нужно сделать
Dmitrii DNK Мастер (1255) ze_imposter, слишком дофига хочешь ?
r1tzzz Гуру (2561) 1 год назад
 

uniform vec2 C[N]; // Массив констант Cn
uniform vec2 D[N]; // Массив констант Dn

void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
vec2 z = fragCoord.xy; // Значение z
vec2 z_next = z;
vec2 sum_C = vec2(0.0); // Сумма для Сn
vec2 sum_D = vec2(0.0); // Сумма для Dn

// Проходим по всем членам ряда
for (int i = 0; i < N; i++)
{
// Суммируем все значения Cn и Dn
sum_C += C[i] * pow(z, float(i + 1));
sum_D += D[i] * pow(z, float(i + 1));

// Вычисляем следующее значение z
z_next = z - sum_C / (1.0 + sum_D);
}

fragColor = vec4(z_next, 0.0, 1.0);
}
ze_imposterПрофи (777) 1 год назад
SyntaxError: JSON Parse error: Unexpected identifier "uniform"
Pirashir0 Gopolikod Мастер (1035) 1 год назад
// Define constants Cn and Dn
const C1 = 0.4;
const C2 = -0.4;
const C3 = 0.0;
const D1 = 0.3;
const D2 = 0.3;
const D3 = 0.3;


function fractalEquation(z) {
let zSquared = math.multiply(z, z);
let zCubed = math.multiply(zSquared, z);
let zFourth = math.multiply(zCubed, z);
let zFifth = math.multiply(zFourth, z);
let zSixth = math.multiply(zFifth, z);
let zSeventh = math.multiply(zSixth, z);

let sumCn = math.add(math.multiply(C1, zCubed), math.multiply(C2, zFifth), math.multiply(C3, zSeventh));
let sumDn = math.add(math.multiply(D1, zCubed), math.multiply(D2, zFifth), math.multiply(D3, zSeventh));

let numerator = math.subtract(z, sumCn);
let denominator = math.add(1, sumDn);

return math.divide(numerator, denominator);
}

let fractalShader = new FractalLab.Shader({
function: fractalEquation
});


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