/* Contributed by Glenn T. Lines */

ratio = toReal(width()) / height();

function display(xa, ya)
    max_x = xa[0];
    max_y = ya[0];
    min_x = xa[0];
    min_y = ya[0];
    for q = 1 to maxIndex(xa) do
        max_x = max(xa[q], max_x);
        max_y = max(ya[q], max_y);
        min_x = min(xa[q], min_x);
        min_y = min(ya[q], min_y);
    done
    diff_x = max_x - min_x;
    diff_y = (max_y - min_y) * ratio;
    diff = max(diff_x, diff_y)
    if diff_x < diff_y then
        offset_x = (1 - 1 / ratio) / 2;
        offset_y = 0;
    else
        offset_x = 0;
        offset_y = 0;
    endif

    for q = 1 to maxIndex(xa) do
        x_from = (xa[q-1] - min_x) / diff + offset_x;
        y_from = (ya[q-1] - min_y) / diff + offset_y;
        x_to = (xa[q] - min_x) / diff + offset_x;
        y_to = (ya[q] - min_y) / diff + offset_y;
        line(width() * x_from, width() * y_from,
             width() * x_to, width() * y_to);
    done;
    flush();
endfunc;

classic_x[0] = 0.0;
classic_y[0] = 0.0;
classic_x[1] = 0.33;
classic_y[1] = 0.0;
classic_x[2] = 0.5;
classic_y[2] = sqrt(3)/6.0;
classic_x[3] = 0.67;
classic_y[3] = 0.0;
classic_x[4] = 1.0;
classic_y[4] = 0.0;

square_x[0] = 0.0;
square_y[0] = 0.0;
square_x[1] = 0.33;
square_y[1] = 0.0;
square_x[2] = 0.33;
square_y[2] = 0.33;
square_x[3] = 0.67;
square_y[3] = 0.33;
square_x[4] = 0.67;
square_y[4] = 0.0;
square_x[5] = 1.0;
square_y[5] = 0.0;


subst_x = classic_x;
subst_y = classic_y;
//subst_x = square_x;
//subst_y = square_y;

line_x[0] = 0.0;
line_y[0] = 0.1;
line_x[1] = 1.0;
line_y[1] = 0.1;

triangle_x[0] = 0.0;
triangle_y[0] = 0.0;
triangle_x[1] = 0.5;
triangle_y[1] = 0.707;
triangle_x[2] = 1.0;
triangle_y[2] = triangle_y[0];
triangle_x[3] = triangle_x[0];
triangle_y[3] = triangle_y[0];

curr_x = triangle_x;
curr_y = triangle_y;

function substitute()
    idx = 0;
    for q = 1 to maxIndex(curr_x) do
        local x0 = curr_x[q - 1];
        local y0 = curr_y[q - 1];
        local x1 = curr_x[q];
        local y1 = curr_y[q];
        local a = x1 - x0;
        local b = y1 - y0;
        for w = 0 to maxIndex(subst_x) do
            local x = subst_x[w];
            local y = subst_y[w];
            local tmp_x[idx] = (a * x - b * y) + x0;
            local tmp_y[idx] = (b * x + a * y) + y0;
            idx = idx + 1;
        done;
    done;

    curr_x = tmp_x;
    curr_y = tmp_y;
endfunc;

autoFlush(FALSE);
display(curr_x, curr_y);
repeat 5 times
    t = time();
    substitute();
    wait(1000 - (time() - t));
    cls();
    display(curr_x, curr_y);
done;