计算机图形学常用算法实现1 DDA,中点画线法,bresenham算法

本文介绍了如何使用C#在WinForm环境中手动实现计算机图形学中的DDA、中点画线法和Bresenham算法。文章强调了确保x坐标递增的重要性,并提供了四种不同方向直线的讨论和实现。虽然代码可进一步优化,但当前形式便于理解。最后展示了算法实现后的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打算手动实现图形学中的绝大部分算法。
运行环境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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值