код OP рисует только «лучи», потому что, в то время как точка p
лежит на окружности, lastPoint
не изменяется между итерациями.
Мы должны обновить значение lastPoint
до буквально последней точки, рассчитанной для того, чтобы нарисовать дугу в виде серии последовательных сегментов.
Вот измененный код, с дополнительными объяснениями, как спросил ОП в своем комментарии:
from math import *
from graphics import *
# Function to calculate the integer coordinates of a Point on a circle
# given the center (c, a Point), the radius (r) and the angle (a, radians)
def point_on_circle(c, r, a) :
return Point(int(round(c.x + r*cos(a))), int(round(c.y + r*sin(a))))
# Define the graphical output window, I'll set the coordinates system so
# that the origin is the bottom left corner of the windows, y axis is going
# upwards and 1 unit corresponds to 1 pixel
win = GraphWin("Trigonometry", 800, 600)
win.setCoords(0,0,800,600)
# Arc data. Angles are in degrees (more user friendly, but later will be
# transformed in radians for calculations), 0 is East, positive values
# are counterclockwise. A value of 360 for angle_range_deg gives a complete
# circle (polygon).
angle_start_deg = 0
angle_range_deg = 90
center = Point(10,10)
radius = 200
segments = 16
angle_start = radians(angle_start_deg)
angle_step = radians(angle_range_deg)/segments
# Initialize lastPoint with the position corresponding to angle_start
# (or i = 0). Try different values of all the previous variables
lastPoint = point_on_circle(center, radius, angle_start)
print("Begin")
i = 1
while i <= segments :
# update the angle to calculate a new point on the circle
angle = angle_start + i * angle_step
p = point_on_circle(center, radius, angle)
# draw a line between the last two points
l = Line(p, lastPoint)
l.draw(win)
print(p.x, p.y)
# update the variables to move on to the next segment which share an edge
# (the last point) with the previous segment
i = i + 1
lastPoint = p
print("End")
Есть ли шанс, что вы могли бы объяснить изменения? Я новичок и очень хотел бы узнать, что вы сделали, а не просто скопировать. Благодаря! –
@AryaVenugopalan. Ваш код рисует только «лучи», потому что, в то время как 'p' лежит на круге,' lastPoint' не изменяется между итерациями. В моем коде выполняется линия между фактической рассчитанной точкой и последней, принадлежащей к кругу. Я также немного модифицировал формулу для вычисления дуги, так как 90 градусов соответствуют pi/2 радианам (предварительно рассчитанный множитель) и явной точке центра и радиусу. –
@AryaVenugopalan Я отредактировал свой ответ. Пожалуйста, проверьте, достаточно ли это достаточно или вам нужно больше объяснений. Кроме того, если этот ответ вам полезен, рассмотрите [принятие] (http://stackoverflow.com/help/accepted-answer). –