通过鼠标移动沿圆形路径移动一个点(python / pygame)

问题:使用鼠标输入沿圆形路径移动点作为指导。

在线上有很多解决方案可以沿着圆形路径移动一个点,即使用中心+数学公式|| cos(角度)*半径方程并递增角度。 但是,这不适用于鼠标输入。 即使只是原始x / y值的一小部分,并转换为弧度,“圆”的半径也不会变化,路径点与鼠标位置之间的关系变得异常。

我的想法是,路径点(圆的圆周上的点)需要被限制在距原点一定距离处(强制半径)。 我也感觉到,要么y需要是x或x的函数才能成为y的函数。

我已经沿着使用距离公式的路线去检查从路径点到圆心的距离。 这个想法是然后将x和y值“反弹”到允许的距离 - 真正的距离,但是......不起作用。 也就是说,因为两点之间的距离和两点之间的差异(我如何开始理解它是两点之间的差异产生矢量?)之间存在差异。 无论如何,我确信有一个更直接的解决方案。

旋转手臂由鼠标引导 (让我们假装旋转臂居中,为了图示)


不需要三角函数。 通过计算到中心的距离,你已经走上了一条好路。 想象一下从圆心到鼠标位置的矢量。 现在,该点必须位于与这个向量相同的方向,这意味着我们可以用一个简单的标量乘法计算它的位置。 唯一剩下的就是计算标量,它是鼠标距离和圆弧半径之间的比例:

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()

您可以使用圆的x,y原点以及鼠标的x,y位置来计算鼠标和圆之间的角度: tan((y_mouse-y_circle)/(x_mouse-x_circle))然后位置(x_circle + r * cos(angle), y_circle + r * sin(angle))

链接地址: http://www.djcxy.com/p/85011.html

上一篇: moving a point along a circular path via mouse motion (python/pygame)

下一篇: Nearest neighbor using polar coordinates