创建重复的圆x和y轴python

时间:2012-11-20 19:30:24

标签: python python-3.x python-2.7

我希望在python中生成这个模式:

red circles and semicircles

以下是我生成的代码,它生成了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轴重复。

非常感谢任何帮助。

感谢。

3 个答案:

答案 0 :(得分: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()

首先创建一个我称之为 squircle 的邮票,这是一个白色方块上的红色圆圈,顶部和底部有黑色边框:

enter image description here

然后在水平面上并排印出一堆这些,50%重叠在垂直方向上:

enter image description here

加上一点外边框。这是我的“通过 Stamping ”更好的生活系列的一部分(而不是绘图你的解决方案和其他尝试回答。

答案 1 :(得分:1)

不知道你正在使用什么图形库,很难给出具体的答案。但有四种可能性:

  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顺序中的其他东西之上绘制东西。所以,首先你画出五个完整的圆圈,然后画一个大的白色矩形,覆盖所有圆圈的下半部分。 (如果有办法设置边框颜色以及填充颜色,那甚至可以免费提供那些矩形线条。)

  4. 图书馆根本无法做到这一点,在这种情况下你必须使用不同的图书馆。

  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)
    

    the library link you gave in the comments,似乎没有任何方法可以做1或2.完整的文档在我没有的教科书中,但有reference docs在线,而且代码非常简单。 Circle或其任何父类都没有任何方法可以指定弧,或者是要截断的框。 (有一个边界框,但是切成两半会导致压扁椭圆的一半高度,而不是半圆。)

    并且大概你正在学习一门需要这个库的课程,所以4不是一个选择。

    哪一个离开3.这意味着你实际上必须稍微改变一下。像这样:

        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将是相同的,因此绘制两者都有点浪费,但我认为在这种情况下,保持代码更简单是值得浪费的。如果您的老师不同意,那么弄清楚如何重构代码应该很容易。

    最后,谈到重构代码,假设您必须使用不同的值两次“绘制圆圈”,您应该将其转换为函数,同样适用于“绘制矩形”。然后上面的伪代码变成实际代码:

        for y in range(4):
            drawRowOfCircles(win, y)
            drawRowOfCircles(win, 8-y)
            drawRectangle(win, y)
            drawRectangle(win, 8-y)
        drawRowOfCircles(win, 4)
    

答案 2 :(得分:-1)

看一下python中的turtle包。在龟中,您可以指定circle以及绘制它的角度范围。当然,你只需要弄清楚圈子的中心位置并迭代你的心灵内容!