/rumbo/newton/ newton
xxxxxxxxxx
 
1
// Author: Sol Sarratea
2
// Title: Fractales de Newton
3
precision mediump float;
4
5
uniform float u_time;
6
uniform vec2 u_resolution;
7
uniform vec2 u_mouse;
8
9
vec2 uv(){
10
    /* Devuelve las posiciones del canvas en rango [-1.,1.]x[-1.,1.] */
11
    vec2 pos = gl_FragCoord.xy/u_resolution;
12
    pos = pos *2.-1.;
13
    return pos;
14
}
15
16
vec2 multC(vec2 a, vec2 b){
17
    float re = a.x*b.x - a.y*b.y;
18
    float im = a.x*b.y + a.y*b.x;
19
    return vec2(re,im);
20
}
21
vec2 divC(vec2 a, vec2 b){
22
    return vec2(a.x*b.x+a.y*b.y,a.y*b.x-a.x*b.y)/(b.x*b.x+b.y*b.y);
23
}
24
25
vec2 Scale(vec2 p, float scale){
26
    return (scale*p-u_resolution.xy)/u_resolution.y;
27
}
28
29
//Raices de p(z)= z^3-1
30
const vec2 raiz1 = vec2(  1,0.00001);
31
const vec2 raiz2 = vec2(-.5, .86603);
32
const vec2 raiz3 = vec2(-.5,-.86603);
33
34
vec2 metodoNewton(vec2 z){
35
    const int max_iteraciones = 64;
36
    for(int i=0;i<max_iteraciones;i++){
37
        if (float(i)>fract(u_time*0.018)*48.){
38
         break;
39
        }
40
        vec2 polinomio = vec2( z.x*z.x*z.x - 3.*z.x*z.y*z.y, 3.*z.x*z.x*z.y - z.y*z.y*z.y )-vec2(1,0);
41
        vec2 derivada = 3.*vec2( z.x*z.x - z.y*z.y, 2.*z.x*z.y );
42
        z = z - multC(
43
                vec2(0.220,0.420), //Sugerencia: cambiar valores
44
                divC(
45
                    polinomio,//z^3-1
46
                    derivada ));
47
    }
48
    return z;
49
}
50
51
void main() {
52
    vec3 color;
53
    vec2 pos = uv() *1. - vec2(0.020,-0.140);
54
    
55
    vec2 z = metodoNewton(pos);
56
    float dr1 = distance(z,raiz1);
57
    float dr2 = distance(z,raiz2);
58
    float dr3 = distance(z,raiz3);
59
    
60
    color = vec3(0.484/(1./dr1+1./dr2+1./dr3));
61
        
62
63
    gl_FragColor = vec4(color,1.);
64
65
}
66
67
68