Найти - Пользователи
Полная версия: вспомогательная библиотека графики graphics.py
Начало » Python для новичков » вспомогательная библиотека графики graphics.py
1 2
Lucker
Добрый день, столкнулся с такой задачкой, следуя дальше по курсу:
Перепишите код солнечной системы, используя метод 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)
py.user.next
https://mipt-cs.github.io/python3-2017-2018/labs/lab5.html#id22
https://mipt-cs.github.io/python3-2017-2018/extra/lab4/graphics.py

Короче, это решение у него так написано, что там надо всё переделывать и заново писать. Он использует глобальную переменную окна, которая любые изменения кода сразу блокирует.
Jseaman
Тоже не могу эту задачу решить. Идея такая: Отнимать начальные координаты шарика из полученных в coords в изначальном коде. По идее, можно использовать для этого созданную уже функцию sub и потом каким-то образом вставлять в circle.move()
py.user.next
Jseaman
По идее, можно использовать для этого созданную уже функцию sub
Там изначально надо всё переписывать, чтобы не было глобальных переменных. Из-за глобальных переменных там и создана вся проблема с внесением изменений в код.
AntoNguyen
Кто-то нашел решение этой задачи?? для меня всё еще актуально…
rahmanoff
Также столкнулся с этой задачей.
Не могу понять, как получить текущие координаты Планеты.
Vladimirv
Думаю, все уже давно решили.
Так на всякий случай:

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

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

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

rahmanoff
Не могу понять, как получить текущие координаты Планеты.
Координаты находятся в переменной coords, вычисляются функцией update_coords.
Ravil
Ну как-то так:
 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” не увидит созданный объект
grottnn
Кто то из опытных решал эту задачу? Не могу сформулировать хорошее решение. Как я понимаю ‘move’ сам по себе задаёт вектор движения. То есть переменная ‘coords’ больше не нужна. Тогда вопрос: как определить местоположение шарика, чтобы не улететь за пределы поля?
Garkesha
grottnn
Кто то из опытных решал эту задачу? Не могу сформулировать хорошее решение. Как я понимаю ‘move’ сам по себе задаёт вектор движения. То есть переменная ‘coords’ больше не нужна. Тогда вопрос: как определить местоположение шарика, чтобы не улететь за пределы поля?

Переменная “coords” необходима для функции “check_coords”, а атрибуты для “move” задавать через “velocity”. Я использовал такой метод решения, но вот только конечный результат не сильно похож на солнечную систему)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB