Biblioteka Mathbox podstawy
Mathbox to biblioteka javascript oparta na three.js i ShaderGraph do renderowania w przeglądarce przy użyciu webgl diagramów matematycznych. Zapewnia interfejs API do wizualizacji relacji matematycznych i animowania ich w sposób deklaratywny. Tworzysz sceny MathBox komponując drzewo obiektu MathBox, podobne do drzewa dokumentu HTML. W przeciwieństwie do HTML, DOM jest zdefiniowany w JavaScript. Pozwala to dowolnie mieszać model deklaratywny z niestandardowymi wyrażeniami. Ja jako entuzjastka matematyki postanowiłam ją wypróbować. Najpierw w pliku html należy załączyć plik javascript mathbox-bundle.js.
<script src="mathbox-bundle.js"></script> <link rel="stylesheet" href="mathbox.css">Dodajmy div, w którym widoczna będzie nasza scena.
<div id="viewport" style="width:100%; height:800px;"></div>
var element = document.querySelector('#viewport'); var mathbox = mathBox({ plugins: ['core', 'mathbox'], controls: { // Orbit controls, i.e. Euler angles, with gimbal lock klass: THREE.OrbitControls, // Trackball controls, i.e. Free quaternion rotation //klass: THREE.TrackballControls, }, element: element }); if (mathbox.fallback) throw "WebGL not supported" var three = mathbox.three; three.renderer.setClearColor(new THREE.Color(0xFFFFFF), 1.0);Wszystko będzie rysowane w naszym viewport. Po zainicjowaniu mathbox oraz three.js przejdziemy do narysowania układu współrzędnych. Określamy pozycję kamery, zakres dwóch osi układu współrzędnych. Następnie rysujemy siatkę oraz osie układu współrzędnych.
// Place camera var camera = mathbox .camera({ proxy: true, position: [0, 0, 3], }); // 2D cartesian var view = mathbox .cartesian({ range: [[-10, 10], [-5, 5]], scale: [2, 1], }); // Axes + grid view .axis({ axis: 1, width: 3, }) .axis({ axis: 2, width: 3, }) .grid({ width: 2, divideX: 20, divideY: 10, }); // Make axes black mathbox.select('axis').set('color', 'black'); // Calibrate focus distance for units mathbox.set('focus', 3);Domyślnie kamera 3D jest ustawiona w punkcie [0, 0, 0] (tj. X, Y, Z), dokładnie w środku naszego rysunku. + Z wychodzi z ekranu, a -Z za ekran. Wstawiamy własną kamerę i cofamy jej pozycję o 3 jednostki do [0, 0, 3]. Ustawiamy również proxy na true, co pozwala interaktywnym kontrolkom kamery na przesłonięcie naszej podanej pozycji i dynamiczną zmianę pozycji kamery. Zwracana wartość, czyli zmienna camera, to selekcja obiektu mathbox, który wskazuje na element <camera />. Jest to podobne do wybierania elementów drzewa DOM w jQuery. Możesz także wybrać elementy za pomocą selektorów CSS, np. jak dobrać się do elementu camera:
camera = mathbox.select('camera');Następnie określamy układ współrzędnych, na którym będziemy pracować - kartezjański układ 2D. Parametr range określa zakres osi X [-10,10] oraz Y [-5,5]. Parametr scale [2,1] mówi o tym, że układ współrzędnych będzie 2 razy szerszy niż wyższy tzn. na 2 jednostki osi X będzie przypadać 1 jednostka osi Y. Kolejny krok to dodanie osi współrzędnych i siatki (axis i grid). Można również dodać do osi właściwość color, albo zrobić to już później jak poniżej.
// Make axes black mathbox.select('axis').set('color', 'black');Ponieważ rozmiar elementów na ekranie zależy od położenia kamery, możemy skalibrować nasze jednostki, ustawiając focus na głównym elemencie (root), aby dopasować odległość kamery:
mathbox.set('focus', 3);Jak pewne zauważyłeś możesz użyć .get("prop") / .set("prop", value), aby odczytywać i ustawiać indywidualne właściwości, Można również użyć .get() i .set({prop: value}), aby zmienić wiele właściwości naraz. Na razie mamy narysowane osie i siatkę. Teraz czas przejść do narysowania reprezentacji jakiś danych.
// Add some data var data = view .interval({ expr: function (emit, x, i, t) { emit(x, Math.sin(x + t)); }, width: 64, channels: 2, }); // Draw a curve var curve = view .line({ width: 5, color: '#50CCBF', });Narysujemy ruchomą sinusoidę. Najpierw tworzymy interwał (interval), to jest tablica 1D, próbkowana w zakresie zasięgu kartezjańskiego. Zawiera wyrażenie (expr) do generowania punktów danych. Generujemy 64 punkty, każdy z dwoma kanałami (channels), tj. wartościami X i Y.
var data = view .interval({ expr: function (emit, x, i, t) { emit(x, Math.sin(x + t)); }, width: 64, channels: 2, });Tutaj x jest próbkowaną współrzędną X, i jest indeksem tablicy (0-63), a t jest czasem w sekundach, począwszy od 0. Używanie emit jest podobne do zwracania wartości (jak return). Służy do bardzo wydajnego wysyłania wielu wartości. Dane już mamy teraz czas na narysowanie linii.
var curve = view .line({ width: 5, color: '#50CCBF', });Mamy już naszą sinusoidę. Teraz możemy dorysować jeszcze znaczniki i podpisy na układzie współrzędnych.
var scale = view.scale({ divide: 10, }); var ticks = view.ticks({ width: 5, size: 15, color: 'black', }); var format = view.format({ digits: 2, weight: 'bold', }); var labels = view.label({ color: 'blue', zIndex: 1, });Mathbox przykład 1