我希望在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轴重复。
非常感谢任何帮助。
感谢。
答案 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 的邮票,这是一个白色方块上的红色圆圈,顶部和底部有黑色边框:
然后在水平面上并排印出一堆这些,50%重叠在垂直方向上:
加上一点外边框。这是我的“通过 Stamping ”更好的生活系列的一部分(而不是绘图你的解决方案和其他尝试回答。
答案 1 :(得分:1)
不知道你正在使用什么图形库,很难给出具体的答案。但有四种可能性:
库可能有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顺序中的其他东西之上绘制东西。所以,首先你画出五个完整的圆圈,然后画一个大的白色矩形,覆盖所有圆圈的下半部分。 (如果有办法设置边框颜色以及填充颜色,那甚至可以免费提供那些矩形线条。)
图书馆根本无法做到这一点,在这种情况下你必须使用不同的图书馆。
同时,对于“我将如何让代码沿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)