大切なものは、見えるところに。

乳がんかな?と疑い始めてからの日々を、振り返りながら、ゆるやかに綴ります。

Python|幾何学模様をChatGPTと一緒に描いてみる|turtle




ChatGPTはPythonが得意、らしいので幾何学模様を一緒に描いてみました。


感想としては、私に知識がないため意図せぬ方向に描画が進んでしまうものの、それなりに形にはなるというものでした。

できた図は、個人的にとても気に入りました。



以下は、ChatGPTとやりとりしながら幾何学模様を作る一連の流れです。


python幾何学模様を描きたいです。



Turtle Graphicsを使用した幾何学模様:
Pythonの標準ライブラリであるturtleモジュールを使用すると、幾何学模様を描くのに便利です。turtleは亀のように操作することで絵を描くことができます。


pythonのturtleで描画できる幾何学模様の例

import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定

# 幾何学模様を作成
for i in range(36):
    draw_geometry_pattern(4, 100, 90)
    turtle.right(10)

# 終了処理
turtle.done()


上記の例では、draw_geometry_pattern()関数を定義し、指定された辺の数と角度で幾何学模様を描画しています。メインのループでは、36度ずつ回転しながら幾何学模様を作成しています。

これらは幾何学模様を描くための基本的な手法です。他にも、フラクタル図形の描画や様々なパターンの組み合わせなど、さまざまなアプローチがあります。自分のアイデアや創造力を活かして、面白い幾何学模様を作成してみてください。






もっと複雑にして。



以下のように修正を加えて、幾何学模様をもっと複雑に描くことができます。


幾何学模様をもっと複雑に描写してもらった例

import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定

# 幾何学模様を作成
for i in range(36):
    if i % 2 == 0:
        turtle.color("red")  # 塗りつぶし色を設定
        turtle.begin_fill()  # 塗りつぶしの開始
        draw_geometry_pattern(4, 100, 90)
        turtle.end_fill()  # 塗りつぶしの終了
    else:
        turtle.color("black")  # 塗りつぶし色を設定
        draw_geometry_pattern(4, 100, 90)

    turtle.right(10)

# 終了処理
turtle.done()


上記の修正では、以下のような変更を行っています:

forループの回数を36回に設定し、より多くの幾何学模様を描くようにしました。
if-else条件分岐を使用して、偶数回目の模様を赤色で塗りつぶし、奇数回目の模様を黒色で描くようにしました。
塗りつぶしの処理をifブロック内に移動し、begin_fill()とend_fill()を使用して塗りつぶしの開始と終了を指定しました。
これにより、より複雑な幾何学模様が描かれます。色や図形の種類、位置などを調整して、さまざまな幾何学模様を作成してください。お楽しみください!



カラフルにして、回転の軌道が螺旋になるようにして



以下のように修正を加えることで、カラフルな幾何学模様を描き、回転の軌道が螺旋になるようにすることができます。


カラフルにそして螺旋になるようにしてもらった例

python
Copy code
import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定

# 色のリスト
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# 幾何学模様を作成
for i in range(360):
    color_index = i % len(colors)
    turtle.color(colors[color_index])  # 塗りつぶし色を設定

    draw_geometry_pattern(4, 100 + i, 90)  # 幾何学模様を描く
    turtle.right(10)

# 終了処理
turtle.done()

上記の修正では、以下のような変更を行っています:

colorsというリストを定義し、カラフルな幾何学模様の色の選択肢を用意しました。
color_indexを計算して、回転するごとにリスト内の色を切り替えるようにしました。
draw_geometry_pattern()の第二引数であるlengthに、iを加えることで、回転するごとに線の長さが増加するようにしました。
これにより、カラフルな幾何学模様が描かれ、回転の軌道が螺旋になります。色や図形の種類、位置などを調整して、さまざまな幾何学模様を作成してください。お楽しみください!


背景を黒にして、もう少し奥行きを出してみたい。


背景を黒にして、奥行きを出すために、以下の修正を加えることができます。


背景を黒に、そして奥行きを出してもらった図

import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle, depth):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)
        turtle.forward(depth)
        turtle.right(-angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定
turtle.bgcolor("black")  # 背景色を黒に設定

# 色のリスト
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# 幾何学模様を作成
depth = 5  # 奥行きの初期値
for i in range(360):
    color_index = i % len(colors)
    turtle.color(colors[color_index])  # 塗りつぶし色を設定

    draw_geometry_pattern(4, 100 + i, 90, depth)  # 幾何学模様を描く
    turtle.right(10)
    depth += 1  # 奥行きを増加させる

# 終了処理
turtle.done()

上記の修正では、draw_geometry_pattern()関数にdepthという引数を追加し、図形の描画中に奥行きを表現しています。各辺の描画後にturtle.forward(depth)とturtle.right(-angle)を追加して、奥行き方向に進んだ後に元の向きに戻ります。

また、depthの初期値を設定し、ループごとに奥行きを増加させています。

これにより、より奥行きのある幾何学模様が描かれます。必要に応じて奥行きの増加量や色、図形の種類、位置などを調整して、さまざまな幾何学模様を作成してください。お楽しみください!


動かなかった


申し訳ありません、間違った修正を提案しました。Turtleグラフィックスでは奥行きを直接表現する機能はありません。しかし、奥行き感を演出するためにいくつかのテクニックを使用することができます。以下に、奥行き感を出すための修正例を示します。


もう一度、試してもらった図

import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle, depth):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)
        turtle.forward(depth)
        turtle.right(-angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定
turtle.bgcolor("black")  # 背景色を黒に設定

# 色のリスト
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# 幾何学模様を作成
depth = 5  # 奥行きの初期値
for i in range(360):
    color_index = i % len(colors)
    turtle.color(colors[color_index])  # 塗りつぶし色を設定

    draw_geometry_pattern(4, 100 + i, 90, depth)  # 幾何学模様を描く
    turtle.right(10)
    depth += 0.1  # 奥行きを増加させる(小さな値で調整)

# 終了処理
turtle.done()

上記の修正では、depthの増加量を小さな値に設定し、ループごとに少しずつ奥行きを増やしています。これにより、微小な奥行き感を演出することができます。

ただし、Turtleグラフィックスは2Dの描画ツールであり、本格的な3Dの奥行き表現には適していません。より高度な奥行き表現を行いたい場合は、Pythonの他のライブラリやフレームワーク(例:PygameOpenGL)を検討することをお勧めします。それらのツールは、3Dグラフィックスやアニメーションを作成するための機能を提供しています。


奥行きが演出できないね。中心の円を小さくできないかな?



もちろん、中心の円を小さくすることで奥行き感を演出することができます。以下に修正例を示します。

中心の円を小さくしてもらい修正してもらった図

import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle, depth):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)
        turtle.forward(depth)
        turtle.right(-angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定
turtle.bgcolor("black")  # 背景色を黒に設定

# 色のリスト
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# 幾何学模様を作成
depth = 5  # 奥行きの初期値
radius = 150  # 中心円の半径
for i in range(360):
    color_index = i % len(colors)
    turtle.color(colors[color_index])  # 塗りつぶし色を設定

    draw_geometry_pattern(4, 100 + i, 90, depth)  # 幾何学模様を描く
    turtle.right(10)
    depth += 0.1  # 奥行きを増加させる(小さな値で調整)
    radius -= 0.5  # 中心円の半径を減少させる(小さな値で調整)

    turtle.penup()
    turtle.setposition(0, 0)
    turtle.pendown()
    turtle.circle(radius)  # 中心円を描く

# 終了処理
turtle.done()

上記の修正では、radiusという変数を追加し、ループごとにその値を減少させることで中心の円を小さくしています。

これにより、奥行き感を演出しつつ中心の円が徐々に縮小される効果が得られます。

必要に応じて修正を加え、さまざまな表現を試してみてください。お楽しみください!


細やかさが中心に集まってしまって、外側がスカスカになってる。



申し訳ありません、上記の修正では円の半径を変化させるだけでしたので、細部の詳細さが中心に集まってしまいます。奥行き感をより均等に演出するために、中心から外側に向かって細部が広がるような表現を行うことができます。以下に修正例を示します。

奥行き感を均等に演出してもらった図

import turtle

# 幾何学模様を描く
def draw_geometry_pattern(sides, length, angle, depth):
    for _ in range(sides):
        turtle.forward(length)
        turtle.right(angle)
        turtle.forward(depth)
        turtle.right(-angle)

# 描画の設定
turtle.speed(0)  # 速度を最大に設定
turtle.bgcolor("black")  # 背景色を黒に設定

# 色のリスト
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# 幾何学模様を作成
depth = 5  # 奥行きの初期値
radius = 150  # 中心円の半径
detail_factor = 2  # 細部の広がり具合を調整するファクター
for i in range(360):
    color_index = i % len(colors)
    turtle.color(colors[color_index])  # 塗りつぶし色を設定

    draw_geometry_pattern(4, 100 + i, 90, depth)  # 幾何学模様を描く
    turtle.right(10)
    depth += 0.1  # 奥行きを増加させる(小さな値で調整)
    radius -= 0.5  # 中心円の半径を減少させる(小さな値で調整)
    detail_factor += 0.01  # 細部の広がり具合を増加させる(小さな値で調整)

    turtle.penup()
    turtle.setposition(0, 0)
    turtle.pendown()
    turtle.circle(radius, detail_factor)  # 中心円を描く

# 終了処理
turtle.done()

修正において、detail_factorという変数を導入し、turtle.circle()の引数に渡すことで細部の広がり具合を調整しています。detail_factorを増加させることで、中心から外側に向かって細部がより均等に広がるようになります。

必要に応じて修正を加え、さまざまな表現を試してみてください。ご希望に近い結果が得られることを願っています。

ここで、個人的に気に入ったので終了にしました。
幾何学や、コードの知識があれば、もっとうまい図が描写できるのかなと思いました。