うしブログ

うしブログ

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

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

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

(参考)オリジナルゲーム「折れ線をほどく」使用グローバルJavaScript

function ggbOnInit() {
    RegisterPointUpdateListener('stopMove');
    shuffle();
}

//配列[現在動かしている点の名前,それに最も近い点の名前]を返す。また、ggbConsoleに情報を書き込む。
function getInfo(activePointName) {
    var allPointNameArr = ggbApplet.getAllObjectNames('point'); //全ての点オブジェクトの名前の配列データを取得

    //アクティブな点のindexを取得。indexOfを使いたいんだけど、手元のバージョンのGeoGebraでうまく機能しないからforで代用。spliceも挙動怪しいから、ついでにallPointNameArrからアクティブな点を除いた配列noActivePointNameArrも作成。
    var activePointIndex = -1;
    var noActivePointNameArr = [];
    for (var k = 0; k < allPointNameArr.length; k++) {
        if (allPointNameArr[k] == activePointName) {
            activePointIndex = k;
        } else {
            noActivePointNameArr.push(allPointNameArr[k]);
        }
    }
    var noActiveListForGGB = '{' + noActivePointNameArr.join(',') + '}' //noActivePointNameArrを、GeoGebraのリスト表記{}に整形

    var closestPointIndex = ggbApplet.getValue('IndexOf(ClosestPoint(' + noActiveListForGGB + ', ' + activePointName + '), ' + noActiveListForGGB + ')') - 1; //アクティブな点に最も近い点(自身を除く)の、noActivePointNameArr上のindexを取得(noActiveListForGGB上のインデックス〔1から始まる〕にマイナス1することで、インデックス番号0から始まるnoActivePointNameArrに合わせている)

    var closestPointName = noActivePointNameArr[closestPointIndex]; //最も近い点の名前

    ggbApplet.setTextValue('ggbConsole', 'アクティブな点:' + activePointName + ', 最も近い点:' + closestPointName); //ggbConsoleに書き込む

    return ['' + activePointName, '' + closestPointName]; //情報吐き出し
}

//すべての点にのみUpdateListenerを登録する
function RegisterPointUpdateListener(jsFunctionName) {
    var allPointNameArr = ggbApplet.getAllObjectNames('point'); //全ての点オブジェクトの名前の配列データを取得
    for (var k = 0; k < allPointNameArr.length; k++) {
        ggbApplet.registerObjectUpdateListener(allPointNameArr[k], jsFunctionName);
    } //登録
}

//現在動かしている点が、最も近い他の点と距離r未満になったとき、動きを止める
function stopMove(activePointName) {
    var info = getInfo(activePointName);
    var P = info[0]; //現在動かしている点
    var C = info[1]; //最も近い点

    //ggbApplet.evalCommand('If[Length[{Intersect[Circle[' + P + ',r],i]}]>2,SelectObjects[]]'); //点を強制的に離させる
    ggbApplet.evalCommand('If[Distance[' + P + ',' + C + ']<2*r||Length[{Intersect[Circle[' + P + ',r],i]}]>2,SelectObjects[]]'); //点を強制的に離させる
    //ggbApplet.evalCommand('If[Distance[' + P + ',' + C + ']<2*r,SetValue[' + P + ',Rotate[Dilate[' + P + ',2*r/Distance[' + P + ',' + C + '],' + C + '],0°,' + C + ']]]'); //距離2rのところまで戻す

}

function shuffle() {
    var allPointNameArr = ggbApplet.getAllObjectNames('point'); //全ての点オブジェクトの名前の配列データを取得
    for (var k = 0; k < allPointNameArr.length; k++) {
        ggbApplet.evalCommand('SetValue[' + allPointNameArr[k] + ',(RandomBetween[-50,50]/10,RandomBetween[-50,50]/10)]');
    }
}