うしブログ

うしブログ

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

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

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

(web版GeoGebra限定)スライダーの情報を取得するJavaScript関数

//スライダーの情報を取得(戻り値eval済み)
function getSliderInfo(name) {
    //xmlデータを取得
    var xmlStr = ggbApplet.getXML(name);

    //DOMにパース
    var parser = new DOMParser();
    var dom = parser.parseFromString(xmlStr, "text/xml");

    //sliderタグ内の情報を取得
    var sld = dom.getElementsByTagName('slider');

    //オブジェクトがスライダーでない場合、undefinedを返して終了
    if (sld.length == 0) {
        return undefined;
    }

    //オブジェクトとしてアウトプット
    var output = new Object();
    for (var k = 0; k < sld[0].attributes.length; k++) {
        var nameText = sld[0].attributes[k].name;
        var val = sld[0].attributes[k].value;
        output[nameText] = eval(val);
    }

    //始点
    var startX = output.x;
    var startY = output.y;
    if (output.absoluteScreenLocation) {
        startX = ggbApplet.getValue('x(Corner[1])+(x(Corner[3])-x(Corner[1]))*((' + startX + '+1)/(x(Corner[5])+2))');
        startY = ggbApplet.getValue('y(Corner[3])-(y(Corner[3])-y(Corner[1]))*((' + startY + '+1)/(y(Corner[5])+2))');
    } //ピクセル座標(画面上固定)の場合
    //console.log('始点:('+startX+','+startY+')');

    //console.log('width='+output.width);

    //終点
    var endX = output.x + (output.horizontal ? output.width : 0);
    var endY = output.y + (output.horizontal ? 0 : output.width);
    if (output.absoluteScreenLocation) {
        endX = ggbApplet.getValue(startX + '+(x(Corner[3])-x(Corner[1]))*((' + (output.horizontal ? output.width : 0) + ')/(x(Corner[5])+2))');
        endY = ggbApplet.getValue(startY + '+(y(Corner[3])-y(Corner[1]))*((' + (output.horizontal ? 0 : output.width) + ')/(y(Corner[5])+2))');
    } //ピクセル座標(画面上固定)の場合
    //console.log('終点:('+endX+','+endY+')');

    //outputに始点・終点情報を記録
    output['startX'] = startX;
    output['startY'] = startY;
    output['endX'] = endX;
    output['endY'] = endY;

    return output;
}

※ローカル版GeoGebraでは機能しません。

 

戻り値のプロパティ名は、以下のとおりである。startX, startY, endX, endY以外は、スライダーのxml情報中、sliderタグの属性から取得している。

f:id:usiblog:20201027213555p:plain

↑スライダーを画面固定した場合。

f:id:usiblog:20201027213713p:plain

↑スライダーを画面固定しない場合。absoluteScreenLocationプロパティが定義されていない点が、画面固定した場合との違いである。

使用例

スライダーa、自由な点オブジェクトStart, Goal, 自由な数値オブジェクト(最小値・最大値の限定無し)min_a, max_aを作成する。

また、点Pを、以下の定義で作成する。

P = Dilate(Goal, (a - min_a) / (max_a - min_a), Start)

グローバル欄に、上記関数を記述する。

aのOn Update ハンドラに、以下を記述する。

//スライダー情報を取得
var info = getSliderInfo('a');

//スライダーの端点の座標を、StartとGoalに記録
ggbApplet.evalCommand('SetValue[Start,(' + info.startX + ',' + info.startY + ')]');
ggbApplet.evalCommand('SetValue[Goal,(' + info.endX + ',' + info.endY + ')]');

//スライダーの最小値、最大値を、min_a, max_aに記録
ggbApplet.evalCommand('SetValue[min_a,' + info.min + ']');
ggbApplet.evalCommand('SetValue[max_a,' + info.max + ']');

すると、aを更新すると、Start, Goalがaのスライダーの端点に移動し、min_a, max_aには、それぞれaのスライダーの最小値・最大値が記録される。

点Pは、aのスライダーの点(ドラッグできる部分)に揃う。

サンプル

スライダー情報を取得 – GeoGebra