gpt4 book ai didi

python - 如何在 Python 中使用补间,而不会失去准确性?

转载 作者:行者123 更新时间:2023-12-04 15:17:00 24 4
gpt4 key购买 nike

我一直在努力使用补间来使 Python 中的鼠标移动平滑,我目前正在尝试自动化一些重复性任务。

我尝试使用补间去除一些在没有应用平滑的情况下出现的粗糙度,但是这样做我失去了明显的准确性,毕竟我的 dydx值被 number 分割我最终得到了余数。这可以通过获取 greatest common factor 来解决。在我的两个值上(因为 dxdy 都需要被相同的 number 分割)不幸的是这导致 GCD 太小。

由于鼠标无法移动屏幕上像素的其余部分,因此我最终会明显降低精度。

问题:如何对鼠标移动应用补间,而不会失去准确性?

import pytweening
import win32api
import win32con
from time import sleep

dy = [50, 46, 42, 38, 33, 29, 24, 20, 15, 10, 10]
dx = [-35, 6, -55, -43, 0, 17, 29, 38, 42, 42, 38]

while True:

count = 0

values = [(pytweening.getPointOnLine(0, 0, x, y, 0.20)) for x, y in zip(dx, dy)]

while win32api.GetAsyncKeyState(win32con.VK_RBUTTON) and win32api.GetAsyncKeyState(win32con.VK_LBUTTON):

if count < len(dx):

for _ in range(5):
win32api.mouse_event(1, int(values[count][0]), int(values[count][1]), 0, 0)
sleep(0.134 / 5)

count += 1

最佳答案

这里的基本问题是您使用的是整数数量的相对运动,这不会与您正在寻找的总运动相加。如果你只想线性移动,你也根本不需要 PyTweening。这个解决方案怎么样?

import win32api
import win32con
from time import sleep

Npoints = 5
sleeptime = 0.134 / Npoints

dys = [50, 46, 42, 38, 33, 29, 24, 20, 15, 10, 10]
dxs = [-35, 6, -55, -43, 0, 17, 29, 38, 42, 42, 38]

x, y = win32api.GetCursorPos()

for dx, dy in zip(dxs, dys):
ddx = dx/Npoints
ddy = dy/Npoints
for _ in range(Npoints):
x += ddx
y += ddy

win32api.SetCursorPos(int(x), int(y))
sleep(sleeptime)

请注意,仍然会有一些非常小的舍入误差,并且光标将在点之间沿直线移动。如果光标从 (0, 0) 开始,这是它将形成的形状(红色十字是光标将设置的点):

Shape of the mouse movements

如果你想通过这些点以平滑的曲线移动并且你可以使用 numpy 和 scipy,这将处理:
import numpy as np
import scipy.interpolate as sci

totalpoints = 50 # you can set this to a larger number to get closer spaced points
x, y = win32api.GetCursorPos()

# work out absolute coordinates of new points
xs = np.cumsum([x, *dxs])
ys = np.cumsum([y, *dys])

# fit spline between the points (s=0 makes the spline hit all the points)
tck, u = sci.splprep([xs, ys], s=0)

# Evaluate the spline and move to those points
for x, y in zip(*sci.splev(np.linspace(0, 1, totalpoints), tck)):
win32api.SetCursorPos(int(x), int(y))
sleep(sleeptime)

这导致如下所示的位置:

Spline interpolation between points

关于python - 如何在 Python 中使用补间,而不会失去准确性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59401877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com