Эта статья — о JSXGraph, написанной на JavaScript библиотеке для отображения геометрических чертежей в веб-браузере
Одной из задач, которые необходимо решать при преподавании геометрии, это обеспечение наглядности, в частности, наглядности геометрических чертежей. Двумя современными способами обеспечения наглядности геометрических чертежей являются динамичность и интерактивность:
Существует большое количество так называемых интерактивных геометрических сред, которые позволяют создавать геометрические чертежи, являющиеся и интерактивными, и динамическими.
Первой интерактивной геометрической средой была программа Geometric Supposer, разработанная командой из Массачусетского технологического института под руководством Иуды Л. Шварца для компьютеров Apple II в начале восьмидесятых годов прошлого века. Развитие этой программы продолжается в Израиле для Windows, но сведений о ней очень мало.
Второй такой программой стала Cabri, разаработанная в 1986 году. Она до сих пор активно развивается и является одной из самых распространённых.
Третьей интерактивной геометрической средой стала The Geometer's Sketchpad, которую разработал Nick Jackiw в 1991 году. Тоже активно развивается и является самой популярной в США.
Обо всех геометрических средах рассказывать не буду — их много, многие из них мало распространены, да и не обо всех я знаю. Упомяну ещё о GeoGebra, GEONExT, Cinderella, TracenPoche. Почему именно эти, дальше станет понятно. Ну и по патриотическим соображениям упомяну ещё 1С: Математический конструктор. По своим характеристикам, кстати, она ничуть не хуже других. Правда, на мой взгляд, и не лучше. Того же класса.
Разработку Геогебры начал в 2001 году Markus Hohenwarter в Зальцбургском университете и сейчас продолжает Michael Borcherds в Университете Иоганна Кеплера в Линце.
GEONExT разработал Alfred Wassermann в Байротском университете на основе программы GEONET (http://did.mat.uni-bayreuth.de/geonet/index.html), прототип которой был создан в 1997 году.
Программу Cinderella написали Ulrich Kortenkamp и Jürgen Richter-Gebert в 1998 году.
TracenPoche написали Jean-Philippe Vanroyen и Emmanuel Ostenne, в каком году, установить не удалось.
Большинство ИГС написаны на Яве или имеют написанный на Яве просмотрщик. Это позволяет работать с такими чертежами в любом современном браузере, что обеспечивает практически всеплатформенность. Однако аплеты имеют некоторые недостатки, не будем о них здесь говорить подробно, они хорошо известны. Это во-первых.
Во-вторых, у каждой такой программы свой формат файла чертежа. Это приводит к даже не к дублированию, а к многократному повторению одной и той же работы.
Поэтому разработки интерактивных геометрических сред продолжаются.
JSXGraph — написанная на JavaScript библиотека для отображения геометрических чертежей в веб-браузере. Она предоставляет API, используемый в скриптах, импортирующих файлы геометрических чертежей на страницу. JSXGraph, как и GEONExT, разработана в Байротском университете. Собственно, JSXGraph как раз в первую очередь и предназначена для отображения чертежей, созданных в GEONExT. Поэтому этот фотмат практически полностью поддерживается. Кроме того, поддерживаются форматы GeoGebra, Cinderella, TracenPoche (поэтому я и упомянул эти программы в предыдущем разделе) и Intergeo. Intergeo – это общеевропейский проект, цель которого заключается в разработке универсального форамата файла геометрического чертежа. Таким образом получается, что эта библиотека проктически всеплатформенная во всех смыслах этого слова.
Тот же самый API может быть использован для построения чертежей с нуля или для изменения загруженных готовых чертежей, то есть для создания полноценной он лайн интерактивной геометрической среды.
Итак, что же нужно сделать, чтобы включить интерактивный геометрический чертеж в веб страницу? Нужны три действия:
Существуют две основные команды:
Точки могут быть свободными (их можно двигать мышкой), фиксированными (их двигать мышкой невозможно) и зависимыми (их движение зависит от движения другого объекта, а мышкой их двигать тоже невозможно).
По умолчанию создаётся свободная точка:
Вот так это выглядит в JSFiddle: jsfiddle.net/AndreyDolgov/fbha4/embedded/result%2Chtml%2Cjs.
На чертеже точка
Примеры:
Луч и отрезок с точки зрения JSXGraph – это те же прямые, но с другими атрибутами
Пример:
Пример:
Пример:
Пример:
Ну вот, мы познакомились с простыми элементами геометрических чертежей, создаваемых с помощью библиотеки JSXGraph. Я думаю, что для введения этого достаточно.
Дальше — серия «JSXGraph в примерах».
Интерактивные геометрические среды
Одной из задач, которые необходимо решать при преподавании геометрии, это обеспечение наглядности, в частности, наглядности геометрических чертежей. Двумя современными способами обеспечения наглядности геометрических чертежей являются динамичность и интерактивность:
- Динамические геометрические чертежи — это по своей сути геометрические модели, которые содержат в себе не просто изображение, а весь алгоритм, на основе которого это изображение строится. В результате чертёж может изменяться при изменении положения его элементов, а связи между элементами остаются при этом неизменными. Поэтому ученик имеет дело фактически не с одной геометрической фигурой, а с целым классом фигур.
- Интерактивные геометрические чертежи — это чертежи, которые могут изменяться как учителем, так и учениками в процессе и после окончания построения. Это позволяет организовать взаимодействие между учеником и учителем через такой чертёж.
Существует большое количество так называемых интерактивных геометрических сред, которые позволяют создавать геометрические чертежи, являющиеся и интерактивными, и динамическими.
Первой интерактивной геометрической средой была программа Geometric Supposer, разработанная командой из Массачусетского технологического института под руководством Иуды Л. Шварца для компьютеров Apple II в начале восьмидесятых годов прошлого века. Развитие этой программы продолжается в Израиле для Windows, но сведений о ней очень мало.
Второй такой программой стала Cabri, разаработанная в 1986 году. Она до сих пор активно развивается и является одной из самых распространённых.
Третьей интерактивной геометрической средой стала The Geometer's Sketchpad, которую разработал Nick Jackiw в 1991 году. Тоже активно развивается и является самой популярной в США.
Обо всех геометрических средах рассказывать не буду — их много, многие из них мало распространены, да и не обо всех я знаю. Упомяну ещё о GeoGebra, GEONExT, Cinderella, TracenPoche. Почему именно эти, дальше станет понятно. Ну и по патриотическим соображениям упомяну ещё 1С: Математический конструктор. По своим характеристикам, кстати, она ничуть не хуже других. Правда, на мой взгляд, и не лучше. Того же класса.
Разработку Геогебры начал в 2001 году Markus Hohenwarter в Зальцбургском университете и сейчас продолжает Michael Borcherds в Университете Иоганна Кеплера в Линце.
GEONExT разработал Alfred Wassermann в Байротском университете на основе программы GEONET (http://did.mat.uni-bayreuth.de/geonet/index.html), прототип которой был создан в 1997 году.
Программу Cinderella написали Ulrich Kortenkamp и Jürgen Richter-Gebert в 1998 году.
TracenPoche написали Jean-Philippe Vanroyen и Emmanuel Ostenne, в каком году, установить не удалось.
Большинство ИГС написаны на Яве или имеют написанный на Яве просмотрщик. Это позволяет работать с такими чертежами в любом современном браузере, что обеспечивает практически всеплатформенность. Однако аплеты имеют некоторые недостатки, не будем о них здесь говорить подробно, они хорошо известны. Это во-первых.
Во-вторых, у каждой такой программы свой формат файла чертежа. Это приводит к даже не к дублированию, а к многократному повторению одной и той же работы.
Поэтому разработки интерактивных геометрических сред продолжаются.
JSXGraph
JSXGraph — написанная на JavaScript библиотека для отображения геометрических чертежей в веб-браузере. Она предоставляет API, используемый в скриптах, импортирующих файлы геометрических чертежей на страницу. JSXGraph, как и GEONExT, разработана в Байротском университете. Собственно, JSXGraph как раз в первую очередь и предназначена для отображения чертежей, созданных в GEONExT. Поэтому этот фотмат практически полностью поддерживается. Кроме того, поддерживаются форматы GeoGebra, Cinderella, TracenPoche (поэтому я и упомянул эти программы в предыдущем разделе) и Intergeo. Intergeo – это общеевропейский проект, цель которого заключается в разработке универсального форамата файла геометрического чертежа. Таким образом получается, что эта библиотека проктически всеплатформенная во всех смыслах этого слова.
Тот же самый API может быть использован для построения чертежей с нуля или для изменения загруженных готовых чертежей, то есть для создания полноценной он лайн интерактивной геометрической среды.
Инициализация
Итак, что же нужно сделать, чтобы включить интерактивный геометрический чертеж в веб страницу? Нужны три действия:
- Подключить файлы JSXGraph. Это файлы jsxgraph.css и jsxgraphcore.js. Делаем это как обычно:
<link rel="stylesheet" type="text/css" href="domain/jsxgraph.css"/> <script type="text/javascript" src="domain/jsxgraphcore.js"></script>
domain
— это место расположения файлов JSXGraph. Это может быть локальная директория или jsxgraph.uni-bayreuth.de/distrib - Создать HTML элемент, содержащий чертёж:
где<div id="elementID"></div>,
elementID
— идентификатор элемента,elementClass
— класс элемента. Естественно, может быть задан стиль элемента любым известным способом. - Инициализировать “чертёжную доску”:
гдеvar brd = JXG.JSXGraph.initBoard('elementClass',{attributes}),
elementClass
– класс элемента,attributes
– атрибуты “доски”, которые задают её свойства: размеры, сохранение пропорций, видимость осей, сетки, кнопок навигации и уведомления о правах.
Построение геометрических объектов
Существуют две основные команды:
- Команда создания элемента
гдеvar el = brd.create('type',[parents],{attributes});
type
— тип объекта (точка, линия и так далее),
[parents]
— массив родительских элеметнтов (например, две точки для линии),
attributes
— атрибуты (их рассмотрим позже). - Команда задания свойств элемента
гдеel.setProperty({key1:value1,key2:value2,...});
keyN
— имя энного свойства, valueN — значение энного свойства.
Точка
Простейшая команда создания точки выглядит так:var el = brd.create('point',[x, y]);
Имя точки задаётся с помощью атрибута name
(например, {name:'A'}
).Точки могут быть свободными (их можно двигать мышкой), фиксированными (их двигать мышкой невозможно) и зависимыми (их движение зависит от движения другого объекта, а мышкой их двигать тоже невозможно).
По умолчанию создаётся свободная точка:
var p0 = board.create('point',[-1, 1], {name:'A'});
Если атрибуту fixed
присвоить значение true
, то будет создана фиксированная точка:var pl = board.create('point',[1, -1], {name:'B', fixed:true});
Если в качестве значения хотя бы одной из коордитнат точки задать функцию без параметров, возвращающую число, то будет создана зависимая точка:var p2 = board.create('point',[function(){return p0.X()}, -2], {name:'С'});
Вот так это выглядит в JSFiddle: jsfiddle.net/AndreyDolgov/fbha4/embedded/result%2Chtml%2Cjs.
На чертеже точка
A
— свободная, точка B
— фиксированная, точка C
— зависимая от точки A
.Прямая, луч, отрезок
Прямая может быть задана двумя способами:- Двумя точками
Точки могут быть заданы или именами объектов, или непосредственно координатами (в этом случае точка невидима).board.create('line',[point1, point2])
- Уравенением
ax+by+c=0
(обратите внимание на порядок коэффициентов в команде)
board.create('line',[c, a, b])
Примеры:
var p1 = board.create('point',[0,0],{name:'A'});
var p2 = board.create('point',[3,2],{name:'B'});
var l1 = board.create('line',[p1,p2]);
var l2 = board.create('line',[p1,[1,5]]);
В JSFiddle: fiddle.jshell.net/AndreyDolgov/tybTW/show/light.var l3 = board.create('line',[-1.0,-2.0,1.0]);
В JSFiddle: fiddle.jshell.net/AndreyDolgov/2A8Xa/show/light.Луч и отрезок с точки зрения JSXGraph – это те же прямые, но с другими атрибутами
straightFirst
и straightLast
. Если один из этих атрибутов равен false
, то мы получим луч, если оба – отрезок.Пример:
var p1 = board.create('point',[-2,-1],{name:'A'});
var p2 = board.create('point',[3,-2],{name:'B'});
var p3 = board.create('point',[-3,2],{name:'C'});
var l1 = board.create('line',[p1,p2],{straightFirst:false});
var l2 = board.create('line',[p1,p3],{straightLast:false});
var l3 = board.create('line',[p2,p3],{straightFirst:false,straightLast:false});
В JSFiddle: fiddle.jshell.net/AndreyDolgov/yKxku/show/light.Окружность
Окружность может быть построена четырьмя способами:- По центру и точке на окружности.
Если аргументов два, то они интерпретинуются как центр и точка на окружнсти.board.create('circle',[centerPoint,pointOnCircle]);
Например:
В JSFiddle: fiddle.jshell.net/AndreyDolgov/A3JMq/show/light.var center = board.create('point',[3,3],{name:'O'}); var ptOnCir = board.create('point',[4,5],{name:'A'}); var с = board.create('circle',[center,ptOnCir]);
Как всегда, точка может быть задана или именем переменной, или непосредственно координатами. Если точка задана непосредственно координатами, она не видна.
Например:
В JSFiddle: fiddle.jshell.net/AndreyDolgov/9FgfW/show/light.var theCircle = board.create('circle',[[3,3],[4,5]]);
- По центру и радиусу.
Когда второй аргумент является числом, оно интерпретируется как радиус.board.create('circle',[centerPoint,radiusOfCircle]);
Например:
В JSFiddle: fiddle.jshell.net/AndreyDolgov/VSRUx/show/light.var center = board.create('point',[3,3]);var theCircle = board.create('circle',[center,1]);
- По центру и другой окружности с известным радиусом.
Если второй аргумент – это окружность, то ее радиус используется для построения новой окружности.board.create('circle',[centerPoint,circleWithDesiredRadius]);
Например:
В JSFiddle: fiddle.jshell.net/AndreyDolgov/aYezn/show/light.var circle1 = board.create('circle',[[0,1],[0,2]]);var circle2 = board.create('circle',[[0,3],circle1]);
- По трём точкам.
Если аргументов три, то они интерпретируются как три точки, через которые строится окружность.board.create('circle',[point1,point2,point3]);
Например:
В JSFiddle: fiddle.jshell.net/AndreyDolgov/vRW3z/show/lightvar p1 = board.create('point',[2,1],{name:'p1',size:2}); var p2 = board.create('point',[2,5],{name:'p2',size:2}); var p3 = board.create('point',[4,3],{name:'p3',size:2}); var c = board.create('circle',[p1,p2,p3]);
Многоугольник
Многоугольник задают массивом вершин.board.create('polygon',[ptVertex1,ptVertex2,...]);
При этом первым и последним элементом массива должна былть одна и та же вершина. Если этого не сделать, то первая вершина автоматически дублируются в качестве последней.Пример:
p1 = board.create('point',[0,0],{name:''});
p2 = board.create('point',[1,3],{name:''});
p3 = board.create('point',[5,5],{name:''});
p4 = board.create('point',[4,2],{name:''});
board.create('polygon',[p1,p2,p3,p4]);
В JSFiddle: jsfiddle.net/AndreyDolgov/Fp3VM/show/light.Коническое сечение
Может быть задано двумя способами:- Пятью точками
board.create('conic',[point1,point2,point3,point4,point5]);
- Шестью элементами матрицы
board.create('conic',[a11,a22,a33,a21,a31,a32]);
p1 = board.create('point',[0,0],{name:'p1'});
p2 = board.create('point',[1,1],{name:'p2'});
board.create('line',[p1,p2],{strokeWidth:1, color:'yellow'});
p3 = board.create('point',[2,3],{name:'p3'});
p4 = board.create('point',[3,4],{name:'p4'});
p5 = board.create('point',[4,1],{name:'p5'});
board.create('conic',[p1,p2,p3,p4,p5], {strokeWidth:4,strokeColor:'green'});
Получим (JSFiddle): jsfiddle.net/AndreyDolgov/DdqvM/show/lightboard.create('conic',[9,4,-11,0,-9,-8]);
Получим: jsfiddle.net/AndreyDolgov/4jTQY/show/light.Кривая
Существуют три типа кривых:- Параметрические кривые.
гдеboard.create('curve',[x,y,a,b]);
x
иy
— функции с одним параметром, возвращающие число,a
иb
задают интервал значений параметра. - Полярные кривые.
гдеboard.create('curve',[functionOfTheta,[xOrigin,yOrigin],optBegValTheta,optEndValTheta]);
functionOfTheta
— функция, аргумент которой — это угол и которая возвращает расстояние от полюса;
[xOrigin,yOrigin]
— координаты полюса;
optBegValTheta
иoptEndValTheta
задают интервал значений угла.. - Графическое представление данных в виде ломаной линии.
гдеboard.create('curve',[xArray,yArray]);
xArray
иyArray
— массив иксов и массив игреков..
board.create('curve', [function(t){return 3*Math.cos(t);}, function(t){ return 3*Math.sin(t);}, 0, Math.PI/2]);
Вот так это будет выглядеть в JSFiddle: jsfiddle.net/AndreyDolgov/9mcAs/show/light.board.create('curve', [function(theta){return theta/17;}, [-2,-1], -8*Math.PI, 8*Math.PI]);
Вот так это будет выглядеть в JSFiddle: jsfiddle.net/AndreyDolgov/XKH6Q/show/light.x = [-4,-3,-2,-1,0,1,2,3,5];
y = [-3,2,3,-1,0,2,1,4,0];
board.create('curve',[x,y]);
Вот так это будет выглядеть в JSFiddle: jsfiddle.net/AndreyDolgov/uKFFV/show/light.График функции
board.create('functiongraph',[functionRule,a,b]);
где functionRule
— функция одного аргумента, возвращающая число,a
и b
задают интервал, на котором определена функция.Пример:
board.create('functiongraph', [function(x){ return (x+1)%(x-1);},1,3]);
Вот так это будет выглядеть: jsfiddle.net/AndreyDolgov/gkfqj/show/light.Текст
board.create('text',[x,y,stringText]);
где первые два аргумента задают положение левого нижнего угла области текста, stringText — строка или функция, возвращающая строку.Пример:
board.create('text',[-5, 2, "<span style='color:yellow;background-color:blue; font-size:50px;'>Это<br>текст.</span>"]);
Получим: jsfiddle.net/AndreyDolgov/YpQkL/show/light.Ну вот, мы познакомились с простыми элементами геометрических чертежей, создаваемых с помощью библиотеки JSXGraph. Я думаю, что для введения этого достаточно.
Дальше — серия «JSXGraph в примерах».