2017-01-31 15 views
0

Я не могу изобразить циклон с введенным числом циклов. Предполагается, что в коде предполагается, что пользователь нажмет начальную и конечную точки, а затем будет выведен циклон с введенными циклами от начальной точки до конечной точки.Нарисуйте циклон в Python с заданным количеством циклов?

from math import * 
from graphics import * 

def main(): 
    win = GraphWin("Drawing a Cyclone",600,450)    
    win.setCoords(0,0,600,450)        
    msg = "Please enter the number of cycles, and click the start and end positions in the window." 
    Text(Point(300, 438), msg).draw(win) 
    Text(Point(65,415),"# of cycles:").draw(win) 
    inbox =Entry(Point(130,415),5) 
    inbox.draw(win) 


    start=win.getMouse() 
    start.setFill("red") 
    start.draw(win) 
    stop=win.getMouse() 
    stop.setFill("red") 
    stop.draw(win) 

    cycles=eval(inbox.getText()) 
    radius = 0             
    length = sqrt((stop.x-start.x)**2+(stop.y-start.y)**2) 
    step_radius = length/(120*cycles) 
    radian = atan((stop.y-start.y)/(stop.x-start.x)) 
    initial_angle = int(degrees(radian)) 

    for i in (0, cycles*360, 3): 
     radius = radius + step_radius 
     theta=radians(initial_angle + (360*cycles*i)+3*i) 
     stop.x = start.x + radius*cos(theta) 
     stop.y = start.y + radius*sin(theta) 
     line=Line(start,stop) 
     line.draw(win) 
     start.x=stop.x 
     start.y=stop.y 


    win.getMouse() 
    win.close() 

main() 

This is what I'm getting

This is what I'm supposed to get

+0

Исправьте код вашего кода. И ваш вопрос должен описывать, что делает этот код в настоящее время, поэтому нам не нужно тратить время на запуск кода, чтобы увидеть, что он делает неправильно. (Кроме того, не у всех есть модуль «графика»). –

ответ

2

Я бы сказал, что большую часть ваших проблем центра вокруг этого кода:

theta=radians(initial_angle + (360*cycles*i)+3*i) 
stop.x = start.x + radius*cos(theta) 
stop.y = start.y + radius*sin(theta) 

Переменная i уже трассировка круги так theta должно быть радиан эквивалент i с регулировкой для исходного угла, но вы сделали много дополнительная математика с i. Кроме того, положение остановки должно быть функцией вычислений cos() и sin(), скорректированных для начала координат фигуры, но вы используете start, который был исходным, но является движущейся мишенью внутри петли.

Один из способов отладки заключается в том, чтобы установить циклы в 1 и установить radius = length вместо radius += step_radius. Это даст вам простой круг для выработки проблем правильного позиционирования, радиуса и т. Д. Без дополнительного усложнения спирали. Затем добавьте спираль.

Что-то больше вдоль этих линий может дать вам некоторые идеи, что исправить:

from math import * 
from graphics import * 

DEGREES_PER_STEP = 3 

win = GraphWin("Drawing a Cyclone", 600, 450) 
win.setCoords(0, 0, 600, 450) 
msg = "Please enter the number of cycles, and click the start and end positions in the window." 
Text(Point(300, 438), msg).draw(win) 
Text(Point(65, 415), "# of cycles:").draw(win) 
inbox = Entry(Point(130, 415), 5) 
inbox.draw(win) 

origin = win.getMouse() 
origin.setFill("green") 
origin.draw(win) 
target = win.getMouse() 
target.setFill("red") 
target.draw(win) 

cycles = float(inbox.getText()) 
radius = 0 
length = sqrt((target.x - origin.x) ** 2 + (target.y - origin.y) ** 2) 
step_radius = length/(cycles * 360/DEGREES_PER_STEP) 
initial_angle = atan((target.y - origin.y)/(target.x - origin.x)) 

start = Point(origin.x, origin.y) 

for i in range(0, int(cycles * 360), DEGREES_PER_STEP): 
    radius += step_radius 
    theta = radians(i) + initial_angle # initial angle already in radians 
    stop = Point(origin.x + radius * cos(theta), origin.y + radius * sin(theta)) 
    line = Line(start, stop) 
    line.draw(win) 
    start = stop 

win.getMouse() 
win.close() 

Это до сих пор вопросы, получить начальный угол правильно в некоторых секторах, но это то, что вы можете работать. Кроме того, если вы нажмете точки как раз, вы можете создать деление на ноль, так что вы хотите иметь дело с этим, а также:

enter image description here

Обратите внимание, что хотя from graphics import * обычно делается, from math import * является более рискованным - - например, math.pow() перезаписывает встроенный Python pow(), и два не идентичны. Рассмотрим более безопасный импорт.