我正在玩高度图(位图),试图在我的游戏中创建自己的一些东西,为此,我需要实现一些基本的绘制方法。我很快意识到画直线并不像我想的那么基本。
简单的是,如果您的点共享X或Y坐标,或者它们已对齐,则可以绘制一条完美的对角线。但是在所有其他情况下,它都比较棘手。
您使用哪种算法确定需要对哪些像素进行着色才能使其成为“直线”?
我正在玩高度图(位图),试图在我的游戏中创建自己的一些东西,为此,我需要实现一些基本的绘制方法。我很快意识到画直线并不像我想的那么基本。
简单的是,如果您的点共享X或Y坐标,或者它们已对齐,则可以绘制一条完美的对角线。但是在所有其他情况下,它都比较棘手。
您使用哪种算法确定需要对哪些像素进行着色才能使其成为“直线”?
Answers:
我认为您需要的是Bresenham的line算法。
从我记得它是用来确定哪些应该是彩色的点,没有多少每个点应该是彩色的。
Bresenham的线算法可用于确定要绘制的栅格网格中的哪些点,以实现线段的适当视觉近似。
该算法涵盖了由坐标原点位于左上角的坐标空间中的原点和端点定义的线的栅格化。假定整数坐标映射到像素中心。值得注意的是,该算法的基本形式仅覆盖圆的一个八分圆:该线的X和Y坐标增加,但斜率的绝对值小于1。所有其他八分圆都可以通过对此的简单变换得出基本八分圆。
在psuedocode中,此基本形式如下:
void DrawLine(Point origin, Point endpoint, Bitmap surface) {
deltaX = endpoint.X - origin.X
deltaY = endpoint.Y - origin.Y
error = 0
// Note the below fails for completely vertical lines.
deltaError = absoluteValue(deltaY / deltaX)
Y = origin.Y
for (X from origin.X to endpoint.X) {
surface.PlotPixel(X, Y)
error = error + deltaError
if (error >= 0.5) {
++Y;
error -= 1.0
}
}
}
to->red = br * (float)from->red;
为以下内容:to->red = (br * (float)from->red) + ((1-br) * (float) to->red);
。执行相同的绿色和蓝色respectivly
这是画线的一种非常简单的方法。可以轻松更改该功能以在项目中使用。
void draw_line(float x0, float y0, const float& x1, const float& y1)
{
float x{x1 - x0}, y{y1 - y0};
const float max{std::max(std::fabs(x), std::fabs(y))};
x /= max; y /= max;
for (float n{0}; n < max; ++n)
{
// draw pixel at ( x0, y0 )
x0 += x; y0 += y;
}
}