加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

直线的扫描转换算法(DDA、中点、bresenham)

(2013-10-16 20:29:59)
标签:

it

分类: 计算机图形学作业
采用c#windows窗体应用程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DrawLine
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
        int x0,y0,x1,y1;
        TimeSpan time;
            
        void Gdibluedrawellipse(int x, int y)//圆的外接矩阵的左顶点(画蓝色的椭圆)
        {
            // Pen pen = Pens.Blue ;
            Graphics gdi = this.CreateGraphics();
            //gdi.DrawEllipse(pen ,x,y,20,20);
            gdi.FillEllipse(Brushes.Blue, x, y, 2, 2);
        }
        void Gdireddrawellipse(int x, int y)//圆的外接矩阵的左顶点(画红色的椭圆)
        {
            // Pen pen = Pens.Red ;
            Graphics gdi = this.CreateGraphics();
            gdi.FillEllipse(Brushes.Red, x, y,2, 2);
            // gdi.DrawEllipse(pen, x, y, 20, 20);
        }
         void GdiGreendrawellipse(int x, int y)//圆的外接矩阵的左顶点(画绿色的椭圆)
        {
            // Pen pen = Pens.Red ;
            Graphics gdi = this.CreateGraphics();
            gdi.FillEllipse(Brushes.Green, x, y,2, 2);
            // gdi.DrawEllipse(pen, x, y, 20, 20);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //this.Refresh();//刷新一下
            //取得第一个时间
            DateTime time1 = DateTime.Now;
           
            float  x;
            float dx, dy, k, y;
            dx = x1 - x0;
            dy = y1 - y0;
            k = dy / dx;
            y = y0;
            if (y0 > y1)
            {
                x0 = int.Parse(textBox3.Text);
                y0 = int.Parse(textBox4.Text);
                x1 = int.Parse(textBox1.Text);
                y1 = int.Parse(textBox2.Text);
            }
            if (Math.Abs(k)<=1)
            {
                if (x0 < x1)
                {
                    for (x = x0; x <= x1; x++)
                    {
                        Gdibluedrawellipse((int)x, (int)(y + 0.5));
                        y = y + k;
                    }
                }
                else {
                    for (x = x0; x >= x1; x--)
                    {
                        Gdibluedrawellipse((int)x, (int)(y + 0.5));
                        y = y + Math.Abs(k);
                    }
                }
            }
            else
            {
                x = x0;
                if (y0 < y1)
                {
                    for (y = y0; y <= y1; y++)
                    {
                        Gdibluedrawellipse((int)(x + 0.5), (int)y);
                        x = x + 1 / k;

                    }
                }
                else
                {
                    for (y = y0; y >= y1; y--)
                    {
                        Gdibluedrawellipse((int)(x + 0.5), (int)y);
                        x = x + 1 / k;

                    }
                }

            }

            //取得第二个时间
            DateTime time2 = DateTime.Now;
            //相减得到时间差
             time= time2 - time1;
             textBox5.Text=time.ToString();
        }
  
        private void button2_Click(object sender, EventArgs e)
        {
            //取得第一个时间

            DateTime time1 = DateTime.Now;

            float k;
            int x, y, a, b, d1, d2, d;
            a = y0 - y1; b = x1 - x0;
            k = (float)(-a)/ (float)b;
            d = 2 * a + b; d1 = 2 * a; d2 = 2 * (a + b);
            x = x0; y = y0; Gdireddrawellipse(x, y);

            if (k <= 1 && k >= 0)
            {
                while (x < x1)
                {
                    x = x + 1;
                    if (d < 0) { y = y + 1; d += d2; }
                    else { d += d1; }
                    Gdireddrawellipse(x, y);
                }
            }
            else if (k >= 1 )
            {
                d = a + 2 * b;
                while (y < y1)
                {
                    y = y + 1;
                    if (d > 0) { x = x + 1; d += 2*a+2*b; }
                    else { d += 2*b; }
                    Gdireddrawellipse(x, y);
                }

            }
            else if (k<-1)
            {
                d = -a + 2 * b;
                while (y < y1)
                {
                    y = y + 1;
                    if (d < 0) { x = x - 1; d += -2 * a + 2 * b; }
                    else { d += 2 * b; }
                    Gdireddrawellipse(x, y);
                }

            }
            else
            {
                d = b - 2 * a;
                while (x > x1)
                {
                    x = x - 1;
                    if (d > 0) { y = y + 1; d += -2 * a + 2 * b; }
                    else { d += -2*a; }
                    Gdireddrawellipse(x, y);
                }
            }
            //取得第二个时间
            DateTime time2 = DateTime.Now;
            //相减得到时间差
            time = time2 - time1;
            textBox5.Text = time.ToString();

        }

        private void button4_Click(object sender, EventArgs e)
        {
            x0 = int.Parse(textBox1.Text);
            y0 = int.Parse(textBox2.Text);
            x1= int.Parse(textBox3.Text);
            y1 = int.Parse(textBox4.Text);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            DateTime time1 = DateTime.Now;
            int x, y, dx, dy,e0;
            float k;
            dx = x1 - x0;
            dy = y1 - y0;
            k = (float)dy /(float)dx;
            e0 = -dx;
            x = x0;
            y = y0;
            if (k <= 1 && k >=0)
            {
                for (int i = 0; i <= dx; i++)
                {
                    GdiGreendrawellipse(x, y);
                    x = x + 1;
                    e0 = e0 + 2 * dy;
                    if (e0 >= 0)
                    {
                        y = y + 1;
                        e0 = e0 - 2 * dx;
                    }

                }
            }
            else if (k > 1)
            {
                for (int i = 0; i <= dy; i++)
                {
                    GdiGreendrawellipse(x, y);
                    y = y + 1;
                    e0 = e0 + 2 * dx;
                    if (e0 >= 0)
                    {
                        x= x + 1;
                        e0 = e0 - 2 * dy;
                    }

                }
            }
            else if (k < -1)
            {
                for (int i = 0; i <= dy; i++)
                {
                    GdiGreendrawellipse(x, y);
                    y = y + 1;
                    e0 = e0 - 2 * dx;
                    if (e0 >= 0)
                    {
                        x = x - 1;
                        e0 = e0 - 2 * dy;
                    }

                }
            }
            else
            {
                for (int i = 0; i >= dx; i--)
                {
                    GdiGreendrawellipse(x, y);
                    x = x - 1;
                    e0 = e0 - 2 * dy;
                    if (e0 <= 0)
                    {
                        y = y + 1;
                        e0 = e0 - 2 * dx;
                    }

                }
            }

            //取得第二个时间
            DateTime time2 = DateTime.Now;
            //相减得到时间差
            time = time2 - time1;
            textBox5.Text = time.ToString();

        }

    }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有