在不知道您使用的是什么图形库的情况下,很难给出具体的答案。但是有四种可能:
该库可能具有与Arc
该类类似的Circle
类,或者可能是一种限制Circle
对象仅显示(填充)弧线或类似内容的方法。如果是这样,为了得到你的半圆,你会使用类似的东西Arc(centre, 20, -math.pi/2, math.pi/2)
and Arc(centre, 20, math.pi/2, 3*math.pi/2)
。
该库可能有一种方法来设置显式边界框以截断任何对象。所以,你会做这样的事情:bb = circle.getBoundingBox(); bb.top = (bb.top + bb.bottom) / 2; circle.setBoundingBox(bb)
.
该库可能没有任何明确的方法来执行此操作,但可以让您在 Z 顺序中的其他事物之上绘制事物。所以,首先你画五个完整的圆圈穿过顶部,然后你画一个白色的大矩形,覆盖所有圆圈的下半部分。(如果有办法设置边框颜色和填充颜色,那甚至可以免费为您提供这些矩形线。)
该库可能根本没有任何方法可以做到这一点,在这种情况下,您必须使用不同的库。
同时,对于“我如何让代码沿 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 不是一个选项。
剩下 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)