2008年06月30日
プロッタ(その2) - llListStatistics
プロッタですが とりあえず sin 関数を表示することができる所まで来ました
-----
後は 弾道データを取り ノートからそれを読み込ませるようにすることぐらいかな w
-----
-----
初期状態で こんな感じに... sin 関数を表示すると 10個ではいまいちだったので ドットの個数は 20個に増やしました
-----
-----
sin 関数を表示するとこんな感じ
-----
リストもあげておきます
-----
プロッタ本体はこんな感じ(結構増えたな w)
-----
pos.y と pos.z に設定しているのは こうしないと 面と垂直方向にプロットされてしまったからなのですが
-----
試行錯誤してしまいました ^^;
-----
ローカルな座標の向きがいまいち分かりません w
-----
ドットの部分はこんな感じ
-----
後は 弾道データを取り ノートからそれを読み込ませるようにすることぐらいかな w
-----
-----
初期状態で こんな感じに... sin 関数を表示すると 10個ではいまいちだったので ドットの個数は 20個に増やしました
-----
-----
sin 関数を表示するとこんな感じ
-----
リストもあげておきます
-----
プロッタ本体はこんな感じ(結構増えたな w)
//タイトルの llListStatistics は最大値と最小値を求めるのに使っています
// File: plotter.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 60
//
integer num_of_dots = 10;
integer min_link_num = 2;
float size = 0.5;
list init_x;
list init_y;
list x;
list y;
integer i;
set_init() {
init_x = [];
init_y = [];
for (i = 0; i < num_of_dots; i++) {
init_x += (float)i;
init_y += (float)i;
}
}
set_sin() {
x = [];
y = [];
for (i = 0; i < num_of_dots; i++) {
x += (float)((TWO_PI / num_of_dots) * i);
y += (float)llSin((float)((TWO_PI / num_of_dots) * i));
}
}
draw(list data_x, list data_y) {
float unit = size / (num_of_dots + 1);
float range = size - unit * 2;
vector pos_org = <-(size / 2.0) + unit, -(size / 2.0) + unit, 0>;
float min_x = llListStatistics(LIST_STAT_MIN, data_x);
float max_x = llListStatistics(LIST_STAT_MAX, data_x);
float min_y = llListStatistics(LIST_STAT_MIN, data_y);
float max_y = llListStatistics(LIST_STAT_MAX, data_y);
float scale_x;
integer flat_x = (max_x == min_x);
if (!flat_x) {
scale_x = range / (max_x - min_x);
}
float scale_y;
integer flat_y = (max_y == min_y);
if (!flat_y) {
scale_y = range / (max_y - min_y);
}
vector pos = ZERO_VECTOR;
for (i = 0; i < num_of_dots; i++) {
float x = llList2Float(data_x, i);
float y = llList2Float(data_y, i);
if (!flat_x) {
pos.y = pos_org.x + (x - min_x) * scale_x;
}
if (!flat_y) {
pos.z = pos_org.y + (y - min_y) * scale_y;
}
llMessageLinked(min_link_num + i, 0, (string)pos, NULL_KEY);
}
}
default {
state_entry() {
set_init();
draw(init_x, init_y);
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
set_sin();
draw(x, y);
}
}
-----
pos.y と pos.z に設定しているのは こうしないと 面と垂直方向にプロットされてしまったからなのですが
-----
試行錯誤してしまいました ^^;
-----
ローカルな座標の向きがいまいち分かりません w
-----
ドットの部分はこんな感じ
//早速 vector の明示的なキャストを用いています w
// File: dot.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 17
//
default {
on_rez(integer param) {
llResetScript();
}
link_message(integer sender_num, integer num, string str, key id) {
llSetPos((vector)str);
}
}
Posted by walkinglint at 21:08│Comments(0)
│walking のスクリプティング講座