2017-02-11 18 views
2

Проблема: переместите точку по круговой траектории с помощью мыши в качестве руководства.перемещение точки по круговой траектории с помощью мыши (python/pygame)

Существует множество решений в режиме онлайн для перемещения точки по круговой траектории, а именно с использованием уравнения радиуса радиуса + math.sin || cos (angle) * и увеличения угла. Однако это не работает с вводом мыши; даже на долю исходного значения x/y и преобразованный в радианы, ваш «круг» не имеет постоянного радиуса, а точка пути перемещается в странном соотношении с положением мыши.

Я полагаю, что точка пути (точка на окружности круга) должна быть ограничена определенным расстоянием от начала координат (принудительный радиус). У меня также возникает ощущение, что либо y должна быть функцией x, либо x должна быть функцией y.

Я пошел по пути использования формулы расстояния, чтобы проверить расстояние от точки пути до центра круга. Идея заключалась в том, чтобы затем «привязать» значения x и y обратно на допустимое расстояние - истинное расстояние, но это ... не сработало. А именно потому, что существует разница между расстоянием между двумя точками и разницей между двумя точками (как я начинаю , начинаю, чтобы понять, что разница между двумя точками дает вектор?). Во всяком случае, я уверен, что есть более простое решение.

rotating arm guided by a mouse (давайте ... делать вид, вращающийся рычаг по центру, для иллюстрации)

ответ

0

Нет необходимости в тригонометрических функциях. Вы были на хорошем пути, вычислив расстояние до центра. Представьте вектор от центра круга к положению мыши. Точка теперь должна лежать где-то в том же направлении как этот вектор, что означает, что мы можем рассчитать его позицию с простым scalar multiplication. Единственное, что остается вычислить скаляр, который является доля между расстоянием мыши и радиус окружности:

from __future__ import division # For Python 2.7 
import pygame 

pygame.init() 
screen = pygame.display.set_mode((400, 400)) 

CENTER = (200, 200) 
RADIUS = 100 

satelliteCenter = (CENTER[0]+RADIUS, CENTER[1]) 

running = True 
while running: 
    for event in pygame.event.get(): 
    if event.type == pygame.QUIT: running = False 

    mouse = pygame.mouse.get_pos() 
    vector = (mouse[0]-CENTER[0], mouse[1]-CENTER[1]) 
    distance = (vector[0]**2 + vector[1]**2)**0.5 

    if distance > 0: 
    scalar = RADIUS/distance 
    satelliteCenter = (
     int(round(CENTER[0] + vector[0]*scalar)), 
     int(round(CENTER[1] + vector[1]*scalar))) 

    screen.fill((152,206,231)) 
    pygame.draw.circle(screen, (71,153,192), CENTER, RADIUS) 
    pygame.draw.circle(screen, (243,79,79), satelliteCenter, 16) 
    pygame.display.update() 
+0

Благодаря @Mark! Тригонометрическая функция подняла ошибку с нулевым делением. Вероятно, это можно было бы обойти вокруг этого, создав барьер вокруг центра круга, где все значения, полученные для mousex и mousey, равны 1. Я также столкнулся с чувствительностью - когда я передвинул мышь, конечная точка пошла бы по кругу. Интересно, не существует способа включить угловую скорость в уравнение, чтобы исправить это. @Meyer, это замечательно! Каковы элементы внутри векторного кортежа? (если есть имя.) –

+0

Кроме того, не по теме напрямую, но я замечаю, что скаляр CENTER [0] + vector [0] * имеет тот же вид, что и радиус центра + cos (theta) *. Любопытно. –

+0

Я знаю элементы как векторные координаты или векторные компоненты. Что касается деления на ноль, я смущающе забыл об этом, и исправил код соответствующим образом. Обратите внимание, что 'satelliteCenter' теперь обновляется только тогда, когда расстояние не равно нулю. Да, существует тесная связь с косинусом угла между векторами, см., Например, запись в Википедии о [векторной проекции] (https://en.wikipedia.org/wiki/Vector_projection). – Meyer

0

Вы можете использовать X, Y координат окружности, а х, у положение мыши для вычисления угла между мышью и окружностью, используя: tan((y_mouse-y_circle)/(x_mouse-x_circle)), тогда положение точки будет (x_circle + r * cos(angle), y_circle + r * sin(angle))

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

  • Нет связанных вопросов^_^