2

我正在寻找一个基本版本的 bresenham 线算法的方程,如果 X 值已知,我可以计算 Y 值的位置。

X 始终为正且始终大于 Y。循环只是将 X 加 1 直到到达终点。

这是我的代码:

int err = (Y << 1) - X;
for(i=0; i<=X; i++)
{
    if(err > 0)
    {
        step++;
        err = (err - (X << 1)) + (Y << 1);
    }
    else
    {
        err = err + (Y << 1);
    }
    printf("X=%d  Y=%d\n", i, step);
}

我正在寻找的是一种在不运行算法且仅使用整数数学的情况下确定步长(Y 轴)的值在特定 X 值处的方法。

这样做的原因是我有一个可以暂停的系统,但只返回当前的 X 值(不是 Y),当这种情况发生时我需要计算出 Y 值。

戴夫

4

1 回答 1

0

我假设step最初是0. 从您的代码中,我们可以归纳得出等式

step * (X << 1) + err - (i + 1) * (Y << 1) == (Y << 1) - X,

这在printf声明时适用。求解step

step == ((Y << 1) - X + (i + 1) * (Y << 1) - err) / (X << 1)

这里的划分是准确的。由于X > Y,我们归纳地知道-err介于-(Y << 1)包容和(X << 1) - (Y << 1)排斥之间,所以我们应该添加该范围的最大值并让地板除法来做它的事情。

step == ((Y << 1) - X + (i + 1) * (Y << 1) + (X << 1) - (Y << 1) - 1) / (X << 1),

或者,简化,

step == ((i + 1) * (Y << 1) + X - 1) / (X << 1).

我们也可以得到一个方程err

((Y << 1) - X + (i + 1) * (Y << 1) - err) % (X << 1) == 0
err ==   ((Y << 1) - X + (i + 1) * (Y << 1) + (X << 1) - (Y << 1) - 1) % (X << 1)
       - (X << 1) + (Y << 1) + 1
err == ((i + 1) * (Y << 1) + X - 1) % (X << 1) - (X << 1) + (Y << 1) + 1
于 2014-08-25T15:31:14.647 回答