坐标不正确,未正确添加

时间:2015-07-07 03:40:51

标签: c++ loops coordinates

我只是试图将光标从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);
}

1 个答案:

答案 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;