1
名前:k
日付:2010/07/02(金)22:30:44
ID:9kJEWPZA4knz
こんにちは。
テキストエリアにユーザーが入力した数式を、
グラフにして表示するFlashをas3.0で組みたいのですが、
テキストで入力された数式をどのように処理すればいいか、見当がつきません。
たとえば、"x+y"(String)とテキストで入力されたら、x=1,y=2などの数を代入して、
3(Number)を返すような処理をしたいのです。
足し算のみならず、sinやlogなども実装したいと思っています。
as1.0でしたら、evalを使ってできると思うのですが…。
お知恵をお借りできたらと思います。
テキストエリアにユーザーが入力した数式を、
グラフにして表示するFlashをas3.0で組みたいのですが、
テキストで入力された数式をどのように処理すればいいか、見当がつきません。
たとえば、"x+y"(String)とテキストで入力されたら、x=1,y=2などの数を代入して、
3(Number)を返すような処理をしたいのです。
足し算のみならず、sinやlogなども実装したいと思っています。
as1.0でしたら、evalを使ってできると思うのですが…。
お知恵をお借りできたらと思います。
2
日付:2010/07/02(金)22:58:50
ID:yDl4tzgDJCHR
x と y という2つの変数がありますがこれは2つだけでなく無制限に増えますか?
変数名は自由に付けれますか?
対応する演算は + - * / ですか?
() はありますか?
変数名は自由に付けれますか?
対応する演算は + - * / ですか?
() はありますか?
3
日付:2010/07/02(金)23:14:15
ID:9kJEWPZA4knz
xyz立体のグラフを絵画する予定なので、x,y以外に変数は使いません。
演算は+ - * /と、累乗の意味として ^ を入れようと思っています。
()もつけたいと思っています。
また、sin,cos,logなど、基本的な数学の関数も使えるようにしようと思っています。
演算は+ - * /と、累乗の意味として ^ を入れようと思っています。
()もつけたいと思っています。
また、sin,cos,logなど、基本的な数学の関数も使えるようにしようと思っています。
4
名前:1/2
日付:2010/07/03(土)08:13:12
ID:yDl4tzgDJCHR
まずは文字列から式の解析でしょうか。
var str:String = " (x + 5) / ((y - 2) * 10.123) + sin(x)";
var dictionary:Array = [
{word:"x",comment:"変数 x"},
{word:"y",comment:"変数 y"},
{word:"+",comment:"加算"},
{word:"-",comment:"減算"},
{word:"*",comment:"乗算"},
{word:"/",comment:"除算"},
{word:"^",comment:"累乗"},
{word:"(",comment:"("},
{word:")",comment:")"},
{word:"sin",comment:"サイン"},
{word:"cos",comment:"コサイン"},
{word:"log",comment:"自然対数"},
];
var i:uint = 0;
var p:uint = 0;// 文字の検索位置
var c:uint = 0;// 文字コード
var l:uint = str.length;// 文字のサイズ
while(true){
if(l <= p)break;
// 一文字取り出す
c = str.charCodeAt(p);
// 空白無視
if(c == 32){
p ++;
continue;
}
var str:String = " (x + 5) / ((y - 2) * 10.123) + sin(x)";
var dictionary:Array = [
{word:"x",comment:"変数 x"},
{word:"y",comment:"変数 y"},
{word:"+",comment:"加算"},
{word:"-",comment:"減算"},
{word:"*",comment:"乗算"},
{word:"/",comment:"除算"},
{word:"^",comment:"累乗"},
{word:"(",comment:"("},
{word:")",comment:")"},
{word:"sin",comment:"サイン"},
{word:"cos",comment:"コサイン"},
{word:"log",comment:"自然対数"},
];
var i:uint = 0;
var p:uint = 0;// 文字の検索位置
var c:uint = 0;// 文字コード
var l:uint = str.length;// 文字のサイズ
while(true){
if(l <= p)break;
// 一文字取り出す
c = str.charCodeAt(p);
// 空白無視
if(c == 32){
p ++;
continue;
}
5
名前:2/2
日付:2010/07/03(土)08:13:31
ID:yDl4tzgDJCHR
// 数字検出
if(c >= 0x30 && c <= 0x39){
var b:uint = p;
p++;
while(true){
// 一文字取り出す
c = str.charCodeAt(p);
// 数字とピリオドを検出
var check:Boolean = false;
if(c >= 0x30 && c <= 0x39)check = true;
if(c == 46)check = true;
if(check){
p++;
continue;
}
break;
}
trace("数字:" + str.substring(b,p));
continue;
}
// 単語検出
for(i=0;i<dictionary.length;i++){
var page:Object = dictionary[i];
if(str.indexOf(page.word,p) == p){
p += page.word.length;
trace(page.comment);
break;
}
}
if(i < dictionary.length)continue;
trace("エラー");
break;
}
if(c >= 0x30 && c <= 0x39){
var b:uint = p;
p++;
while(true){
// 一文字取り出す
c = str.charCodeAt(p);
// 数字とピリオドを検出
var check:Boolean = false;
if(c >= 0x30 && c <= 0x39)check = true;
if(c == 46)check = true;
if(check){
p++;
continue;
}
break;
}
trace("数字:" + str.substring(b,p));
continue;
}
// 単語検出
for(i=0;i<dictionary.length;i++){
var page:Object = dictionary[i];
if(str.indexOf(page.word,p) == p){
p += page.word.length;
trace(page.comment);
break;
}
}
if(i < dictionary.length)continue;
trace("エラー");
break;
}
6
名前:k
日付:2010/07/03(土)12:03:43
ID:9kJEWPZA4knz
なるほど…道筋が見えてきました。
これを手がかりに、まずは自分で作成してみようと思います。
また分からないところがあったときは、ご指導よろしくお願いします。
これを手がかりに、まずは自分で作成してみようと思います。
また分からないところがあったときは、ご指導よろしくお願いします。
このスレッドについて
質問の状態 : | 未解決 |
投稿開始日 : | 2010/07/02(金)22:30:44 |
投稿終了日 : | 2010/07/03(土)12:03:43 |
投稿者 : | k |
レス総数 : | 6 |
スレッド番号 : | 32 |