我只是试图将光标从A点移动到B点。这被证明是好的,直到我尝试使用一个坐标,当Y值开始减小时,它会增加。我很困惑,因为据我所知,if语句设置正确。
例如,我将X,Y坐标开始设置为0,0并将结束坐标设置为1920,1080。它在屏幕上移动对角线就好了。反之亦然,它从1920,1080移动到0,0就好了。当我设置这些坐标时(例如下面的例子),那就是出现问题的时候。我意识到它无法正常工作。我将SetCursorPos更改为std :: cout以查看问题,我的Y coord正在进入底片。
我已经思考了几天,似乎无法弄清楚这一点。我相信这是一个我忽略的简单解决方案。
#include <chrono>
#include <iostream>
#include <thread>
#include <Windows.h>
template<typename T>
void move(T x, T y, const T& nx, const T& ny)
{
T run = nx - x, rise = ny - y, addX = 0, addY = 0;
if(run > rise)
{
addX = run / rise;
addY++;
}
else
{
addX++;
addY = rise / run;
}
while(x != nx && y != ny)
{
if(x < nx)
{
x += addX;
if(x > nx)x = nx;
}
else if (x > nx)
{
x -= addX;
if(x < nx)x = nx;
}
if(y < ny)
{
y += addY;
if(y > ny)y = ny;
}
else if (y > ny)
{
y -= addY;
if(y < ny)y = ny;
}
std::cout << "X: " << x << " Y: " << y << std::endl;
std::this_thread::sleep_for(std::chrono::microseconds(1));
}
}
int main()
{
move<double>(790,310,595,650);
while(true);
}
答案 0 :(得分:2)
由于您要么添加或减去addX和addY,这取决于它们是否小于或大于nx和ny,它们需要始终为正值。因此,在计算addX和addY之前计算上升和运行的绝对值:
T run = nx - x, rise = ny - y, addX = 0, addY = 0;
if(run < 0)
run = -run;
if(rise < 0)
rise = -rise;