1

私はこのパターンを生成しようとしていますが、Python内で:

赤い円と半円

これは私が生成したコードで、5 つの完全な円を生成します。

def fdShape():
    win = GraphWin("pdShape",200,200)
    centre = Point(20,100)
    for x in range(5):
        circle = Circle(centre, 20)
        circle.setFill("red")
        centre = Point((centre.getX() + 40),100)
        circle.draw(win)

しかし、上下の半円を取得する方法については完全に困惑しています。誰にもアイデアはありますか?コードを y 軸に沿って繰り返す方法がわかりません。

どんな助けでも大歓迎です。

ありがとう。

4

3 に答える 3

2

Python のタートル グラフィックスを使用したソリューションを次に示しますが、おそらく想像どおりには機能しません。

from turtle import Turtle, Screen, Shape

COUNT = 5
SIZE = 400
RADIUS = SIZE / COUNT
STAMP_UNIT = 20

screen = Screen()

circle_in_square = Shape("compound")
turtle = Turtle(shape="square")
circle_in_square.addcomponent(turtle.get_shapepoly(), "white")
circle_in_square.addcomponent([(-10, 10), (-10, -10)], "black")
circle_in_square.addcomponent([(10, -10), (10, 10)], "black")

turtle.shapesize(SIZE / STAMP_UNIT * 1.01)
turtle.stamp()  # stamp background to get a border

turtle.shape("circle")
turtle.shapesize(1.0)
circle_in_square.addcomponent(turtle.get_shapepoly(), "red", "black")

screen.register_shape("squircle", circle_in_square)
turtle.shape("squircle")
turtle.shapesize(RADIUS / STAMP_UNIT)
turtle.penup()

for y in range(1 - COUNT, 1):
    for x in range(-COUNT//2 + 1, COUNT//2 + 1):
        for sign in (1, -1):
            turtle.goto(x * RADIUS, y * RADIUS/2 * sign)
            turtle.stamp()

screen.exitonclick()

最初に、私がリスと呼んでいるスタンプを作成しますこれは、上下に黒い境界線があり、白い正方形に赤い円であるスタンプです。

ここに画像の説明を入力

次に、これらの束を水平方向に並べて、垂直方向に 50% オーバーラップさせてスタンプします。

ここに画像の説明を入力

少し外側の境界線が刻印されています。これは私の「刻印によるより良い生活」シリーズの一部ですあなたの解決策と他の答えが試みた描画とは対照的に.

于 2016-12-15T01:13:50.820 に答える
1

使用しているグラフィックス ライブラリがわからないと、具体的な答えを出すのは困難です。しかし、次の 4 つの可能性があります。

  1. ライブラリには、Arcクラスに似たクラスがある場合や、(塗りつぶされた) 円弧だけを表示するようにオブジェクトをCircle制限する方法などがある場合があります。Circleもしそうなら、あなたの半円を得るために、あなたはのようなものを使うでしょうArc(centre, 20, -math.pi/2, math.pi/2)Arc(centre, 20, math.pi/2, 3*math.pi/2).

  2. ライブラリには、明示的な境界ボックスを設定してオブジェクトを切り捨てる方法がある場合があります。したがって、次のようにしますbb = circle.getBoundingBox(); bb.top = (bb.top + bb.bottom) / 2; circle.setBoundingBox(bb)

  3. ライブラリにはこれを行うための明示的な方法がない場合がありますが、Z オーダーで他のものの上に物を描画できる場合があります。したがって、最初に上部を横切る 5 つの完全な円を描き、次にすべての円の下半分を覆う大きな白い長方形を描きます。(境界線の色と塗りつぶしの色を設定する方法があれば、これらの長方形の線を無料で提供することもできます。)

  4. ライブラリにはこれを行う方法がまったくない場合があり、その場合は別のライブラリを使用する必要があります。

一方、「コードを 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)
于 2012-11-20T19:45:58.437 に答える
-1

Python のturtleパッケージを見てください。タートル内では、円とそれをプロットする角度の範囲を指定できます。もちろん、円の中心をどこに置くかを見つけて、心ゆくまで反復する必要があります。

于 2012-11-20T19:37:32.120 に答える