

下記の2つの図を作成したいのですが、いまいちコードがわかりません。初心者です。教えていただけないでしょうか。

![画像の説明をここに入力](https://i.stack.imgur.com/wl6Am.jpg)


CC BY-SA 4.0
2020-02-07T14:51:01.620
62858
2020-02-08T10:05:18.907
2020-02-07T16:27:27.280
3060
37666
question
python
タートルグラフィックの作図方法が分からない


Pythonの該当ドキュメントの冒頭ですが、この部分の理解度によって簡単だと思う人と難しいと思う人に分かれるのでしょう。

[turtle --- タートルグラフィックス](https://docs.python.org/ja/3/library/turtle.html)

> タートルグラフィックスは、プログラミングを子供に紹介する一般的な方法です。 これは、1967年にWally Feurzeig、Seymour
> Papert、およびCynthia Solomonによって開発されたオリジナルのLogoプログラミング言語の一部でした。
>
> x-y 平面の (0, 0) から動き出すロボット亀を想像してみて下さい。`turtle.forward(15)`という命令を出すと、その亀が
> (スクリーン上で!) 15
> ピクセル分顔を向けている方向に動き、動きに沿って線を引きます。`turtle.left(25)`という命令を出すと、今度はその場で25度反時計回りに回ります。
>
> これらの命令と他の同様な命令を組み合わせることで、複雑な形や絵が簡単に描けます。

* * *

円を描くこと自身は[circle()](https://docs.python.org/ja/3/library/turtle.html#turtle.circle)です。

「正三角形を2つ描く」のと「六つの小さな丸の作成」を独立して考えてしまうから分からなくなるのでしょう。

「各頂点に丸の付いた正三角形を2つ描く」と考え、それを描くには「丸と直線を(角度を変えて)3つ描く」と分解していくのが、おそらくタートルグラフィックス流の考え方と思われます。

以下の様な処理が考えられます。

  * 「各頂点に丸の付いた正三角形を描く」関数を定義

    * 下記を3回繰り返す 
      * オレンジ色のペンで円を描く
      * 角度を変える(右60度回転)
      * 紫色のペンで直線を描く
      * 角度を変える(右60度回転)
  * 上記関数を1回呼び出す

  * ペンを上げる
  * 次の描画開始位置に移動する  
(三角形の辺の半分を移動、右90度回転、辺の10分の1を移動)

  * 角度を変える(左30度回転)
  * ペンを下げる
  * 上記関数を1回呼び出す

ソースはこちら

[code]

    import turtle
    
    # 「各頂点に丸の付いた正三角形を描く」関数を定義
    def CircleAndTriangle(t, csize, lsize):
        for _ in range(3):
            t.pencolor('orange')
            t.circle(csize)
            t.pencolor('purple')
            t.right(60)
            t.forward(lsize)
            t.right(60)
    
    t = turtle.Turtle()
    t.pensize(3)
    csize = 20  # 円の半径
    lsize = 200 # 三角形の辺の長さ
    
    CircleAndTriangle(t, csize, lsize)
    t.penup()
    t.forward(lsize/2)
    t.right(90)
    t.forward(lsize/10)
    t.left(30)
    t.pendown()
    CircleAndTriangle(t, csize, lsize)
    t.hideturtle()
    turtle.done()
    
[/code]

* * *

スパイラル図の方は、以下の様な処理が考えられます。  
ちなみに質問の図に描画された三角形は20個のようですが。

  * 「指定された長さで各辺の色を変えた正三角形を描く」関数を定義

    * 下記を赤・紫・オレンジの色のリストで繰り返す 
      * 今回の色のペンで直線を描く
      * 角度を変える(左120度回転)
  * 以下の各値を設定・記憶

    * 三角形を描く個数
    * 360(角度)を三角形を描く個数で割った値
    * 三角形の辺の長さの初期値
    * 次の三角形の辺の長さへの増分値
    * 次の三角形を描く開始位置の距離
  * 描画する三角形の辺の長さリストを`range`で作成してループする 
    * 今回の長さで上記関数を1回呼び出す
    * ペンを上げる
    * 角度を変える(右へ360を三角形を描く個数で割った値)
    * 次の三角形を描く開始位置の距離分移動する
    * ペンを下げる

ソースはこちら

[code]

    import turtle
    
    # 「指定された長さで各辺の色を変えた正三角形を描く」関数を定義
    def Triangle(t, lsize):
        for c in ['red', 'purple', 'orange']:
            t.pencolor(c)
            t.forward(lsize)
            t.left(120)
    
    t = turtle.Turtle()
    t.pensize(3)
    divcount = 20  # 三角形を描く個数
    adegree = 360/divcount # 360(角度)を三角形を描く個数で割った値
    csize = 10     # 次の三角形を描く開始位置の距離
    tsizeini = 20  # 三角形の辺の長さの初期値
    tsizediff = 10 # 次の三角形の辺の長さへの増分値
    
    # 描画する三角形の辺の長さリストをrangeで作成してループする
    for lsize in range(tsizeini, (tsizeini + (tsizediff * divcount)), tsizediff):
        Triangle(t, lsize)
        t.penup()
        t.right(adegree)
        t.forward(csize)
        t.pendown()
    t.hideturtle()
    turtle.done()
    
[/code]

* * *

なお、コーディングに慣れていないなら、この辺のTutorial等をザッとやってみるのが良いでしょう。  
[asweigart/simple-turtle-tutorial-for-
python/simple_turtle_tutorial.md](https://github.com/asweigart/simple-turtle-
tutorial-for-python/blob/master/simple_turtle_tutorial.md)  
[Easy Designs - Turtle Graphics Python](https://www.instructables.com/id/Easy-
Designs-Turtle-Graphics-Python/)  
[Python 3 – Turtle
graphics](https://www.cs.auckland.ac.nz/courses/compsci111ssc/lectures/LectureSlides/L25_Python3.pdf)  
[Turtle Programming in Python](https://www.geeksforgeeks.org/turtle-
programming-python/)  
[Python Turtle Graphics Tutorial #1 -
Introduction](https://www.youtube.com/watch?v=p7CiFhiTdvY) YouTube  
[Text-Based Tutorial & Code:](https://techwithtim.net/tutorials/python-module-
walk-throughs/turtle-module/introduction/) 上記のテキスト化  
[Complete Python Turtle Graphics Overview! (From Beginner to
Advanced)](https://www.youtube.com/watch?v=pxKu2pQ7ILo) 別のYouTube


CC BY-SA 4.0
2020-02-08T06:39:08.610
62871
2020-02-08T10:05:18.907
2020-02-08T10:05:18.907
26370
26370
62858
answer