summaryrefslogtreecommitdiff
path: root/posts/linear_system_solver.js~
blob: 33fc026ca6c41476dc2bce68eb0574fe9153f882 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
var $ = window.$,
    rows = 3,
    columns = 3,
    currentLhs = [], // rows x columns matrix
    currentRhs = []; // rows x 1 matrix
    solutionContainer = $('#solution_container');

function main() {
    $('#reset_button').on('click', onResetClicked);
    $('#solve_button').on('click', onSolveClicked);
    resetView();
}

function resetView() {
    renderLHS();
    renderUnknowns();
    renderRHS();

    currentLhs = [];
    currentRhs = [];
    for (var r = 0; r < rows; r++) {
        for (var c = 0; c < columns; c++) {
            currentLhs.push(0);
        }
    }

    for (var otherR = 0; otherR < rows; otherR++) {
        currentRhs.push(0);
    }

    solutionContainer.empty();
}

// Renders for the input container.
function renderLHS() {
    var lhs = $('#matrix_lhs').empty(),
        addCell = function(index) {
            $('<input>').type('number').val(0).on('change',  function(event) {
                currentLhs[index] = Number(event.target.value);
            }).appendTo(lhs);
        };

    for (var r = 0; r < rows; r++) {
        for (var c = 0; c < columns; c++) {
            addCell((r * rows) + c);
        }
    }
}

function renderUnknowns() {
    var unknownsContainer = $('#unknown_variables').empty();

    for (var r = 0; r < columns; r++) {
        var cell = $('<input>').disabled(true).val(String.fromCharCode('x'.charCodeAt(0) + r).toUpperCase());
        unknownsContainer.append(cell);
    }
}

function renderRHS() {
    var rhs = $('#matrix_rhs').empty(),
        addCell = function(index) {
            $('<input>').type('number').val(0).on('change', function(event) {
                currentRhs[index] = Number(event.target.value);
            }).appendTo(rhs);
        };

    for (var r = 0; r < rows; r++) {
        addCell(r);
    }
}

// Renders for the solution container
function renderAugmentedMatrix(lhs, rhs) {
    var container = $('<div>').addClass('augmented_matrix_container'),
        lhsContainer = $('<div>').appendTo(container),
        rhsContainer = $('<div>').appendTo(container),
        addLhsCell = function(index) {
            $('<input>').type('number').val(lhs[index]).disabled(true).appendTo(lhsContainer);
        },
        addRhsCell = function(index) {
            $('<input>').type('number').val(rhs[index]).disabled(true).appendTo(rhsContainer);
        };
    
    for (var r = 0; r < rows; r++) {
        for (var c = 0; c < columns; c++) {
            addLhsCell(r * rows + c);
        }
    }

    for (var otherR = 0; otherR < rows; otherR++) {
        addRhsCell(otherR);
    }

    return container;
}

// Callbacks for actions
function onResetClicked() {
    resetView();
}

function onSolveClicked() {
    solutionContainer.append(renderAugmentedMatrix(currentLhs, currentRhs));
}

main();