2016-07-05 2 views
0

Я добрался до набора лучей, но мне нужно соединить их. Любая помощь? Мой код выглядит следующим образомЯ хочу создать кривую 90 градусов

from math import * 
from graphics import * 
i = 1 
segments = 15 
lastPoint = Point(100,0) 
print("Begin") 
win = GraphWin("Trigonometry", 1500, 1500) 
while i<=segments: 

    angle =i*pi/segments 
    y = int(sin(angle)*100) 
    x = int(cos(angle)*100) 

    i = i+1 
    p = Point(x,y) 
    l = Line(p, lastPoint) 
    l.draw(win) 
    print(p.x, p.y) 

print("End") 

ответ

0

код 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") 
+0

Есть ли шанс, что вы могли бы объяснить изменения? Я новичок и очень хотел бы узнать, что вы сделали, а не просто скопировать. Благодаря! –

+0

@AryaVenugopalan. Ваш код рисует только «лучи», потому что, в то время как 'p' лежит на круге,' lastPoint' не изменяется между итерациями. В моем коде выполняется линия между фактической рассчитанной точкой и последней, принадлежащей к кругу. Я также немного модифицировал формулу для вычисления дуги, так как 90 градусов соответствуют pi/2 радианам (предварительно рассчитанный множитель) и явной точке центра и радиусу. –

+0

@AryaVenugopalan Я отредактировал свой ответ. Пожалуйста, проверьте, достаточно ли это достаточно или вам нужно больше объяснений. Кроме того, если этот ответ вам полезен, рассмотрите [принятие] (http://stackoverflow.com/help/accepted-answer). –

Смежные вопросы