打算手动实现图形学中的绝大部分算法。
运行环境winform+c# (代码是通用的,如果在其他地方画图,只需要替换掉画点的函数即可)
我们的函数默认是按x坐标顺序递增传入的,因此在调用下面函数之前,需要保证p1.x<p2.x(可以减少讨论数量)
Point pp = new Point();
if (p1.X > p2.X)
{
pp = p1;
p1 = p2;
p2 = pp;
}
1.DDA算法
根据-0.5,0,0.5分割斜率,可以把直线分成四个部分,这个算法本质比较简单,注意讨论好这四个方向的直线也没多大问题。
void DDADrawLine(Point p1,Point p2)
{
Graphics g = this.CreateGraphics();
Brush p = new SolidBrush(Color.Red);
int dx = p2.X - p1.X;
int dy = p2.Y - p1.Y;
float x, y;
float k;
if (Math.Abs(dx) >= Math.Abs(dy))
{
k = (float)dy / dx;
x = p1.X;
y = p1.Y;
for (int i = 0; i <= Math.Abs(dx); i++)
{
g.FillRectangle(p, new RectangleF(x, (int)(y + 0.5), 1, 1));
y += k;
x++;
}
}
else if (Math.Abs(dx) < Math.Abs(dy))
{
k = (float)dx / dy;
x = p1.X;
y = p1.Y;
for (int i = 0; i <= Math.Abs(dy); i++)
{
g.FillRectangle(p, new RectangleF((int)(x