Программный код задач на построение разбивается на две содержательные части: сценарии, обеспечивающие интерактивное рисование, и сценарии проверки ответа.
Пример - №264.
Условие задачи:
Начертите угол, равный 75о, и отделите от него угол, равный 55о. Найдите второй угол.Рисование
Рабочая область Flash-документа показана на рисунке 1.
Экземпляр mc1 видеоклипа Page содержит сценарий "замены" курсора карандашом (см здесь). В ключевом кадре главной временной шкалы свойствам _visible (видимость) объектов dot1, tx1, ln0, mes (сообщение об ошибке) присваиваются значения false (чтобы их не было видно при запуске). Сценарий, отвечающий за добавление новых точек, находится в экземпляре кнопки PageButton, изображение в кадре Hit которого совпадает с mc1.
В ключевом кадре основной временной шкалы определяются пользовательские функции вычисления расстояния между двумя точками и угла поворота линии, соединяющей две точки (т.е. соответствующего экземпляра видеоклипа Line), от вертикальной оси, а также, функции "рисования" точки и "проведения" линии.
Функции рисования точки и проведения линии аналогичны приведенным здесь.
Проверка ответа
Проверка ответа заключается в установлении соответствия между тем, что нарисовано и тем, что написано. Например, если в экземпляре mcans присутствует утверждение "РABC=15о", следует проверить:
Функции, используемые для проверки ответа, определены в ключевом кадре временной шкалы.
//Проверяет, равен ли косинус угла между векторами d2 d1 и d2 d3 величине size
function checkAngle (d1, d2, d3, size)
{
var res = false;
scx = (d1._x-d2._x)*(d3._x-d2._x);
scy = (d1._y-d2._y)*(d3._y-d2._y);
scp = scx+scy; //скалярное произведение (d1d2, d2d3)
norma = Math.sqrt((d1._x-d2._x)*(d1._x-d2._x)+(d1._y-d2._y)*(d1._y-d2._y));
normb = Math.sqrt((d3._x-d2._x)*(d3._x-d2._x)+(d3._y-d2._y)*(d3._y-d2._y));
if (Math.abs(scp/(norma*normb)-size)<0.03)
{ res = true; }
return res;
}
//Проверяет, соединены ли d1, d2, d3 линиями так, чтобы образовывался угол с вершиной d2
function isAngle (d1, d2, d3)
{
var res1 = 0;
var res2 = 0;
for (var i = 0; i<lnum; i++)
{
if ((Lines[i] == d1+d2) || (Lines[i] == d2+d1))
{ res1 = 1; }
if ((Lines[i] == d3+d2) || (Lines[i] == d2+d3))
{ res2 = 1; }
}
return res1*res2;
}
//Общая проверка утверждения номер nm
function checkAnswer (nm)
{
var res = false;
var str = mcans["ans"+nm.toString()]; //str - имя угла
в утверждении номер nm
var nums = new Array(0, 0, 0);
var nam = new Array(str.charAt(0), str.charAt(1), str.charAt(2));
for (var i = 1; i<=4; i++) //Проверка наличия
соответствующих точек
{
for (var j = 0; j<3; j++)
{
if (_root["tx"+i.toString()].a1 == nam[j])
{
nums[j] = i;
j = 3;
}
}
}
if (nums[0]*nums[1]*nums[2] != 0)
//Если все три точки построены
{ //Образуют ли точки нужный угол?
Соединены ли линиями в нужном порядке?
if ((isAngle(nam[0], nam[1], nam[2]) == 1) && checkAngle(_root["dot"+nums[0].toString()],
_root["dot"+nums[1].toString()], _root["dot"+nums[2].toString()], Math.cos(angles[nm-1])))
{ res = true; }
}
return res;
}
//Формирование ответа
function MakeAnswer ()
{
ansarr = new Array(0, 0, 0); //ansarr[i] соответствует i-тому утверждению
for (var i = 1; i<=3; i++)
{
if (checkAnswer(i))
{ ansarr[i-1] = 1; }
else { ansarr[i-1] = 0; }
}
answer = ansarr.join(",")+","+mcans.ans4.toString();
}
onClipEvent (mouseMove)
{
_root.MakeAnswer();
fscommand ("1", _root.answer);
}
Назад | К содержанию |
Далее |