10×10の格子点を作成するいくつかの方法
図のように、(0,0)から(9,9)に至る、10×10の格子点を作成する方法を考える。
①地道に入力する方法
(0,0)
(0,1)
(0,2)
...
(0,9)
(1,0)
(1,1)
(1,2)
...
(1,9)
...
(9,0)
(9,1)
(9,2)
...
(9,9)
②Sequenceコマンドを使う方法
単に点を描くだけであれば、
Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]
で十分である。しかし、これは、「10個の点からなるリストが、10個集まったリスト」を返す(リストのリスト)。すなわち、
{ { (0,0), ... , (9,0) }, ... , { (0,9), ... , (9,9) } }
である。
100個の点のリスト
{ (0,0), ..., (9,9) }
を得たいときは、Flattenコマンドを使って、
Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]]
とすればよい。
なお、これによって作成されるオブジェクトの定義は、上記数式と同じ
Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]]
である。定義が複雑であるため、たとえばZipコマンドで各要素に計算を行うような場合には、極端に処理が重くなる場合がある。
これを回避するには、CopyFreeObjectコマンドを使って、
CopyFreeObject[Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]]]
とすればよい。これによって作成されるオブジェクトは、定義自体が
{ (0,0), ..., (9,9) }
であり、Zipコマンドに対しても軽快に反応する。
リストではなく、個別の(自由な)点オブジェクトを100個得たい、というときには、Executeコマンドを使って、
Execute[Sequence["CopyFreeObject[Element[Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]], "+k+"]]",k,1,Length[Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]]]]]
とすればよい。
作成される100個の点の名前を、P_{1}〜P_{100}にするには、
Execute[Sequence["P_{"+k+"} = CopyFreeObject[Element[Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]], "+k+"]]",k,1,Length[Flatten[Sequence[Sequence[(s, t), s, 0, 9], t, 0, 9]]]]]
とすればよい。
③JavaScriptでfor文を回す方法
以下のJavaScriptを、ボタンのOn Click ハンドラ等、任意のハンドラによって実行する。
すると、P_{1}〜P_{100}の100個の点が作成される。