这就是我刚刚发现可行的方法。可能不是最漂亮的插值,但它只是在一次预计算的线上每次迭代增加 1-2 个浮点数。通过计算曼哈顿矩阵的步数来工作。
啊,它还没有捕捉到直线垂直的情况(dx = 0)
这是朴素的bresenham,但理论上迭代也只能使用整数。如果你想摆脱浮点颜色值,事情会变得更难,因为线条可能比色差长,所以 delta-color < 1。
void Brepolate( uint8_t* pColorBuffer, uint8_t cs, float xs, float ys, float zs, uint8_t ce, float xe, float ye, float ze )
{
float nColSteps = (xe - xs) + (ye - ys);
float fColInc = ((float)cs - (float)ce) / nColSteps;
float fCol = cs;
float dx = xe - xs;
float dy = ye - ys;
float fCol = cs;
if (dx > 0.5)
{
float de = fabs( dy / dx );
float re = de - 0.5f;
uint32_t iY = ys;
uint32_t iX;
for ( uint32_t iX = xs;
iX <= xe;
iX++ )
{
uint32_t off = surf.Offset( iX, iY );
pColorBuffer[off] = fCol;
re += de;
if (re >= 0.5f)
{
iY++;
re -= 1.0f;
fCol += fColInc;
}
fCol += fColInc;
}
}
}