課題
たとえば、以下のオブジェクトを、上から順に作成する。
C = (1,1)
r = 2
s = r+1
d = Circle[C,r]
e = Circle[C,s]
output = (Area[e] - Area[d]) / (s^2-r^2)
ここで、JavaScript関数
nest( 'output', ['C','r'] );
を実行することで、outputを、Cとrのみを用いて定義した文字列
'( Area[Circle[C,r+1]] - Area[Circle[C,r]] ) / ( (r+1)^2-r^2 )'
を取得したい(当該文字列を関数の戻り値としてもよいが、さしあたり、ブラウザのコンソールに出力できれば十分である)。
このように、ある従属オブジェクトの定義を、指定したオブジェクトのみで表した場合の文字列を得られるような、関数nestを作成せよ。
※これができると、オリジナルツール作成が、とても捗る。
関数作成例
function nest(objName, objectToProtectArray){
if(!ggbApplet.exists(objName)){return objName+' is undefined.';}
if(ggbApplet.getCommandString(objName, false)==''){return 'it is a freeObject.';}
if(!objectToProtectArray){var objectToProtectArray = [];}
var originalNameArray = ggbApplet.getAllObjectNames();
var indexOfTarget = originalNameArray.indexOf(objName);
var indexArrayOfObjectToProtect = objectToProtectArray.map(function(value){
return originalNameArray.indexOf(value);
});
for(var k=0; k<originalNameArray.length; k++){
ggbApplet.renameObject(originalNameArray[k], 'OBJECT'+k+'USIDESU');
}
var changedNameArray = ggbApplet.getAllObjectNames();
var changedNameOfTarget = ggbApplet.getObjectName(indexOfTarget);
var definitionOfTarget = ggbApplet.getCommandString(changedNameOfTarget, false);
var changedNameArrayOfObjectToProtect = indexArrayOfObjectToProtect.map(function(value){
return ggbApplet.getObjectName(value);
});
do{
var nameOfParentObjects = definitionOfTarget.match( /OBJECT\d+USIDESU/g );
if(!nameOfParentObjects){nameOfParentObjects = [''];}
var definitionOfParentObjects = nameOfParentObjects.map(function(value){
if(changedNameArrayOfObjectToProtect.indexOf(value)!=-1){return '';}
else{return ggbApplet.getCommandString(value, false);}
});
var nestedDefinitionOfTarget = definitionOfTarget;
for(var k=0; k<nameOfParentObjects.length; k++){
if(definitionOfParentObjects[k]!=''){
var re = new RegExp(nameOfParentObjects[k], 'g');
nestedDefinitionOfTarget = nestedDefinitionOfTarget.replace(re, '('+definitionOfParentObjects[k]+')');
}
}
definitionOfTarget = nestedDefinitionOfTarget;
} while (definitionOfParentObjects.join('')!='');
for(var k=0; k<originalNameArray.length; k++){
var usidesuReg = new RegExp(changedNameArray[k], 'g');
nestedDefinitionOfTarget = nestedDefinitionOfTarget.replace(usidesuReg, originalNameArray[k]);
}
console.log(nestedDefinitionOfTarget);
for(var k=0; k<originalNameArray.length; k++){
ggbApplet.renameObject('OBJECT'+k+'USIDESU', originalNameArray[k]);
}
}