うしブログ

うしブログ

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

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

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

辺の長さを指定してn角形を描画する(n>=3対応)

 

辺の長さを指定して、多角形を描画します。頂点を動かせます。

 

ggbファイルのダウンロードはこちらから。

www.geogebra.org

 

(参考)グローバルJavaScript

function execute(listName) {
    var lenArr = getArr(listName);
    makePolygon(lenArr);
    setExistingLabelToValue('p', 'segment');
}

function getArr(listName) {
    var len = ggbApplet.getValue('Length(' + listName + ')');
    var outputArr = [];
    for (var k = 0; k < len; k++) {
        outputArr[k] = ggbApplet.getListValue(listName, k + 1);
    }
    return outputArr;
}



function makePolygon(lenArr) {

    var numberOfVertice = lenArr.length;

    //既存のPを削除
    deleteExistingObj('P', 'point');

    //始点P0=(0,0)をフリーで作成
    ggbApplet.evalCommand('P0=(0,0)');
    ggbApplet.evalCommand('UpdateConstruction[]');

    //可動点を作成
    for (var k = 0; k < numberOfVertice - 2; k++) {
        ggbApplet.evalCommand('P' + (k + 1) + ' = Point(Circle(P' + k + ', ' + lenArr[k] + '))');
    }

    //最終交点を作成
    ggbApplet.evalCommand('P' + (numberOfVertice - 1) + '=Intersect(Semicircle(Dilate(P0, ' + lenArr[numberOfVertice - 2] + ' / Distance(P0, P' + (numberOfVertice - 2) + '), P' + (numberOfVertice - 2) + '), Dilate(P0, (-' + lenArr[numberOfVertice - 2] + ') / Distance(P0, P' + (numberOfVertice - 2) + '), P' + (numberOfVertice - 2) + ')), Semicircle(Dilate(P' + (numberOfVertice - 2) + ', (-' + lenArr[numberOfVertice - 1] + ') / Distance(P0, P' + (numberOfVertice - 2) + '), P0), Dilate(P' + (numberOfVertice - 2) + ', ' + lenArr[numberOfVertice - 1] + ' / Distance(P0, P' + (numberOfVertice - 2) + '), P0)), 1)');

    //多角形を作成
    var argText = 'P0';
    for (var k = 1; k < numberOfVertice; k++) {
        argText = argText + ',P' + k;
    }
    ggbApplet.evalCommand('outputPolygon=Polygon[' + argText + ']');

    //整形
    for (var k = 0; k < numberOfVertice - 3; k++) {
        ggbApplet.evalCommand('SetValue[P' + (k + 2) + ',Rotate[P' + k + ', -π *(' + numberOfVertice + '-2)/' + numberOfVertice + ',P' + (k + 1) + ']]');
    }
}

//headNameを頭文字にもつ特定のタイプのオブジェクトを全て削除する。
function deleteExistingObj(headName, objType) {
    var targets = getExistingObjIndex(headName, objType);
    for (var k = 0; k < targets.length; k++) {
        ggbApplet.deleteObject(headName + targets[k]);
    }
}

//headNameを頭文字にもつ特定のタイプのオブジェクトname1, name3, name4が存在しているならば、配列[1,3,4]を返す。
function getExistingObjIndex(headName, objType) {
    var allObjNames = ggbApplet.getAllObjectNames(objType);
    var targets = allObjNames.filter(function(item) {
        if (item.indexOf(headName) != -1) return true;
    });
    targets.map(function(value, index, array) {
        array[index] = eval(value.substr(headName.length));
    });
    return targets;
}

//headNameを頭文字にもつ特定のタイプのオブジェクトのラベルを「値」にする。
function setExistingLabelToValue(headName, objType) {
    var targets = getExistingObjIndex(headName, objType);
    for (var k = 0; k < targets.length; k++) {
        ggbApplet.setLabelVisible(headName + targets[k], true);
        ggbApplet.setLabelStyle(headName + targets[k], 2);
    }
}