不需要三角函数。 通过计算到中心的距离,您已经走上了一条很好的道路。 想象一下从圆心到鼠标位置的矢量。 点现在必须某处位于相同的方向作为 这种载体,这意味着我们可以计算出其位置 用简单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()
感谢@马克!三角函数提出了一个零分割错误。通过在圆的中心周围设置一个屏障,将鼠标和鼠标的所有值都设置为1,可能可以解决此问题。我还遇到了敏感性 - 当我移动鼠标时,终点会围绕该圆圈飞行。我想知道是否没有办法在方程中引入角速度来弥补这一点。 @Meyer,这太棒了!矢量元组里面的元素叫什么? (如果有名称) –
另外,不是直接在主题上,但我注意到CENTER [0] +矢量[0] *标量具有与中心+ cos(theta)*半径相同的形式。好奇。 –
我知道元素为矢量坐标或矢量元素。 至于零除,我尴尬地忘记了, 并相应地修复了代码。请注意,'satelliteCenter'现在只在距离不为零时更新。是的,与矢量之间角度的余弦关系密切, 参见[矢量投影](https://en.wikipedia.org/wiki/Vector_projection)上的维基百科条目。 – Meyer