https://github.com/greetclock/skeleton
Рисование математических 2D визуализаций
https://github.com/greetclock/skeleton
Last synced: 4 months ago
JSON representation
Рисование математических 2D визуализаций
- Host: GitHub
- URL: https://github.com/greetclock/skeleton
- Owner: greetclock
- Created: 2014-11-13T17:24:46.000Z (over 11 years ago)
- Default Branch: master
- Last Pushed: 2016-07-05T15:00:00.000Z (about 10 years ago)
- Last Synced: 2025-12-20T14:59:44.177Z (7 months ago)
- Language: JavaScript
- Homepage:
- Size: 4.37 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 21
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Сейчас скелетон еще разрабатывается, поэтому я не могу обещать, что интерфейс сохранится в следующих коммитах.
Эта документация **актуальна для версии 0.0.5**. Проверить версию можно так: `Plotter.version`
`Plotter` -- основной объект. Он отвечает за прорисовку графика и всех объектов, которые на нем находятся.
Для создания графика нужно передать в качестве первого аргумента в конструктор `Plotter` id DOM-элемента, где дальше будет отрисовываться график.
```javascript
var plotter = new Plotter("plot", options);
```
Второй *необязательный* аргумент конструктора `Plotter` `options` -- это объект, в котором можно менять некоторые свойства `Plotter`. Вот они, а также их значения по-умолчанию:
* **left: -10**, левая граница графика
* **right: 10**, правая граница графика
* **bottom: -5**, нижняя граница графика
* **top: 5**, верхняя граница графика
* **width: 800**, ширина графика в пикселях
* **height: 600**, высота графика в пикселях
* **stroke: "#000000"**, цвет рамки графика
Есть еще несколько других свойств, которые я намеренно не перечисляю. Какие-то из них лучше не трогать, а изменение других может привести к падению программы.
Функции-рисовалки -- главное, что есть у `Plotter`, и основная фишка библиотеки. С помощью них можно много рисовать, но писать мало кода. Пример вызова функции, которая нарисует график sin(x):
```javascript
var func = plotter.addFunc(function (x) {
return Math.sin(x);
}, options);
```
Существуют методы для добавления закрашенной области, линии, точки и функции. Каждый метод возвращает объект. у которого есть методя для его модификации. Например, `Plotter.addFunc` вернет объект функции, у которого можно будет поменять цвет, границы прорисовки, точность, толщину, точки разрыва и даже саму функцию.
### Методы Plotter
О конструкторе Plotter я уже рассказал.Теперь я расскажу о том, что делать с объектом, которые возвращает конструктор. У него есть несколько методов:
##### Plotter.addFunc(Function, Object)
Первый аргумент - это функция, которую нужно нарисовать. Второй *необязательный* аргумент - это объект, в котором можно менять некоторые свойства.
* **accuracy: Plotter.width**, точность прорисовки графика. По-умолчанию равна ширине графика в пикселях. Количество точек, по которым строится график.
* **strokeWidth: 2**, толщина линии графика
* **color: 0**, цвет. Нулевой цвет -- это синий. Если менять это свойство вручную, без вызова метода setColor, то нужно указывать цвет в формате rgb. Первый символ должен быть решеткой, а дальше следуют 6 шестнадцатиричныных цирф: `"#FF0000"` - красный. Лучше не менять это свойство напрямую, а использовать сеттер, так как в нем можно выбрать цвет из заранее заданного набора.
* **breaks: []**, массив точек разрыва. Когда строится график функции, у которой есть разрывы, то здесь их нужно указать. Например, у графика сигнума точкой разрыва будет 0. Такая же точка разрыва будет у гиперболы и у графика sin(x)/x.
* **left: null**, левая граница прорисовки. Левее нее график никогда не будет рисоваться. `null` означает, что границы нет.
* **right: null**, правая граница прорисовки. Правее нее график никогда не будет рисоваться. `null` означает, что границы нет.
##### Методы Func
Вот построена функци и получен объект типа `Func`:
```javascript
var func = plotter.addFunc(function (x) {
return x;
});
```
Можно, например, поменять цвет:
```javascript
func.setColor(7); //поменяет цвет на красный.
```
Можно получить цвет:
```javascript
func.getColor(); //"#d62728" -- тот, который был установлен. Цвет всегда возвращается в формате rgb.
```
Можно делать и то, и другое с помощью одного метода:
```javacript
func.Color(9); //вызов .Color() с аргументом поменяет цвет. Сейчас был установлен фиолетовый.
func.Color(); //вызов .Color() без аргументов просто вернет текущий цвет. Будет возвращен rgb-код фиолетового: "#9467bd".
```
Я показал примеры использования методов Func. Какие вообще методы у него есть?
* **Func.getAccuracy()**, вернет текущую точность прорисовки
* **Func.setAccuracy(Number)**, установит указанную точность прорисовки. Число должно быть целым.
* **Func.Accuracy(Number)**, если передать *необязательный* аргумент, то установит точность прорисовки. Если не указывать, то вернет текущую точность прорисовки.
---
* **Func.getStrokeWidth()**, вернет текущую толщину линии графика.
* **Func.setStrokeWidth(Number)**, установит указанную толщину.
* **Func.StrokeWidth(Number)**, если передать *необязательный* аргумент, то установит толщину. Если не указывать, то вернет текущую толщину.
---
* **Func.getColor()**, вернет текущий цвет в формате rgb.
* **Func.setColor(Number or String)**, установит указанный цвет. Если передавать строку, то она должна быть в формате rgb, то есть первый символ - решетка, а дальше 6 шестандцатиричных цифр. Если передавать число, то оно может быть от 0 до 20 включительно. 20 соответствует черному цвету. Остальные номера соответсвуют этим цветам: https://github.com/mbostock/d3/wiki/Ordinal-Scales#category20
* **Func.Color(Number or String)**, аргумент необязателен. Если он есть, тобудет установлен указанный цвет, как в `.setColor(Number or String)`. Если его нет, то будет возвращен текущий цвет в формате rgb.
---
* **Func.getColour()**, алиас для `.getColor()`
* **Func.setColour(Number or String)**, алиас для `.setColor(Number or String)`
* **Func.Colour(Number or String)**, алиас для `.Color(Number or String)`
---
* **Func.getBreaks()**, вернет массив точек разрыва. Модификации в этом массиве приведут к изменениям в массиве внутри объекта. Иначе говоря, копия не создается. При необходимости копию можно создать с помощью `var newArr = _.clone(arr);`. В сборку скелетона уже включен lodash 2.4.1, набор утилит для js. Подробнее: https://lodash.com/
* **Func.setBreaks(Array)**, установит указанный массив точек разрыва. Копия при этом создаваться не будет.
* **Func.Breaks(Array)**, если *необязательный* аргумент указан, то установит новый массив точек разрыва. Если нет, то вернет текущий массив.
---
* **Func.getLeft()**, вернет левую границу прорисовки.
* **Func.setLeft(Number)**, установит левую границу прорисовки.
* **Func.Left(Number)**, если *необязательный* аргумент указан, то установит левую границу прорисовки. Иначе вернет текущую.
---
* **Func.getRight()**, вернет правую границу прорисовки.
* **Func.setRight(Number)**, установит правую границу прорисовки.
* **Func.Right(Number)**, если *необязательный* аргумент указан, то установит правую границу прорисовки. Иначе вернет текущую.
---
* **Func.getFunc()**, вернет текущую функцию.
* **Func.setFunc(Function)**, установит функцию.
* **Func.Func(Function)**, если аргумент указан, то установит функцию. Если нет, то вернет текущую функцию.
---
##### Plotter.addLine(x1, y1, x2, y2, Object)
Первые четыре аргумента задают координаты двух точек, по которым будет строиться отрезок. Последний *необязательный* аргумент - это объект, в котором можно передавать опции. Слева указано имя свойства, а справа - его значение по-умолчанию.
* **strokeWidth: 2**, толщина линии
* **color: 0**
##### Методы Line
* **Line.setX1(x1)**
* **Line.getX1()**
* **Line.X1(x1)**, принимает *необязательный* аргумент. Если он задан, то устанавливает x1. Иначе возвращает текущее значение x1.
---
* **Line.setX2(x2)**
* **Line.getX2()**
* **Line.X2(x2)**, принимает *необязательный* аргумент. Если он задан, то устанавливает x2. Иначе возвращает текущее значение x2.
---
* **Line.setY1(y1)**
* **Line.getY1()**
* **Line.Y1(y1)**, принимает *необязательный* аргумент. Если он задан, то устанавливает y1. Иначе возвращает текущее значение y1.
---
* **Line.setY2(y2)**
* **Line.getY2()**
* **Line.Y2(y2)**, принимает *необязательный* аргумент. Если он задан, то устанавливает y2. Иначе возвращает текущее значение y2.
---
* **Line.getColor()**, вернет текущий цвет в формате rgb.
* **Line.setColor(Number or String)**, установит указанный цвет. Если передавать строку, то она должна быть в формате rgb, то есть первый символ - решетка, а дальше 6 шестандцатиричных цифр. Если передавать число, то оно может быть от 0 до 20 включительно. 20 соответствует черному цвету. Остальные номера соответсвуют этим цветам: https://github.com/mbostock/d3/wiki/Ordinal-Scales#category20
* **Line.Color(Number or String)**, аргумент необязателен. Если он есть, тобудет установлен указанный цвет, как в `.setColor(Number or String)`. Если его нет, то будет возвращен текущий цвет в формате rgb.
---
* **Line.getColour()**, алиас для `.getColor()`
* **Line.setColour(Number or String)**, алиас для `.setColor(Number or String)`
* **Line.Colour(Number or String)**, алиас для `.Color(Number or String)`
---
##### Plotter.addArea(Array, Object)
Строит произвльную закрашенную область на графике. Для построения нужно передать в качестве первого аргумента массив точек. Каждая точка - это объект, у которого есть два поля: x и y.
```javascript
var arr = [];
arr.push({
x: 0,
y: 0
});
arr.push({
x: 1,
y: 0
});
arr.push({
x: 0.5,
y: 1
});
var area = Plotter.addArea(arr);
```
Второй *необязательный* аргумент `.addLine` - объект с опциями. Можно менять следующие свойства:
* **color: 20**, цвет границы области. По-умолчанию черный.
* **fillOpacity: 0.2**, прозрачность закраски области. Может меняться от 0 до 1, где 1 - непрозрачная, а 0 - полностью прозрачная, невидимая.
* **strokeWidth: 0**, толщина границы области. По-молчанию толщина нулевая, то есть граница невидимая
* **fill: 1**, цвет закраски области.
##### Методы Area
* **Area.getColor()**, вернет текущий цвет в формате rgb.
* **Area.setColor(Number or String)**, установит указанный цвет. Если передавать строку, то она должна быть в формате rgb, то есть первый символ - решетка, а дальше 6 шестандцатиричных цифр. Если передавать число, то оно может быть от 0 до 20 включительно. 20 соответствует черному цвету. Остальные номера соответсвуют этим цветам: https://github.com/mbostock/d3/wiki/Ordinal-Scales#category20
* **Area.Color(Number or String)**, аргумент необязателен. Если он есть, тобудет установлен указанный цвет, как в `.setColor(Number or String)`. Если его нет, то будет возвращен текущий цвет в формате rgb.
---
* **Area.getColour()**, алиас для `.getColor()`
* **Area.setColour(Number or String)**, алиас для `.setColor(Number or String)`
* **Area.Colour(Number or String)**, алиас для `.Color(Number or String)`
---
* **Area.setFill(Number or String)**, устанавливает цвет заливки области. Работает также, как и `.setColor`
* **Area.getFill()**, возвращает цвет заливки области
* **Area.Fill(String or Number)**, принимает *необязательный* аргумент. Если он есть, то устанавливает указанный цвет, иначе возвращает текущий цвет.
---
* **Area.setFillOpacity(Number)**, принимает число от 0 до 1 и устанавливает указанную прозрачность заливки.
* **Area.getFillOpacity()**, возвращает текущую прозрачность заливки.
* **Area.FillOpacity(Number)**, принимает *необязательный* аргумент. Если он есть, то устанваливает указанную прозрачность, иначе возвращает текущую.
---
* **Area.getStrokeWidth()**, вернет текущую толщину границы области.
* **Area.setStrokeWidth(Number)**, установит указанную толщину.
* **Area.StrokeWidth(Number)**, если передать *необязательный* аргумент, то установит толщину. Если не указывать, то вернет текущую толщину.
---
##### Plotter.addPoint(x, y, Object)
Рисует точку по указанным координатам. Третьеим *необязательным* аргументом можно передать некоторые свойства:
* **movable: false**, можно ли точку перетаскивать мышкой. По-умолчанию нельзя.
* **color: 6**
* **size: 3**, размер точки
##### Методы Point
* **Point.setSize(size)**, меняет размер точки. Можно передать либо неотрицательное число, либо одну из четырех строк: "large", "medium", "small", "tiny".
* **Point.getSize()**, возвращает текущий размер
* **Point.Size(size)**, принимает *необязательный* аргумент. Если он есть, то устанавливает размер, иначе возвращает текущий размер.
---
* **Point.getX()**
* **Point.setX(x)**
* **Point.X(x)**, аргумент необязательный.
---
* **Point.getY()**
* **Point.setY(y)**
* **Point.Y(y)**, аргумент необязательный.
---
* **Point.getColor()**, вернет текущий цвет в формате rgb.
* **Point.setColor(Number or String)**, установит указанный цвет. Если передавать строку, то она должна быть в формате rgb, то есть первый символ - решетка, а дальше 6 шестандцатиричных цифр. Если передавать число, то оно может быть от 0 до 20 включительно. 20 соответствует черному цвету. Остальные номера соответсвуют этим цветам: https://github.com/mbostock/d3/wiki/Ordinal-Scales#category20
* **Point.Color(Number or String)**, аргумент необязателен. Если он есть, тобудет установлен указанный цвет, как в `.setColor(Number or String)`. Если его нет, то будет возвращен текущий цвет в формате rgb.
---
* **Point.getColour()**, алиас для `.getColor()`
* **Point.setColour(Number or String)**, алиас для `.setColor(Number or String)`
* **Point.Colour(Number or String)**, алиас для `.Color(Number or String)`
---
##### Остальные методы Plotter
Помимо рисования объектов, Plotter еще отвечает за учет всех созданных объектов. Если нужно удалить какой-нибудь, то нужно вызвать метод `.remove`:
```javascript
var point = plotter.addPoint(1, 1);
plotter.remove(point);
```
В некоторых случаях может помочь вызов методов `Plotter.draw()` или, что то же самое, `Plotter.redraw()`. В текущей версии их использовать не нужно.
Также можно узнать id элемента, к которому привязан график: `Plotter.getID()`
# PlotContainer, несколько графиков на одной странице
Как и Plotter, PlotContainer является глобальным объектом. Он служит для того, чтобы DOM-элемент с указанным ID работал в качестве контейнера для других DOM-элементов, которые, в свою очередь могут содержать либо графики, либо произвольный
html-код.
Проще говорить, что PlotContainer - это контейнер, который хранит в себе несколько Plotter'ов.
`Plotter PlotContainer.addPlot(options)` добавляет в DOM-контейнер график и возвращает его. Возвращает то же самое, что и конструктор Plotter. Опции те же самые, что и у Plotter.
`DOM_ID PlotContainer.addEmptyDiv()` создает в контейнере пустой
и возвращает его ID. Можно использовать, например, для дальнейшей работы с Controls.
Инициализация контейнера и создание графика в нем:
```javascript
var container = new PlotContainer("plot");
var plotter = container.addPlot();
```
Второй график можно создать также, как и первый:
```javascript
var plotter2 = container.addPlot();
```
Кроме того, в метод можно передавать опции, как это делает с конструктором Plotter:
```javascript
var plotter3 = container.addPlot({
width: 400,
height: 400
});
```
#Примеры
Их можно посмотреть в папке scripts. В index.html можно менять имя подключаемого файла, чтобы смотреть разные примеры.