うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

自由な点オブジェクトを、自由に泳がせるJavaScript

 ここでは、自由な点オブジェクトAを、画面上を自由に泳がせるための方法を説明する。

ステップ1:グローバルJavaScriptに以下を記述する
//str pointName
function letPointSwim(pointName) {
    //オブジェクト存在確認
    var isexist = ggbApplet.exists(pointName);
    if (!isexist) {
        return;
    }

    //スライダー
    ggbApplet.evalCommand('sliderOf' + pointName + ' = Slider( 0, 1, 0.001, 3, 200, false, true, true, false )');

    //ランダム点
    ggbApplet.evalCommand('StartOf' + pointName + '=CopyFreeObject((x(' + pointName + '),y(' + pointName + ')))');
    ggbApplet.evalCommand('MidOf' + pointName + '=CopyFreeObject((RandomBetween(10*ceil(x(Corner(1))),10*floor(x(Corner(2))))/10,RandomBetween(10*ceil(y(Corner(1))),10*floor(y(Corner(3))))/10))');
    ggbApplet.evalCommand('GoalOf' + pointName + '=CopyFreeObject((RandomBetween(10*ceil(x(Corner(1))),10*floor(x(Corner(2))))/10,RandomBetween(10*ceil(y(Corner(1))),10*floor(y(Corner(3))))/10))');

    //スプライン
    ggbApplet.evalCommand('curveOf' + pointName + '=Spline({StartOf' + pointName + ', MidOf' + pointName + ', GoalOf' + pointName + '}, 3)');

    //スプライン上の点
    ggbApplet.evalCommand('onCurvePointOf' + pointName + ' = Point(curveOf' + pointName + ', sliderOf' + pointName + ')');

    //補助オブジェクトにする
    ggbApplet.setAuxiliary('StartOf' + pointName, true);
    ggbApplet.setAuxiliary('MidOf' + pointName, true);
    ggbApplet.setAuxiliary('GoalOf' + pointName, true);
    ggbApplet.setAuxiliary('curveOf' + pointName, true);
    ggbApplet.setAuxiliary('onCurvePointOf' + pointName, true);

    //不可視にする
    ggbApplet.setVisible('sliderOf' + pointName, false);
    ggbApplet.setVisible('StartOf' + pointName, false);
    ggbApplet.setVisible('MidOf' + pointName, false);
    ggbApplet.setVisible('GoalOf' + pointName, false);
    ggbApplet.setVisible('curveOf' + pointName, false);
    ggbApplet.setVisible('onCurvePointOf' + pointName, false);

    //スクリプト記述
    setGgbScript('sliderOf' + pointName, 'udt', 'If[sliderOf' + pointName + '>0.8,Execute[{"SetValue[StartOf' + pointName + ',onCurvePointOf' + pointName + ']","SetValue[MidOf' + pointName + ',GoalOf' + pointName + ']","SetValue[GoalOf' + pointName + ',(RandomBetween(10*ceil(x(Corner(1))),10*floor(x(Corner(2))))/10,RandomBetween(10*ceil(y(Corner(1))),10*floor(y(Corner(3))))/10)]"}]]
If[sliderOf' + pointName + '>0.8,SetValue[sliderOf' + pointName + ',0]]
UpdateConstruction[]
SetValue[' + pointName + ',onCurvePointOf' + pointName + ']');
}

//handlerは、'click 'ならonClick、それ以外ならonUpdate
function setGgbScript(objName, handler, script) {
    //オブジェクト存在確認
    var isexist = ggbApplet.exists(objName);
    if (isexist) {
        var objType = ggbApplet.getObjectType(objName);
        var onwhat = (handler == 'click') ? 'val' : 'onUpdate';
        var xmlText = '<element type=\"' + objType + '\" label=\"' + objName + '\"><ggbscript ' + onwhat + '=\"' + script + '\"/></element>';
        ggbApplet.evalXML(xmlText);
    }
}
ステップ2:ボタン等のオブジェクトを作成し、On Click スクリプトに、以下のJavaScriptを記述する
letPointSwim('A');
ステップ3:作成されたスライダーオブジェクトのアニメーションを開始する

 

以上です。

 

使用例

https://www.geogebra.org/m/pbntx9xk

固定点を作成するオリジナルツール「fPoint」

www.geogebra.org

 

f:id:usiblog:20200912124315g:plain

普通に点を作成したあと、オブジェクトを固定したり、選択不許可にすれば良いのですが、最初から固定点として作りたい場面もあったので、オリジナルツールにしてみました。