teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2897閲覧

Pythonタートルグラフィックスを用いて正n角形の星形を描く

yunaojus

総合スコア14

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/07/10 02:08

編集2022/07/10 02:12

0

0

Pythonのタートルグラフィックスを用いて、一辺のサイズを指定し、正n角形の星形を描く関数drawStarを定義します「def drawStar(n, size):」。中は塗り潰さず、内部での線の交差がないようにします。4角形の場合は✧、5角形の場合は☆、6角形の場合は✡︎(交差部分はない形で)とします。この関数を用いて3角形から8角形の星を描くプログラムを作成します。

3角形から8角形まで数値を変更して星を描くプログラムはなんとかかけたのですが、これをdrawStar関数を定義して書く段階でつまづいています。アドバイスやヒント等よろしくお願いいたします。

python

1#3角形 2from turtle import * 3size = 100 4for i in range( 6 ): 5 forward( size ) 6 right( 161 if i % 2 == 0 else -42 ) 7 8#4角形 9for i in range( 8 ): 10 forward( size ) 11 right( 162 if i % 2 == 0 else -72 ) 12 13#5角形 14for i in range( 10 ): 15 forward( size ) 16 right( 144 if i % 2 == 0 else -72 ) 17 18#6角形 19for i in range( 12 ): 20 forward( size ) 21 right( 132 if i % 2 == 0 else -72 ) 22 23#7角形 24for i in range( 14 ): 25 forward( size ) 26 right( 123.5 if i % 2 == 0 else -72 ) 27 28#8角形 29for i in range( 16 ): 30 forward( size ) 31 right( 117 if i % 2 == 0 else -72 ) 32done( )

これを踏まえてrange内はn*2で表すのだろうなとは思うのですが、どのようにdrawStar関数を定義して書いていけば良いかでつまづいています。

python

1from turtle import* 2 3n = int(input("何角形?:")) 4 5def drawRegular( n, size ): 6 for _ in range( n*2, 100 ): 7 right( ? if i % 2 == 0 else -72 ) 8done( )

タートルグラフィックスも用いた例として以下が挙げられていたので、参考にできるのではと思うのですが上手くいきません。よろしければアドバイス等願いたいです。

python

1from turtle import * 2 3# タートルで三角形を描画する関数 4def drawTriangle( size ): 5 for _ in range( 3 ): 6 forward( size ) 7 left( 360/3 ) 8 9# penupしてその座標に持っていく関数 10def setPoint( x, y ): 11 penup( ) 12 setposition( x, y ) 13 pendown( ) 14 15# 呼び出して描画 16speed( 0 ) 17tracer( False ) 18for n in range( 90 ): 19 setPoint( 90-n*2, 0 ) 20 drawTriangle( 200 ) 21 right( 4 ) 22 23# 四角形を描く関数 24def drawRectangle( x, y, width, height ): 25 setPoint( x, y ) 26 for n in range( 4 ): 27 forward( width if n % 2 == 0 else height ) 28 right( 90 ) 29 30# 呼び出して描画 31for n in range( 30 ): 32 drawRectangle( -250, 250, 100, 40 ) 33 right( 12 ) 34 35 36done( )

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

基本的なところは合っていると思うのですが、考えかたが違うようです。

図形を書く処理はすべて以下の形をしていますよね。 形によって違う場所は■にしてあります。

python

1for i in range(): 2 forward( size ) 3 right(if i % 2 == 0 else)

提示された関数は以下の形です。

python

1def drawRegular( n, size ): 2 for _ in range( n*2, 100 ): 3 right( ? if i % 2 == 0 else -72 )

中身の形は共通部分と同じにすべきですが、違ってしまっています。
ここは合わせなくてはだめです。

python

1def drawRegular( n, size ): 2 for i in range( ■A ): 3 forward( size ) 4 right( ■B if i % 2 == 0 else ■C )

さて、■A~Cの部分は形によって変わるのですが、n角形のnを使って表わす方法を考えます。
4以降については以下のように尖った角を72度に固定しているようなので、以下のようになり、n角形の場合の式はこうなります。

text

1n 4 5 6 7 8 n 2A 8 10 12 14 16 n×2 3B 162 144 132 123 117 (360÷n)+72 4C 72 72 72 72 72 72 5 ※n=7のときのBは、123.42857....

この式をあてはめればできるでしょう。

三角形のときは、特別な値を使っているので、if文で分岐させて専用の計算をするのがよさそうです。

また、角度を72ではなく60より小さい値にしてしまえば、すべて同じ式で表わすこともできますね。

投稿2022/07/10 03:01

TakaiY

総合スコア14431

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yunaojus

2022/07/10 12:53

角度を40度にしたことで解決できました!非常に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問