Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过鼠标移动沿圆形路径移动点(python/pygame)_Python_Rotation_Pygame_Geometry - Fatal编程技术网

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

通过鼠标移动沿圆形路径移动点(python/pygame),python,rotation,pygame,geometry,Python,Rotation,Pygame,Geometry,问题是:以鼠标输入为向导沿圆形路径移动点 在线上有很多沿圆形路径移动点的解决方案,即使用圆心+数学.sin | | cos(角度)*半径方程和增加角度。但是,这不适用于鼠标输入;即使是原始x/y值的一小部分并转换为弧度,您的“圆”也没有恒定的半径,路径点与鼠标位置的移动关系也很奇怪 我的理解是路径点(圆圆周上的点)需要限制在距离原点一定的距离(强制半径)。我也觉得y需要是x的函数,或者x需要是y的函数 我一直在使用距离公式来检查从路径点到圆心的距离。当时的想法是将x和y值“捕捉”回允许的距离-真

问题是:以鼠标输入为向导沿圆形路径移动点

在线上有很多沿圆形路径移动点的解决方案,即使用圆心+数学.sin | | cos(角度)*半径方程和增加角度。但是,这不适用于鼠标输入;即使是原始x/y值的一小部分并转换为弧度,您的“圆”也没有恒定的半径,路径点与鼠标位置的移动关系也很奇怪

我的理解是路径点(圆圆周上的点)需要限制在距离原点一定的距离(强制半径)。我也觉得y需要是x的函数,或者x需要是y的函数

我一直在使用距离公式来检查从路径点到圆心的距离。当时的想法是将x和y值“捕捉”回允许的距离-真实距离,但这……不起作用。也就是说,因为两点之间的距离和两点之间的差是不同的(我是如何开始理解两点之间的差产生一个向量的?)。无论如何,我相信有一个更直接的解决办法


(为了便于演示,假设旋转臂居中)

您可以使用圆的x,y原点和鼠标的x,y位置来计算鼠标和圆之间的角度,使用:
tan((y\u鼠标-y\u圆)/(x\u鼠标-x\u圆))
然后点的位置将是
(x\u圆+r*cos(角度),y_圆+r*sin(角度))

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

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

谢谢@Mark!三角函数产生了一个零除误差。可能可以通过在圆的中心周围设置一个屏障来解决这个问题,其中mousex和mousey的所有值都设置为1。我还遇到了灵敏度问题——当我移动鼠标时,端点会在圆的周围来回移动。我不知道是否有一个障碍在方程中加入角速度的方法来解决这个问题。@Meyer,这太棒了!向量元组中的元素叫什么?(如果有名字的话)。另外,不是直接在这个主题上,但我注意到中心[0]+向量[0]*标量与中心+cos(θ)的形式相同*半径。奇怪。我知道元素是矢量坐标或矢量分量。至于被零除,我尴尬地忘记了这一点,并相应地修改了代码。注意,
卫星中心
现在只在距离不为零时更新。是的,它们之间的夹角的余弦有着密切的关系向量,请参见上的Wikipedia条目。