◆ 基本的な記述 : turtleを使う 【 Python 】 | @Kay-nea@のブログ

    先日は、

     

     

    にてturtleで文字列の表示が出来ることと複数のturtleが制御できることについて書きました。

     

     turtleモジュールでは、writeメソッドを使うことで文字の表示が出来るようになっているので、図形だけでなく文字列の表示も出来るようになっています。記述は、


    【 文字列の記述 】
     
      ■ turtle.write('文字列')

    だけでも表示が出来るので、



    のようなコードを書いて実行すると



    のように文字列が表示されます。writeメソッドにはオプションがあるので、それを追加して

     

    のようなコードを書くと、

     

     

    のように文字のサイズなどを変更できます。このオプションは、

     

     

    のようになっており、argで文字列の指定を行って、moveで移動の有無が指定でき、alignデイトの指定ができるようになります。

     

     表示するフォントはPCにインストールサれているものが使用できるので、PCにインストールサれているもので、通常の呼び出しが可能なフォントのフォルダーに入っていれば使用できます。ここで

     

      ■ フォントの種類

      ■ フォントサイズ

      ■ スタイル

     

    を指定できるので、太字や斜体にしたり、サイズの変更を行えるようになっています。

     

     テキストはturtleの移動後に表示される仕組みなので、移動をさせた後に文字の表示をさせることが出来ます。その為、

     

     

     

     

    のようなコードを書いて実行すると、

     

     

    のように1つのturtleで複数の文字の配置をすることも出来ます。

     

     turtleは単体ではなく、複数配置できるのですが、この場合には、変数に対してturtleを追加するメソッドを追加する必要があります。この場合、

     

     

    【 turtleの登録 】

     

      ■ 変数名 = turtle.Turtle()

     

    の様な方法を用いることになり、この変数名を使用して、メソッドを適応することになります。メソッドは、オブジェクトに対して追加できる仕様になっているので、この状態にすると、対象のturtleに対してメソッドを追加できるようになります。そのため、

     

     

    のようなコードを書いて、個別に動きを実装してみると

     

     

    のような結果になります。コレを見てもらうと、何も指定していない最初から存在するturtleと新規に追加したTurtleが存在しています。更にコードを変更して、座標を指定してみることにしました。turtleでは、指定した位置に移動させるgotoと言うメソッドがあるので、

     

    【 目的地を指定するメソッド 】

     

      ■ turtle.goto(x, y)

     

    で移動できるのですが、この時の座標は引数だけでなく、リストで指定して参照することも出来ます。コードにすると、 

     

     

    のようになり、実行すると

     

     

    のようになります。ここまでのコードで、turtleの座標は数学の座標平面と同じことが確認できると思いますが、

     

     

    のようなコードを書いて実際に位置と座標の上歌いを表示してみると

     

     

    のようになります。

     

     このようにTurtleでは、複数のturtleを用意して個別に動かすことが出来るのですが、その際には動かすturtleの数だけ登録を行って処理を実装することになります。その為、動かすための基本となるのは、単体のturtleの制御になりますから、単体での動作で何が出来るのかを理解しておくと、制御が行いやすくなります。

     

     

      基本となる記述

     

     turtleは、インポートをすればそのまま使用できますが、基本となる記述は、doneで終わる仕様になっています。

     

     その為、 【 import turtle 】 でインポートして、【 done 】 で終了するので、この間に処理を実装することになります。

     

     

    この状態にして、先日のような記述をして実行すると処理が実行されます。

     

     

      ウインドウの指定

     turtleは、そのまま実行しても表示は出来ますが、ウインドウのサイズを最初に指定してから実行することも出来ます。

     

     ウインドウの指定は、

     

      ■ turtle.setup()

     

    メソッドを使用します。これは、固定した状態で使用するものなので初期化で使用するものになりますが、

     

      ■ 幅

      ■ 高さ

      ■ 画面端からの横方向の距離

      ■ 画面端からの縦方向の距離

     

    を指定します。記述としては、

     

    turlte.setup(width=1280, height=700, startx=0, starty=0)

     

    のようになりますが、数値だけで制御できるので、

     

    turlte.setup(1280, 720, 0, 0)

     

    のように書くことも出来ます。ウインドウの配置はラスターグラフィックの座標になるので左上が0,0で最大が右端になりますが、これは、整数の並びが二次元配列で管理されているためです。まず、

     

     

    のように配置をNoneにすると、

     

     

    のように中央に配置できるので、レイアウトを真ん中に持っていきたい場合にはこの指定にしておけば間違いがないのですが、画面端からの距離で制御したい場合だと、

     

     

    のように左端からの距離を指定することになります。すると、

     

     

    のように指定したピクセル数分だけ移動した場所にウインドウを配置することが出来ます。Noneや0の指定をして、解像度を画面に合わせるとフル解像度での表示も出来るのですが、ウインドウサイズと位置は、setupのメソッドで設定することが出来ます。

     

     ラスターグラフィックについては、

     

     

     

    の中で触れていますが、ピクセルの個数で制御をしているので、整数での管理を行う仕様になっています。ちなみに、表示をする際にはすべてラスターグラフィックに変換されていますから、モニターで表示する動画や写真ラスターグラフィックになります。

     

     3DCGやSVGファイルはデータなので、画像や動画のようなバイナリではありませんから、レンダリングをすることでラスターの状態にしてあります。ちなみに、3DCGを映像や画像にする際には時間をかけてレンダリングを行いますが、ゲームの場合は、ベンチマークで表示されているfps数分だけ秒間にレンダリングを行って下位着替えが発生しています。

     

      turtleのホームポジション

     

     turtleの座標は数学のグラフと同じで、座標平面で座標の変化と同じ制御が出来るようになっています。

     

     ベクターグラフィックでは極当たり前な挙動になりますが、平面だと数学で使用するグラフと全く同じ制御が出来るので、特に問題なく数値の変化を追加して制御を刷ることが出来ます。

     

     

     これが三次元になると、

     

      ■ Y-upとZ-up

      ■ 右手系と左手系

     

    のような座標の違いがでてくるので、どれを使うのかを決める必要がります。上方向に来る座標ですが、

     

      ■ Y-up : 奥行きがZなのでカメラ

      ■ Z-up : 床が平面なので図面

     

    のような考え方になります。ちなみに、Blenderの場合、XZやZYの始点でも基本的に数学で使用する座標平面と同じ制御が出来るので、見えている向きが変わっただけで数値の制御方法は同じになります。

     

     

     座標については、

     

     

    の中で触れていますが、

     

     

    のような違いがあるので、エクスポート時に座標を合わせておく必要があります。座標については、

     

     

     

     

    の中でも触れていますが、平面については数学で使うグラフと同じ制御が出来るので、座標の変化は数学で登場する関数や物理で登場する物理方程式で制御することも出来ます。

     

     このようなグラフと同じ座標系の構造はベクターグラフィックの特徴になりますが、

     

      ■ 2D : ドロー系ツール

      ■ 3D : 3DCGツール

     

    で作業を刷ることが出来るようになっています。この時の制御方法は小数点数での制御になりますから、整数部+少数部の数値で変化を追加することが出来ます。この時にプログラミング言語でサポートしている 【 型の桁数 】 で小数点数の桁数が変わりますが、コンピューターの場合、数学で見かけるような小数点以下の数値が並ぶようなものではなく、数値に対して10の累乗を追加した形で表記する仕様になっています。数学で使用する少数点数は固定少数点数といいますが、コンピューターで使用する少数点数は浮動小数点数といいます。

     

     小数点数を使用することで、細かな変化を実装できるわけですが、基本的にベクターグラフィックには座標平面と同じように空間の基準となる原点(ORIGIN)があり、その原点座標からの位置で数値を指定することになります。これは、数直線も同じですが、座標平面は数直線を二次元に展開したものになりますから、座標の値はX軸とY軸の双方に存在します。

     
     
     
     
     一次元の座標の場合、X軸しか存在しませんから、 X=0 のような形になりますが、この状態が原点座標の指定になります。
     
     ここから数値があることを示す1がいくつ存在すうるのかを示すことになるので、【 1の集合を示した値 】 を座標に追加することになります。その時に X=1 や X=-1 のような指定が出来るのですが、一次元の場合だと、数式で示す場合のように一つの変数を格納したものになります。 a=(x) の形になるので、a=(1)ような状態になります。
     
     二次元の場合だと、Y軸の情報も含まれるので、構造的に多変数になりますから、X軸とY軸のデータが必要になります。その為、原点の座標も 【 X=0  ∧ Y=0 】 の状態になります。この状態だと a=(x,y) の形に出来るので a=(0,0) のような表記になります。これが任意の座標aが原点に存在する状態になりますが、この時の原点は常に0なので、座標平面での原点は0,0になります。
     
     ベクターグラフィックの場合、
     

      ■ グローバル座標 : 空間の原点を基準としたもの

      ■ ローカル座標  : オブジェクトを基準としたもの

     

    が存在しますが、基準となるのはグローバル座標で、オブジェクトの糸をコントr−る刷る際に使用するのがローカル座標になります。その為、最初にシェイプを指定してそこから移動させる場合だと、0,0を基準として移動しますから、この時の座標の指定はグローバル座標を基準としていますが、それ以降はシェイプの移動した後の座標から変化を追加しますから、ローカル座標を使用することになります。

     

     turtleでは、シェイプの位置は原点に配置されるので、そこから移動先を決めて動かすことになりますが、ホームポジションに戻す際に(0,0)のような座標の指定をしても戻れますが、

     

      ■ Turtle.home()

     

    で戻ることが出来ます。homeメソッドを使用するとturtleは原点に戻るので、

     

     

    のようなコードを書くと、

     

     

    のように線を引居た後に原点に戻り

     

     

    のようにラインを引くことが出来ます。このように原点を基準に動くようなものを作る場合には、homeを使うと強制的に原点に戻ることが出来るので、放射状に展開する図形を描く時に使用できます。

     

     

     

     

     

      アーキテクチャと負荷

     

     

     現在のアーキテクチャだとPtyhonのturtleやTkinterはそれほど重たくないので、表示をして簡素な処理をする程度だと遅延を感じないはずなんですが、現在使用しているAtom D510の環境だと、処理能力が低すぎて少し遅延が生じてしまいます。

     

     Pythonのコードの実行をする場合、

     

      ■ コーソールかららの実行

      ■ IDLEからの実行

     

    だと後者のほうが遅くなります。これは、IDLEはターミナルからの事項ではなくソフトウェアを仲介しての実行なので負荷がかかった状態での処理になるためだと考えられるのですが、Tkinterもそうですが、turtleもAtom D510だと少し遅延が生じます。

     

     その為、古い超省電力プラットフォームだとコーディングをこなったとしても色々と不都合が生じることがあります。あと、現在のアーキテクチャだとIntel N200が電力が少し多めですが、Pentium Nシリーズの後継として流通うしていますが、CPU性能は第三世代のCore i7よりも高速なので、SundyBridgeよりも高速で、且つ、少電力な状態になっていますが、現在のマルチメディア関連の処理では4スレッドだと厳しいものがあるので、ゲーム用途だと古いゲームしか動作しなかったり、ドラクエベンチも結構ひどかったりします。

     

     このようにCPUの特定のベンチマークだとスコアが出るのですが、そうならない場合もありますが、WINDOWSを使った場合と、軽量なLinuxを使った場合だと条件が変わる場合もあります。

     

     純粋にプログラミング言語を使用して書いたコードを走らせる場合だと、カーネルが軽量でリソースが足りていれば、CPUno処理能力の上限を超えない場合だと速度は出ます。(というよりもレイテンシが生じないという方が正しいですが...。)

     

     この条件から高付加になるほど処理に時間がしかかるようになるので、遅延が生じ始める訳ですが、ファミコンなどのレトロなゲーム機の速度低下などはこうした 【 処理落ち 】 によるものになります。重たい処理をすれば必ず処理落ちは所持るのですが、この条件もハードウェアの演算性能で変わってきます。

     

     その為、処理能力の高いハードウェアの構成であれば高負荷な処理(演算の総数が多い条件)をしても遅延が発生しづらいのですが、処理能力の低いハードウェアの構成の場合、処理能力の高いマシンだとパーツの温度がそれほど高くならないような処理であっても、処理落ちが発生する場合があります。

     

     この辺りが、RTX 4090とRTX 4050の違いになります。また、RTX 3090で低負荷で回るような処理であっても古いアーキテクチャを使用したGT 750などを使用すると処理落ちが生じるのでハードウェアの性能差で出来ることも変わってきます。

     

     これがバックエンドだと演算の結果が出るまでの時間が長くなるのですが、フロントエンドだとレスポンスの悪さになって帰ってきます。つまり、ゲームの場合だと遅延や処理にラグが出るなどの 【 体感的な変化 】 になります。

     

     プログラミング言語を使用して何かしらのソフトエアを作る場合、使用しているハードウェアの構成で出来ることが変わってくるので、実際にコードを書いてみて 【 実用性のある動作を条件で構造を考える 】 ことになります。

     

     Atom D510だと3DCGを動かすのは少し厳しい感じがしますし、ソフトを動かすにしても出来ることがある程度限定されますから、選択肢もある程度絞られてきます。