Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 6, 2018 09:59:42

Lucker
Зарегистрирован: 2018-10-01
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Добрый день, столкнулся с такой задачкой, следуя дальше по курсу:
Перепишите код солнечной системы, используя метод 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)

Офлайн

#2 Окт. 7, 2018 10:48:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

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)

Офлайн

#3 Ноя. 24, 2018 09:39:43

Jseaman
Зарегистрирован: 2018-11-24
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Тоже не могу эту задачу решить. Идея такая: Отнимать начальные координаты шарика из полученных в coords в изначальном коде. По идее, можно использовать для этого созданную уже функцию sub и потом каким-то образом вставлять в circle.move()

Офлайн

#4 Ноя. 25, 2018 02:46:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Jseaman
По идее, можно использовать для этого созданную уже функцию sub
Там изначально надо всё переписывать, чтобы не было глобальных переменных. Из-за глобальных переменных там и создана вся проблема с внесением изменений в код.



Офлайн

#5 Янв. 18, 2019 15:56:43

AntoNguyen
Зарегистрирован: 2019-01-18
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Кто-то нашел решение этой задачи?? для меня всё еще актуально…

Офлайн

#6 Окт. 26, 2019 21:28:38

rahmanoff
Зарегистрирован: 2019-09-28
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Также столкнулся с этой задачей.
Не могу понять, как получить текущие координаты Планеты.

Офлайн

#7 Ноя. 16, 2019 20:42:30

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Думаю, все уже давно решили.
Так на всякий случай:

Первое нужно понять, что задача уже решена, т.е. не нужно ничего вычислять, писать какие-то новые функции и т.д. Нужно в нужный момент пользоваться вычисленными значениями функций. Это код идущий после всех функций в оригинальном файле 4.py.

Дальше нужно понять задание, т.е. надо сменить способ отрисовки и способ движения. Разобраться как сейчас отрисовываются объекты и как они движутся и как это должно быть, в чем разница.

После этого найти решение должно быть просто.
Сполер: нужно изменить всего 4 строки.
Если не помогло, пишите, добавлю код.

rahmanoff
Не могу понять, как получить текущие координаты Планеты.
Координаты находятся в переменной coords, вычисляются функцией update_coords.

Отредактировано Vladimirv (Ноя. 16, 2019 20:43:51)

Офлайн

#8 Ноя. 17, 2019 06:48:37

Ravil
Зарегистрирован: 2019-11-13
Сообщения: 2
Репутация: +  1  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Ну как-то так:

 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)
функции отрисовки мяча делаем возврат иначе метод “move” не увидит созданный объект

Отредактировано Ravil (Ноя. 17, 2019 18:54:14)

Офлайн

#9 Июль 20, 2020 15:56:07

grottnn
Зарегистрирован: 2020-07-08
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

Кто то из опытных решал эту задачу? Не могу сформулировать хорошее решение. Как я понимаю ‘move’ сам по себе задаёт вектор движения. То есть переменная ‘coords’ больше не нужна. Тогда вопрос: как определить местоположение шарика, чтобы не улететь за пределы поля?

Офлайн

#10 Ноя. 18, 2020 08:53:59

Garkesha
Зарегистрирован: 2020-11-18
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

вспомогательная библиотека графики graphics.py

grottnn
Кто то из опытных решал эту задачу? Не могу сформулировать хорошее решение. Как я понимаю ‘move’ сам по себе задаёт вектор движения. То есть переменная ‘coords’ больше не нужна. Тогда вопрос: как определить местоположение шарика, чтобы не улететь за пределы поля?

Переменная “coords” необходима для функции “check_coords”, а атрибуты для “move” задавать через “velocity”. Я использовал такой метод решения, но вот только конечный результат не сильно похож на солнечную систему)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version