19,466
社区成员
发帖
与我相关
我的任务
分享#define MAX_ITER 255
#define EPSILON 1e-6
float2 cmul(float2 a, float2 b)
{
float2 r;
r.x = a.x * b.x - a.y * b.y;
r.y = a.y * b.x + a.x * b.y;
return r;
}
float2 cdiv(float2 a, float2 b)
{
float2 r;
r.x = a.x * b.x + a.y * b.y;
r.y = a.y * b.x - a.x * b.y;
return r / dot(b, b);
}
vector color(int n)
{
vector c = 0;
if (n > 0 && n < MAX_ITER)
{
c = (vector(14, 9, 4, 0) + n) * .4;
c = abs(c % 6 - 3) - 1;
}
return c;
}
vector Mand2(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
z = cmul(z, z) + c;
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Mand3(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
z = cmul(cmul(z, z), z) + c;
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Mand4(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
z = cmul(z, z);
z = cmul(z, z) + c;
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Mand5(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
float2 t = cmul(z, z);
t = cmul(t, t);
z = cmul(t, z) + c;
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Mand6(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
float2 t = cmul(z, z);
t = cmul(t, z);
z = cmul(t, t) + c;
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Mandn1(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
z = cdiv(1, z) + c;
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Mandn2(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
z = cdiv(1, cmul(z, z) + c);
if (dot(z, z) > 4) break;
}
return color(n);
}
vector Newton3(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
float2 s = cmul(z, z);
float2 t = cmul(s, z) - c;
if (dot(t, t) < EPSILON) break;
z -= cdiv(t, s) / 3;
}
return color(n);
}
vector Newton4(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
float2 s = cmul(z, z);
s = cmul(s, z);
float2 t = cmul(s, z) - c;
if (dot(t, t) < EPSILON) break;
z -= cdiv(t, s) / 4;
}
return color(n);
}
vector Newton5(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
float2 s = cmul(z, z);
s = cmul(s, s);
float2 t = cmul(s, z) - c;
if (dot(t, t) < EPSILON) break;
z -= cdiv(t, s) / 5;
}
return color(n);
}
vector Newton6(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
float2 s = cmul(z, z);
s = cmul(s, s);
s = cmul(s, z);
float2 t = cmul(s, z) - c;
if (dot(t, t) < EPSILON) break;
z -= cdiv(t, s) / 6;
}
return color(n);
}
vector barnsleyj1(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
if (z.x >= 0)
z.x--;
else
z.x++;
z = cmul(z, c);
if (dot(z, z) > 4) break;
}
return color(n);
}
vector barnsleyj2(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
if (z.x * c.y + c.x * z.y >= 0)
z.x--;
else
z.x++;
z = cmul(z, c);
if (dot(z, z) > 4) break;
}
return color(n);
}
vector barnsleyj3(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
for (int n = 0; n < MAX_ITER; n++)
{
if (z.x >= 0)
{
z = cmul(z, z);
z.x--;
}
else
{
z = cmul(z, z) + z.x * c;
z.x--;
}
if (dot(z, z) > 4) break;
}
return color(n);
}
vector henon(float2 z : TEXCOORD0, float2 c : TEXCOORD1) : COLOR
{
float tx = z.x * z.x, ty;
for (int n = 0; n < MAX_ITER; n++)
{
ty = z.x * c.y;
z.x = 1 + z.y + tx * c.x;
z.y = ty;
if (tx + z.y * z.y > 4) break;
}
return color(n);
}