Testseite JSXGraph

Aus Wiki1

(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
 +
<jsxgraph box="BOARD1" width="600" height="600">
 +
let input = [[0, 0, 2], [2, 3, 0], [0, 1, 0]];
 +
 +
let active = [[0, 0, 0], [0, 1, 0], [0, 0, 0]];
 +
 +
let settings = {
 +
    'projection': {
 +
        'top': true,        // top view
 +
        'north': true,      // view from north
 +
        'east': true,      // view from east
 +
        'south': true,      // view from south
 +
        'west': true,      // view from west
 +
        'base': true,      // view from below
 +
        'update': false    // false: projections from the initial matrix ([[.., .., ..], [.., .., ..], [.., ..,.]] are displayed
 +
    },                      // true:  projections from the active matrix are displayed
 +
    'navigation': {
 +
        'visible': true,    // show navigation button
 +
        'keyboard': true,  // keyboard control
 +
        'azimuth': true,    // azimuth control
 +
        'elevation': true,  // elevation control
 +
        'view': [-0.3, 0.5] // initial values for azimuth and elevation (also used for the reset button "O")
 +
    },
 +
    'output': {            // xx view of input matrix equals xx view of active matrix
 +
        'top': true,        // add top value to output()
 +
        'north': true,      // add north value to output()
 +
        'east': true,      // add east value to output()
 +
        'south': true,      // add south value to output()
 +
        'west': true,      // add west value to output()
 +
        'base': true,      // add base value to output()
 +
        'matrix': true      // add active matrix to output()
 +
    }
 +
}
 +
 +
// JSXGraph board
 +
 +
let board = JXG.JSXGraph.initBoard("BOARD1", boardAttr());
 +
 +
let view = initBoard3D(board);
 +
 +
let superM = {
 +
    'top':
 +
    input
 +
}
 +
let mx = 1;
 +
let my = 1;
 +
 +
let cubes = new Array();
 +
 +
let col = {
 +
    'north': '#009e73',
 +
    'south': '#f0e442',
 +
    'west': '#56b4e9',
 +
    'east': '#d65c00',
 +
    'top': '#0072b2',
 +
    'base': '#e69f00',
 +
    'button': '#999999'
 +
};
 +
 +
function scaleView() {
 +
    return (board.create('point', [1, 1], {visible: false}).coords.scrCoords[1] - board.create('point', [0, 0], {visible: false}).coords.scrCoords[1]) / 40;
 +
}
 +
 +
let factor = scaleView();
 +
 +
function cVis(x, y, z) {
 +
    return (JXG.evaluate(cubes[x][y][z].visProp.visible) ? 1 : 0);
 +
}
 +
 +
function viewButton() {
 +
    view.setView(settings['navigation']['view'][0] + Math.PI, settings['navigation']['view'][1], 0);
 +
    mx = 1;
 +
    my = 1;
 +
    board.update();
 +
}
 +
 +
let buttonEast = board.create('button', [8.25, 4, 'E', () => {
 +
    eastButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['east']);
 +
let buttonWest = board.create('button', [4.75, 4, 'W', () => {
 +
    westButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['west']);
 +
let buttonNorth = board.create('button', [6.5, 5.75, 'N', () => {
 +
    northButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['north']);
 +
let buttonSouth = board.create('button', [6.5, 2.25, 'S', () => {
 +
    southButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['south']);
 +
let buttonPlus = board.create('button', [7.5, -0.25, ' + ', () => {
 +
    plusButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['top']);
 +
let buttonMinus = board.create('button', [5.5, -0.25, ' – ', () => {
 +
    minusButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['base']);
 +
let viewMinus = board.create('button', [6.5, 4, ' O ', () => {
 +
    viewButton();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
}], {fixed: true, visible: settings['navigation']['visible']}).rendNodeButton.style = bStyle(col['button']);
 +
 +
function bStyle(c) {
 +
    return 'width: +' + (50 * factor) + 'px; height: ' + (50 * factor) + 'px; border: solid gray ' + (3 * factor) + 'px; border-radius: ' + (15 * factor) + 'px; color: black; padding: 1px 3px; text-align: center; text-decoration: none; display: inline-block; font-size: ' + (24 * factor) + 'px; background-color:' + c + ';';
 +
}
 +
 +
document.getElementById("BOARD1").addEventListener("keydown", function (e) {
 +
    if (settings['navigation']['keyboard'])
 +
        if (e.key === "ArrowUp") {
 +
            northButton();
 +
        } else if (e.key === "ArrowDown") {
 +
            southButton();
 +
        } else if (e.key === "ArrowLeft") {
 +
            westButton();
 +
        } else if (e.key === "ArrowRight") {
 +
            eastButton();
 +
        } else if (e.key === "+" | e.key === " ") {
 +
            plusButton();
 +
        } else if (e.key === "-") {
 +
            minusButton();
 +
        } else if (e.key === "o" | e.key === "O") {
 +
            viewButton();
 +
        }
 +
        e.preventDefault();
 +
    try {
 +
        setOutput();
 +
    } catch (e) {
 +
    }
 +
    board.update();
 +
});
 +
 +
 +
// JSXGraph construction
 +
 +
view.create('point3d', [0, 0, 0], {
 +
    name: '',
 +
    size: 8 * factor,
 +
    fixed: true,
 +
    fillColor: '#000000',
 +
    showinfobox: false
 +
});
 +
 +
let baseCube = view.create('polyhedron3d', [
 +
    [
 +
        [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]
 +
    ], [
 +
        [0, 1, 2, 3], [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7], [4, 5, 6, 7]
 +
    ]
 +
], {
 +
    visible: false
 +
});
 +
 +
let markCube = view.create('polyhedron3d', [
 +
    [
 +
        [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1]
 +
    ], [
 +
        [0, 4], [1, 5], [2, 6], [3, 7], [4, 5], [5, 6], [6, 7], [7, 4]
 +
    ]
 +
], {
 +
    visible: false
 +
});
 +
 +
let arrows = view.create('polyhedron3d', [
 +
    [
 +
        [1.25, -0.25, 0], [1.75, -0.25, 0], [1.5, -0.5, 0],
 +
        [3.25, 1.25, 0], [3.25, 1.75, 0], [3.5, 1.5, 0],
 +
        [1.25, 3.25, 0], [1.75, 3.25, 0], [1.5, 3.5, 0],
 +
        [-0.25, 1.25, 0], [-0.25, 1.75, 0], [-0.5, 1.5, 0]
 +
    ], [
 +
        [0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]
 +
    ]
 +
], {
 +
    fillColorArray: [col['south'], col['east'], col['north'], col['west']],
 +
    opacity: 1,
 +
    fillOpacity: 1,
 +
    strokeWidth: 3 * factor,
 +
    strokeColor: 'gray',
 +
    visible: true
 +
});
 +
 +
let base = view.create('polyhedron3d', [
 +
    [
 +
        [0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0],
 +
        [0, 1, 0], [1, 1, 0], [2, 1, 0], [3, 1, 0],
 +
        [0, 2, 0], [1, 2, 0], [2, 2, 0], [3, 2, 0],
 +
        [0, 3, 0], [1, 3, 0], [2, 3, 0], [3, 3, 0]
 +
    ], [
 +
        [0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6],
 +
        [4, 5, 9, 8], [5, 6, 10, 9], [6, 7, 11, 10],
 +
        [8, 9, 13, 12], [9, 10, 14, 13], [10, 11, 15, 14]
 +
    ]
 +
], {
 +
    fillColorArray: [col['button']],
 +
    fillOpacity: 0.25,
 +
    strokeWidth: 3 * factor,
 +
    strokeColor: 'lightgray',
 +
    visible: true,
 +
    layer: 0
 +
});
 +
 +
for (let i = 0; i < 3; i++) {
 +
    cubes[i] = new Array();
 +
    for (let j = 0; j < 3; j++) {
 +
        cubes[i][j] = new Array();
 +
        for (let k = 0; k < 3; k++) {
 +
            cubes[i][j][k] = view.create('polyhedron3d', [baseCube, [view.create('transform3d', [i, j, k], {type: 'translate'})]], {
 +
                fillColorArray: [col['base'], col['south'], col['east'], col['north'], col['west'], col['top']],
 +
                fillOpacity: 1,
 +
                strokeColor: 'gray',
 +
                strokeWidth: 3 * factor,
 +
                visible: () => {
 +
                    return superM['top'][j][i] > k ? true : false;
 +
                }
 +
            });
 +
        }
 +
    }
 +
}
 +
 +
// Projections
 +
function topP() {
 +
    return (settings['projection']['update']) ? active : input;
 +
}
 +
 +
function northP() {
 +
    return [
 +
        [cVis(2, 0, 0) + cVis(2, 1, 0) + cVis(2, 2, 0), cVis(1, 0, 0) + cVis(1, 1, 0) + cVis(1, 2, 0), cVis(0, 0, 0) + cVis(0, 1, 0) + cVis(0, 2, 0)],
 +
        [cVis(2, 0, 1) + cVis(2, 1, 1) + cVis(2, 2, 1), cVis(1, 0, 1) + cVis(1, 1, 1) + cVis(1, 2, 1), cVis(0, 0, 1) + cVis(0, 1, 1) + cVis(0, 2, 1)],
 +
        [cVis(2, 0, 2) + cVis(2, 1, 2) + cVis(2, 2, 2), cVis(1, 0, 2) + cVis(1, 1, 2) + cVis(1, 2, 2), cVis(0, 0, 2) + cVis(0, 1, 2) + cVis(0, 2, 2)]
 +
    ];
 +
}
 +
 +
function southP() {
 +
    return [
 +
        [cVis(0, 0, 0) + cVis(0, 1, 0) + cVis(0, 2, 0), cVis(1, 0, 0) + cVis(1, 1, 0) + cVis(1, 2, 0), cVis(2, 0, 0) + cVis(2, 1, 0) + cVis(2, 2, 0)],
 +
        [cVis(0, 0, 1) + cVis(0, 1, 1) + cVis(0, 2, 1), cVis(1, 0, 1) + cVis(1, 1, 1) + cVis(1, 2, 1), cVis(2, 0, 1) + cVis(2, 1, 1) + cVis(2, 2, 1)],
 +
        [cVis(0, 0, 2) + cVis(0, 1, 2) + cVis(0, 2, 2), cVis(1, 0, 2) + cVis(1, 1, 2) + cVis(1, 2, 2), cVis(2, 0, 2) + cVis(2, 1, 2) + cVis(2, 2, 2)]
 +
    ];
 +
}
 +
 +
function eastP() {
 +
    return [
 +
        [cVis(0, 0, 0) + cVis(1, 0, 0) + cVis(2, 0, 0), cVis(0, 1, 0) + cVis(1, 1, 0) + cVis(2, 1, 0), cVis(0, 2, 0) + cVis(1, 2, 0) + cVis(2, 2, 0)],
 +
        [cVis(0, 0, 1) + cVis(1, 0, 1) + cVis(2, 0, 1), cVis(0, 1, 1) + cVis(1, 1, 1) + cVis(2, 1, 1), cVis(0, 2, 1) + cVis(1, 2, 1) + cVis(2, 2, 1)],
 +
        [cVis(0, 0, 2) + cVis(1, 0, 2) + cVis(2, 0, 2), cVis(0, 1, 2) + cVis(1, 1, 2) + cVis(2, 1, 2), cVis(0, 2, 2) + cVis(1, 2, 2) + cVis(2, 2, 2)]
 +
    ];
 +
}
 +
 +
function westP() {
 +
    return [
 +
        [cVis(0, 2, 0) + cVis(1, 2, 0) + cVis(2, 2, 0), cVis(0, 1, 0) + cVis(1, 1, 0) + cVis(2, 1, 0), cVis(0, 0, 0) + cVis(1, 0, 0) + cVis(2, 0, 0)],
 +
        [cVis(0, 2, 1) + cVis(1, 2, 1) + cVis(2, 2, 1), cVis(0, 1, 1) + cVis(1, 1, 1) + cVis(2, 1, 1), cVis(0, 0, 1) + cVis(1, 0, 1) + cVis(2, 0, 1)],
 +
        [cVis(0, 2, 2) + cVis(1, 2, 2) + cVis(2, 2, 2), cVis(0, 1, 2) + cVis(1, 1, 2) + cVis(2, 1, 2), cVis(0, 0, 2) + cVis(1, 0, 2) + cVis(2, 0, 2)]
 +
    ];
 +
}
 +
 +
function baseP() {
 +
    return [
 +
        [cVis(2, 0, 0), cVis(1, 0, 0), cVis(0, 0, 0)],
 +
        [cVis(2, 1, 0), cVis(1, 1, 0), cVis(0, 1, 0)],
 +
        [cVis(2, 2, 0), cVis(1, 2, 0), cVis(0, 2, 0)]
 +
    ];
 +
}
 +
 +
superM = {
 +
    'top':
 +
        topP(),
 +
    'north':
 +
        northP(),
 +
    'south':
 +
        southP(),
 +
    'west':
 +
        westP(),
 +
    'east':
 +
        eastP(),
 +
    'base':
 +
        baseP()
 +
}
 +
 +
function eastButton() {
 +
    mx++;
 +
    setOutput();
 +
}
 +
 +
function westButton() {
 +
    mx--;
 +
}
 +
 +
function northButton() {
 +
    my++;
 +
}
 +
 +
function southButton() {
 +
    my--;
 +
}
 +
 +
function plusButton() {
 +
    //inXXput[my][mx] == 3 ? 3 : inXXput[my][mx]++;
 +
    superM['top'][my][mx] == 3 ? 3 : superM['top'][my][mx]++;
 +
    updateP();
 +
}
 +
 +
function minusButton() {
 +
    //inXXput[my][mx] == 0 ? 0 : inXXput[my][mx]--;
 +
    superM['top'][my][mx] == 0 ? 0 : superM['top'][my][mx]--;
 +
    updateP();
 +
}
 +
 +
let pjX = -8;
 +
 +
if (settings['projection']['top']) {
 +
    projection('top', pjX, 8, true);
 +
    pjX += 3.5;
 +
}
 +
if (settings['projection']['south']) {
 +
    projection('south', pjX, 8, true);
 +
    pjX += 2.5
 +
}
 +
if (settings['projection']['east']) {
 +
    projection('east', pjX, 8, true);
 +
    pjX += 2.5;
 +
}
 +
if (settings['projection']['north']) {
 +
    projection('north', pjX, 8, false);
 +
    pjX += 2.5;
 +
}
 +
if (settings['projection']['west']) {
 +
    projection('west', pjX, 8, false);
 +
    pjX += 3.5;
 +
}
 +
if (settings['projection']['base']) {
 +
    projection('base', pjX, 8, false)
 +
}
 +
 +
function updateP() {
 +
    if (settings['projection']['update']) {
 +
        copyM(superM['north'], northP());
 +
        copyM(superM['south'], southP());
 +
        copyM(superM['east'], eastP());
 +
        copyM(superM['west'], westP());
 +
        copyM(superM['base'], baseP());
 +
    }
 +
}
 +
 +
function copyM(A, B) {
 +
    for (let i = 0; i < 3; i++)
 +
        for (let j = 0; j < 3; j++)
 +
            A[i][j] = B[i][j];
 +
}
 +
 +
 +
superM['top'] = active;
 +
updateP();
 +
 +
let initSuperM = {
 +
    'top': [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 +
    'north': [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 +
    'south': [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 +
    'west': [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 +
    'east': [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
 +
    'base': [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
 +
};
 +
copyM(initSuperM['south'], southP());
 +
 +
 +
function projection(mx, x, y, lft) {
 +
    let M = superM[mx];
 +
    for (let i = 0; i < 3; i++) {
 +
        for (let j = 0; j < 3; j++) {
 +
            board.create('point', [x + (j / 2) * 1.1, y + (i / 2) * 1.1], {
 +
                name: '', face: '[]', strokeWidth: 2 * factor, strokeColor: 'gray', fillColor: () => {
 +
                    return (M[i][j] > 0) ? col[mx] : '#eeeeee';
 +
                }, size: 11 * factor, highlight: false, fixed: true, showinfobox: false
 +
            });
 +
        }
 +
    }
 +
    board.create('point', [x - 0.25 + (lft ? -0.05 : 1.65), y - 0.3], {
 +
        name: '',
 +
        size: 4 * factor,
 +
        fixed: true,
 +
        fillColor: '#000000',
 +
        strokeWidth: 0,
 +
        highlight: false,
 +
        showinfobox: false
 +
    });
 +
}
 +
 +
let trKeys = view.create('transform3d', [() => {
 +
    (mx >= 3) ? mx = 2 : (mx < 0) ? mx = 0 : mx;
 +
    return mx;
 +
}, () => {
 +
    (my >= 3) ? my = 2 : (my < 0) ? my = 0 : my;
 +
    return my;
 +
}, 0], {type: 'translate'});
 +
 +
let trSl = view.create('transform3d', [0, 0, 1], {type: 'translate'});
 +
 +
view.create('polyhedron3d', [markCube, [trKeys]], {
 +
    fillColorArray: [col['button']],
 +
    fillOpacity: 0.15,
 +
    strokeColor: 'gray',
 +
    strokeWidth: 3 * factor,
 +
    dash: 2,
 +
    visible: () => superM['top'][my][mx] < 1 ? true : false
 +
});
 +
view.create('polyhedron3d', [markCube, [trKeys, trSl]], {
 +
    fillColorArray: [col['button']],
 +
    fillOpacity: 0.15,
 +
    strokeColor: 'gray',
 +
    strokeWidth: 3 * factor,
 +
    dash: 2,
 +
    visible: () => superM['top'][my][mx] < 2 ? true : false
 +
});
 +
view.create('polyhedron3d', [markCube, [trKeys, trSl, trSl]], {
 +
    fillColorArray: [col['button']],
 +
    fillOpacity: 0.15,
 +
    strokeColor: 'gray',
 +
    strokeWidth: 3 * factor,
 +
    dash: 2,
 +
    visible: () => superM['top'][my][mx] < 3 ? true : false
 +
});
 +
view.create('polyhedron3d', [markCube, [trKeys, trSl, trSl, trSl]], {
 +
    fillColorArray: [col['button']],
 +
    fillOpacity: 0.15,
 +
    strokeColor: 'gray',
 +
    strokeWidth: 3 * factor,
 +
    dash: 2
 +
});
 +
 +
function initBoard3D(b) {
 +
 +
    let v = b.create('view3d', [[-4 - (settings['navigation']['visible'] ? 2 : 0), -6.25], [9, 9], [[0, 3], [0, 3], [0, 3]]],
 +
        {
 +
            projection: 'parallel',
 +
            trackball: false,
 +
            depthOrder: {enabled: true},
 +
            axesPosition: 'center',
 +
            xAxis: {visible: false},
 +
            yAxis: {visible: false},
 +
            zAxis: {visible: false},
 +
            xPlaneRear: {
 +
                visible: false
 +
            },
 +
            yPlaneRear: {
 +
                visible: false
 +
            },
 +
            zPlaneRear: {
 +
                visible: false
 +
            },
 +
            el: {
 +
                pointer: {enabled: settings['navigation']['elevation']},
 +
                keyboard: {enabled: settings['navigation']['elevation']}
 +
            },
 +
            az: {
 +
                pointer: {enabled: settings['navigation']['azimuth']},
 +
                keyboard: {enabled: settings['navigation']['azimuth']}
 +
            }
 +
        }
 +
    );
 +
 +
    v.setView(settings['navigation']['view'][0] + Math.PI, settings['navigation']['view'][1], 0);
 +
 +
    return v;
 +
}
 +
 +
function boardAttr() {
 +
    let bA = {
 +
        boundingbox: [-10, 10, 10, -10],
 +
        keepaspectratio: true,
 +
        axis: false,
 +
        showcopyright: false,
 +
        shownavigation: false,
 +
        movetarget: false,
 +
        pan: {
 +
            enabled: false
 +
        },
 +
        browserpan:false,
 +
        zoom: {
 +
            enabled: false,
 +
        },
 +
        keyboard: {
 +
            enabled: false
 +
        }
 +
    };
 +
    return bA;
 +
}
 +
 +
function compareM(m) {
 +
    let b = true;
 +
    for (let i = 0; i < 3; i++)
 +
        for (let j = 0; j < 3; j++) {
 +
            if (superM[m][i][j] == 0) {
 +
                if (initSuperM[m][i][j] != 0)
 +
                    b = false;
 +
            } else {
 +
                if (initSuperM[m][i][j] == 0)
 +
                    b = false;
 +
            }
 +
        }
 +
    return b;
 +
}
 +
 +
function copyS() {
 +
    copyM(initSuperM['top'], topP());
 +
    copyM(initSuperM['north'], northP());
 +
    copyM(initSuperM['south'], southP());
 +
    copyM(initSuperM['west'], westP());
 +
    copyM(initSuperM['east'], eastP());
 +
    copyM(initSuperM['base'], baseP());
 +
}
 +
 +
// output data for LMS, additional binding to LMS necessary
 +
 +
function output() {
 +
    let out = [];
 +
    copyS();
 +
 +
 +
    if (settings['output']['top']) {
 +
        out.push('' + compareM('top'));
 +
    }
 +
 +
    if (settings['output']['north']) {
 +
        out.push('' + compareM('north'));
 +
    }
 +
 +
    if (settings['output']['east']) {
 +
        out.push('' + compareM('east'));
 +
    }
 +
 +
    if (settings['output']['south']) {
 +
        out.push('' + compareM('south'));
 +
    }
 +
 +
    if (settings['output']['west']) {
 +
        out.push('' + compareM('west'));
 +
    }
 +
 +
    if (settings['output']['base']) {
 +
        out.push('' + compareM('base'));
 +
    }
 +
 +
    if (settings['output']['matrix']) {
 +
        out.push(JXG.evaluate(() => {
 +
            return '[[' + active[0] + '],[' + active[1] + '],[' + active[2] + ']]';
 +
        }));
 +
    }
 +
 +
    return out.toString();
 +
}
 +
 +
// output events, binding to LMS
 +
 +
function setOutput() {
 +
    document.getElementById('outputID').innerHTML = output();
 +
}
 +
 +
</jsxgraph>

Version vom 13:19, 8. Sep. 2025


Persönliche Werkzeuge