Форум сайта python.su
Добрый день, столкнулся с такой задачкой, следуя дальше по курсу:
Перепишите код солнечной системы, используя метод move, так, чтобы объекты не создавались каждый раз в цикле.
добавил такую функцию и дописал цикл
def add2(point_1, point_2): new_point = gr.Point(point_2.x - point_1.x, point_2.y - point_1.y) return new_point
acceleration = update_acceleration(coords, gr.Point(400, 400)) coords2 = update_coords(coords, velocity) velocity = update_velocity(velocity, acceleration) movecoords = add2(coords, coords2) x = movecoords.getX() y = movecoords.getY() circle.move(x, y) coords = coords2 check_coords(coords, velocity)
import graphics as gr SIZE_X = 800 SIZE_Y = 800 window = gr.GraphWin("Model", SIZE_X, SIZE_Y) coords = gr.Point(400, 700) #начальное положение шарика (x, y) velocity = gr.Point(2, 0) #скорость (x, y) acceleration = gr.Point(0, 0) #ускорение def clear_window(): rectangle = gr.Rectangle(gr.Point(0, 0), gr.Point(SIZE_X, SIZE_Y)) rectangle.setFill('green') rectangle.draw(window) sun = gr.Circle(gr.Point(400, 400), 50) sun.setFill('yellow') sun.draw(window) def add(point_1, point_2): new_point = gr.Point(point_1.x + point_2.x, point_1.y + point_2.y) return new_point def sub(point_1, point_2): new_point = gr.Point(point_1.x - point_2.x, point_1.y - point_2.y) return new_point def draw_ball(coords): circle = gr.Circle(coords, 10) circle.setFill('red') circle.draw(window) def check_coords(coords, velocity): if coords.x < 0 or coords.x > SIZE_X: velocity.x = -velocity.x if coords.y < 0 or coords.y >SIZE_Y: velocity.y = -velocity.y def update_coords(coords, velocity): return add(coords, velocity) def update_velocity(velocity, acceleration): return add(velocity, acceleration) def update_acceleration(ball_coords, center_coords): diff = sub(ball_coords, center_coords) distance_2 = (diff.x ** 2 + diff.y ** 2) ** (3/2) G = 2000 return gr.Point(-diff.x*G/distance_2, -diff.y*G/distance_2) while True: clear_window() draw_ball(coords) acceleration = update_acceleration(coords, gr.Point(400, 400)) coords = update_coords(coords, velocity) velocity = update_velocity(velocity, acceleration) check_coords(coords, velocity) gr.time.sleep(0.002)
Офлайн
https://mipt-cs.github.io/python3-2017-2018/labs/lab5.html#id22
https://mipt-cs.github.io/python3-2017-2018/extra/lab4/graphics.py
Короче, это решение у него так написано, что там надо всё переделывать и заново писать. Он использует глобальную переменную окна, которая любые изменения кода сразу блокирует.
Отредактировано py.user.next (Окт. 7, 2018 10:49:50)
Офлайн
Тоже не могу эту задачу решить. Идея такая: Отнимать начальные координаты шарика из полученных в coords в изначальном коде. По идее, можно использовать для этого созданную уже функцию sub и потом каким-то образом вставлять в circle.move()
Офлайн
JseamanТам изначально надо всё переписывать, чтобы не было глобальных переменных. Из-за глобальных переменных там и создана вся проблема с внесением изменений в код.
По идее, можно использовать для этого созданную уже функцию sub
Офлайн
Кто-то нашел решение этой задачи?? для меня всё еще актуально…
Офлайн
Также столкнулся с этой задачей.
Не могу понять, как получить текущие координаты Планеты.
Офлайн
Думаю, все уже давно решили.
Так на всякий случай:
Первое нужно понять, что задача уже решена, т.е. не нужно ничего вычислять, писать какие-то новые функции и т.д. Нужно в нужный момент пользоваться вычисленными значениями функций. Это код идущий после всех функций в оригинальном файле 4.py.
Дальше нужно понять задание, т.е. надо сменить способ отрисовки и способ движения. Разобраться как сейчас отрисовываются объекты и как они движутся и как это должно быть, в чем разница.
После этого найти решение должно быть просто.
Сполер: нужно изменить всего 4 строки.
Если не помогло, пишите, добавлю код.
rahmanoffКоординаты находятся в переменной coords, вычисляются функцией update_coords.
Не могу понять, как получить текущие координаты Планеты.
Отредактировано Vladimirv (Ноя. 16, 2019 20:43:51)
Офлайн
Ну как-то так:
import graphics as gr SIZE_X = 600 SIZE_Y = 600 window = gr.GraphWin("Model", SIZE_X, SIZE_Y) coords = gr.Point(300, 500) velocity = gr.Point(2, 0) acceleration = gr.Point(0, 0) def add(point_1, point_2): new_point = gr.Point(point_1.x + point_2.x, point_1.y + point_2.y) return new_point def sub (point_1, point_2): new_point = gr.Point(point_1.x - point_2.x, point_1.y - point_2.y) return new_point def clear_window(): rectangle = gr.Rectangle(gr.Point(0, 0), gr.Point(SIZE_X, SIZE_Y)) rectangle.setFill('green') rectangle.draw(window) sun = gr.Circle(gr.Point(300, 300), 50) sun.setFill('yellow') sun.draw(window) def draw_ball(coords): circle = gr.Circle(coords, 10) circle.setFill('red') circle.draw(window) # делаем возврат функции return circle def check_coords(coords, velocity): if coords.x < 0 or coords.x > SIZE_X: velocity.x = -velocity.x if coords.y < 0 or coords.y > SIZE_Y: velocity.y = -velocity.y def update_coords(coords, velocity): return add(coords, velocity) def update_velocity(velocity, acceleration): return add(velocity, acceleration) def update_acceleration(ball_coords, center_coords): diff = sub(ball_coords, center_coords) distance_2 = (diff.x ** 2 + diff.y ** 2) ** (3/2) G = 2000 return gr.Point(-diff.x*G/distance_2, -diff.y*G/distance_2) # выносим из цикла отрисовку объектов clear_window() circle= draw_ball(coords) # устареваем текущие координаты pref_coords= gr.Point(coords.x, coords.y) while True: # вычисляем новые координаты acceleration = update_acceleration(coords, gr.Point(300, 300)) coords = update_coords(coords, velocity) velocity = update_velocity(velocity, acceleration) check_coords(coords, velocity) # вычисляем разницу между старыми и новыми координатами if(coords.x != pref_coords.x or coords.y != pref_coords.y): w= sub(coords, pref_coords) # двигаемся на эту разницу circle.move(w.x, w.y) # устареваем новые координаты pref_coords= gr.Point(coords.x, coords.y) gr.time.sleep(0.01)
Отредактировано Ravil (Ноя. 17, 2019 18:54:14)
Офлайн
Кто то из опытных решал эту задачу? Не могу сформулировать хорошее решение. Как я понимаю ‘move’ сам по себе задаёт вектор движения. То есть переменная ‘coords’ больше не нужна. Тогда вопрос: как определить местоположение шарика, чтобы не улететь за пределы поля?
Офлайн
grottnn
Кто то из опытных решал эту задачу? Не могу сформулировать хорошее решение. Как я понимаю ‘move’ сам по себе задаёт вектор движения. То есть переменная ‘coords’ больше не нужна. Тогда вопрос: как определить местоположение шарика, чтобы не улететь за пределы поля?
Офлайн