使用しているグラフィックス ライブラリがわからないと、具体的な答えを出すのは困難です。しかし、次の 4 つの可能性があります。
ライブラリには、Arc
クラスに似たクラスがある場合や、(塗りつぶされた) 円弧だけを表示するようにオブジェクトをCircle
制限する方法などがある場合があります。Circle
もしそうなら、あなたの半円を得るために、あなたはのようなものを使うでしょうArc(centre, 20, -math.pi/2, math.pi/2)
とArc(centre, 20, math.pi/2, 3*math.pi/2)
.
ライブラリには、明示的な境界ボックスを設定してオブジェクトを切り捨てる方法がある場合があります。したがって、次のようにしますbb = circle.getBoundingBox(); bb.top = (bb.top + bb.bottom) / 2; circle.setBoundingBox(bb)
。
ライブラリにはこれを行うための明示的な方法がない場合がありますが、Z オーダーで他のものの上に物を描画できる場合があります。したがって、最初に上部を横切る 5 つの完全な円を描き、次にすべての円の下半分を覆う大きな白い長方形を描きます。(境界線の色と塗りつぶしの色を設定する方法があれば、これらの長方形の線を無料で提供することもできます。)
ライブラリにはこれを行う方法がまったくない場合があり、その場合は別のライブラリを使用する必要があります。
一方、「コードを y 軸に沿って繰り返す方法」については、それは既にあるループの外側にある別のループです。このようなもの:
def fdShape():
win = GraphWin("pdShape",200,200)
centre = Point(20,100)
for y in range(9):
for x in range(5):
circle = Circle(centre, 20)
circle.setFill("red")
centre = Point((centre.getX() + 40), centre.getY())
circle.draw(win)
centre = Point(20, centre.getY() + 40)
ただし、明示的に追加するのではなく、x と y からポイントを作成する方がおそらく良いでしょう。
for y in range(9):
for x in range(5):
centre = Point(x * 40 + 20, y * 40 + 60)
circle = Circle(centre, 20)
circle.setFill("red")
circle.draw(win)
コメントで指定したライブラリ リンクを見ると、 1 または 2 のいずれかを実行する方法がないようです。完全なドキュメントは、私が持っていない教科書にありますが、オンラインの参照ドキュメントとコードがあります。はとても簡単です。その親クラスのいずれCircle
にも、切り捨て先の円弧またはボックスを指定する方法がありません。(境界ボックスがありますが、それを半分にカットすると、半円ではなく、元の円の半分の高さの押しつぶされた楕円になります。)
おそらく、このライブラリを必要とするコースを受講しているので、4 はオプションではありません。
つまり、実際にはループを少し変更する必要があります。このようなもの:
for y in range(4):
# draw row of circles y
# draw row 8-y
# draw rectangle y
# draw rectangle 8-y
# draw row of circles 4
長方形 3 と長方形 5 は同じものになるので、両方を描画するのは少しもったいないことに注意してください。先生が同意しない場合は、コードを再構築する方法を理解するのは非常に簡単です。
最後に、コードの再構築について言えば、異なる値で「円の行を描く」を 2 回行う必要があることを考えると、おそらくそれを関数に変換する必要があり、「長方形を描く」についても同様です。次に、上記の疑似コードが実際のコードに変わります。
for y in range(4):
drawRowOfCircles(win, y)
drawRowOfCircles(win, 8-y)
drawRectangle(win, y)
drawRectangle(win, 8-y)
drawRowOfCircles(win, 4)