jourfixe wrote:
> Можно я иногда буду в эту ветку глупые вопросы задавать?
Да ради Будды
Ок.
Один глюпый вопрос есть сразу же. Даже не один, как выясняется. Миша Домнич, спрашиваю и тебя тож.
jourfixe wrote:
Зы. Вообще, это порочная практика - писать функции так, что вместо входных параметров они используют глобальные переменные. Функция по возможности должна быть независима от глобального состояния. "Чистая" функция при одних и тех же входных параметрах выдаёт один и тот же результат (в определение "чистой" функции входит ещё и отсутствие побочных эффектов, но это отдельная тема).
У меня есть два графических бокса (на самом деле, я хочу больше, но если заработает с двумя - заработает и с пятью).
И я хочу, чтобы когда я тащу точку на одном графике - на втором оно тоже менялось в соответствии.
По минимуму один - родитель, второй - только отвечает.
С полгода назад я пыталась понять, как это сделать по примерам в гугле, но обломалась.
И вот недели полторы назад я ВНЕЗАПНО обнаруживаю, что вот таким макаром я вообще осуществляю кросс-опыление. Тянем за первый - меняется второй, тянем за второй - меняется первый.
(формулы, как они связаны, конечно, сложнее, чем тупое копирование, но не суть).
<jsxgraph width="400" height="600" box="box1">
var board1 = JXG.JSXGraph.initBoard('box1', {boundingbox: [-1.,20.,7.,-2.], axis:true,grid:true,showCopyright:false, showNavigation:false});
var InitX = 3.;
var InitY = 2.;
var p1 = board1.create('point', [InitX , InitY]);
p1.on('drag', Move1);
</jsxgraph>
<jsxgraph width="400" height="600" box="box2">
var board2 = JXG.JSXGraph.initBoard('box2', {boundingbox: [-1.,20.,7.,-2.], axis:true,grid:true,showCopyright:false, showNavigation:false});
var InitX = 3.;
var InitY = 2.;
var p2 = board2.create('point', [InitX , InitY]);
function Move1(){
XNew = p1.X();
YNew = p1.Y();
p2.moveTo([XNew,YNew]);
}
function Move2(){
XNew = p2.X();
YNew = p2.Y();
p1.moveTo([XNew,YNew]);
}
p2.on('drag', Move2);
</jsxgraph>
Причем, заметь иезуитскую хитровыделанность: функцию на драг разных точек я приписываю им в их собственных боардах, а вот сами функции прописываю в самом последнем, когда остальные уже существуют. Получилось случайно - но оно работало!
Кароч, именно в тот момент я словила драйв и наваляла больше тысячи строк кода (тысячу в одном плюс незаконченный второй прымер.
А потом - дрым-с!!! Сначала упала вся мудля, весь сайт не работал. Потом заработал, но без графики. А потом графика вернулась, но перекрестное опыление уже не работает.
Первый вопрос.
Я уже поняла, что, видимо, так делать нехорошо. А как нада? Если, канешн, это не слишком сложно и долго писать.Хуже того - перестали работать работавшие до того довольно простые примеры с одним окном, где, например, функции были присвоены кнопочкам. Функции, вестимо, меняли экран через глобальные переменные, которые были определены в теле главной программы. (Если я вообще правильно употребляю понятие глобальной переменной - кароч, внутри соответствующего <jsxgraph> до того, как встретится </jsxgraph>). В общем, я смотрела примеры в гугле и мараковала и пробовала. Полгода всё работало в лучшем виде, у меня было куча работающих примерчиков. Которые, повторюсь, более не работают.
var button = board1.create('button', [5.,18., 'Start again', StartAgain], {});
function StartAgain(){
p1.moveTo([InitX , InitY]);
}
Второй вопрос.
С кнопочными функциями я тоже накосячила? Так совсем нельзя?
***********************************
Ну и последний вопрос.
Я по твоему наставлению одолела функцию вычисления высоты при падении с заданными параметрами начальной высоты, скорости и ускорения. Определяю ее до того, как создаю боард вот так.
<jsxgraph width="400" height="600" box="box1">
function fall(){
return arguments[1] + arguments[2]*arguments[0]+0.5*arguments[3].*arguments[0]*arguments[0];
}
var board1 = JXG.JSXGraph.initBoard('box1', {boundingbox: [-1.,20.,7.,-2.], axis:true,grid:true,showCopyright:false, showNavigation:false});
time = 3.;
Y0 = 10.;
V0 = 2.;
Accel = -10.;
var yt = board1.create('point', [time , function() {return fall(time , Y0 , V0 , Accel);}]);
Третий вопрос.
Я могу сделать, чтобы из board2 я тоже могла вызывать ту же самую функцию. Потому что сейчас она ее не считает. Только если я ее второй раз пропишу под конструктором второго боарда.
<jsxgraph width="400" height="600" box="box2">
function fall(){
return arguments[1] + arguments[2]*arguments[0]+0.5*arguments[3].*arguments[0]*arguments[0];
}
var board2 = JXG.JSXGraph.initBoard('box2', {boundingbox: [-1.,20.,7.,-2.], axis:true,grid:true,showCopyright:false, showNavigation:false});
Я как-то смутно подозреваю, что это неправильно.
Но мозгов, понять как нада - не хватает.
Я, канешн, не ожидаю, что вы с Домничем кинетесь писать мне код.
По минимуму мне хватит общефилософского объяснения, что и где определяется. Додумывать у меня еще иногда получается.
Но если паче чаяния вы знаете сразу ответ, как надо писать какой-то из трех вопросов (или сразу три?!) - вы меня просто осчастливите.
ЗЫ. Пожалуй, наиважнейший вопрос - четвертый.
Не могла ли я лично уронить общеизраильскую мудлю этими своими экспериментами? Потому что я надеюсь в ближайщие дни добраться до программистов, которые эту систему держат и программируют, и не хотелось бы получить тумаков. Если что - буду заметать следы.