坐标不对,添加不正确
Incorrect coordinates, not adding correctly
我只是想将光标从 A 点移动到 B 点。事实证明这很好,直到我尝试使用 Y 值应该增加时开始减少的坐标。我很困惑,因为据我所知,我已经正确设置了 if 语句。
例如,我将开始的 X,Y 坐标设置为 0,0,结束坐标为 1920,1080。它在屏幕上沿对角线移动就好了。反之亦然,它从 1920,1080 移动到 0,0 就好了。当我设置了这些坐标时(在下面的示例中),那就是问题发生的时候,我意识到它不能正常工作。我将 SetCursorPos 更改为 std::cout 以调查问题,我的 Y 坐标正向负数移动。
我已经思考了几天,但似乎无法弄清楚。我确信这是一个我忽略的简单解决方案。
#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);
}
由于您要添加或减去 addX 和 addY,具体取决于它们是小于还是大于 nx 和 ny,因此它们必须始终为正值。因此,在计算 addX 和 addY 之前,只需计算 rise 和 运行 的绝对值即可:
T run = nx - x, rise = ny - y, addX = 0, addY = 0;
if(run < 0)
run = -run;
if(rise < 0)
rise = -rise;
我只是想将光标从 A 点移动到 B 点。事实证明这很好,直到我尝试使用 Y 值应该增加时开始减少的坐标。我很困惑,因为据我所知,我已经正确设置了 if 语句。
例如,我将开始的 X,Y 坐标设置为 0,0,结束坐标为 1920,1080。它在屏幕上沿对角线移动就好了。反之亦然,它从 1920,1080 移动到 0,0 就好了。当我设置了这些坐标时(在下面的示例中),那就是问题发生的时候,我意识到它不能正常工作。我将 SetCursorPos 更改为 std::cout 以调查问题,我的 Y 坐标正向负数移动。
我已经思考了几天,但似乎无法弄清楚。我确信这是一个我忽略的简单解决方案。
#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);
}
由于您要添加或减去 addX 和 addY,具体取决于它们是小于还是大于 nx 和 ny,因此它们必须始终为正值。因此,在计算 addX 和 addY 之前,只需计算 rise 和 运行 的绝对值即可:
T run = nx - x, rise = ny - y, addX = 0, addY = 0;
if(run < 0)
run = -run;
if(rise < 0)
rise = -rise;