うしブログ

うしブログ

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

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

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

10×10の格子点を作成するいくつかの方法

図のように、(0,0)から(9,9)に至る、10×10の格子点を作成する方法を考える。

f:id:usiblog:20190425102540p:plain

①地道に入力する方法

(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 ハンドラ等、任意のハンドラによって実行する。

for(var j = 0; j < 10; j++){
  for(var k = 0; k < 10; k++){
    ggbApplet.evalCommand('P_{'+(10*k+j+1)+'} = ('+j+','+k+')');
  }
}

すると、P_{1}〜P_{100}の100個の点が作成される。