本帖最后由 lianglin999 于 2010-03-28 21:09:26 编辑

解决方案 »

  1.   

    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 myLine
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public void setMyPixel(Bitmap bmp, int x, int y, Color c)
            {//我自己的画点函数,画布以外的点不会出错
                if (x < 0 || x >= bmp.Width || y < 0 || y >= bmp.Height)
                    return;
                bmp.SetPixel(x, y, c);
            }        private void Form1_Resize(object sender, EventArgs e)
            {//窗体大小改变的时候重新刷新
                Refresh();
            }        private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Bitmap bmp = new Bitmap(Width, Height);//准备的一个内存位图bmp,位图的尺寸等于界面的尺寸            int xc = ClientSize.Width / 2;//获取客户画线区域的水平中点
                int yc = ClientSize.Height / 2;//获取客户画线区域的垂直中点
                int r = xc > yc ? yc : xc;//找到宽和高中较小的一个来作为画线的长度           
                double aa = Math.PI / 180;//角度弧度转换的时候需要   角度*PI/180=弧度
                for (double i = 0; i <= 360; i += 5)//旋转画出多方向的直线,其中5是每次旋转的角度
                {
                    int y = (int)(Math.Sin(i * aa) * r);//计算得出角度i时的X坐标
                    int x = (int)(Math.Cos(i * aa) * r);//计算得出角度i时的Y坐标
                    DrawMyLine(bmp, xc, yc, x + xc, y + yc, Color.Red);//以画线区域中心点每次旋转i度画个方向直线
                }            DrawMyLine(bmp, 0, yc, ClientSize.Width, yc, Color.Black);//画X轴
                DrawMyLine(bmp, xc, 0, xc, ClientSize.Height, Color.Black);//画Y轴            e.Graphics.DrawImage(bmp, 0, 0);//内存位图bmp绘制好后,将bmp整体绘制到界面中,(0,0)表示将位图帖在界面的左上角
                bmp.Dispose();//释放bmp的内存
            }
            public void DrawMyLine(Bitmap bmp, int x0, int y0, int x1, int y1, Color c)
            {
                //逆时针分8部分
                //1458|dx|.|dy|替换dx,dy 此时,X(i+1)=Xi+1,Y(i+1)=Yi K<=1
                //2367 |dx|,|dy|对换  此时,X(i+1)=Xi,Y(i+1)=Yi+1 K>1            int x, y, dx, dy, e;
                int i, temp;
                bool isChange = false;//如果直线斜率<=1, isChange=false; 否则isChange=true,即是否交换过dx,dy的值
                int Step_X = 1, Step_Y = 1;//取值为1 或 -1 ,表示迭代过程中 x坐标和y坐标变化的方向            dx = x1 - x0;
                dy = y1 - y0;            //--->
                if (dx < 0)
                {
                    dx = -dx; //dx始终为正
                    Step_X = -1; ;//改变x的迭代方向为负,即每次迭代x减1,画Y轴左边部分,3456部分
                }
                if (dy < 0)
                {
                    dy = -dy; //dy始终为正
                    Step_Y = -1;  //改变y的迭代方向为负,即每次迭代y减1,画X轴下边部分,5678部分
                }            if (dy > dx)
                {//如果斜率大于1,交换dx,dy就可以和斜率小于1类似
                    temp = dx;
                    dx = dy;
                    dy = temp;//始终保持斜率小于1
                    isChange = true;//标记以斜率对换,即斜率>1标志            }//以上是增加的画其他象限的判断            //<---            e = -dx; x = x0; y = y0;
                for (i = 0; i <= dx; i++)
                {
                    setMyPixel(bmp, x, y, c);
                    if (true == isChange)//
                        y = y + Step_Y;//如果斜率>1, 每次先递增(或递减)y,而后判断x的变化,注意 dx dy 已经对换了
                    else
                        x = x + Step_X;//如果斜率<=1,每次先递增(或递减)x,而后判断y的变化
                    e = e + 2 * dy;
                    if (e >= 0)
                    {
                        if (true == isChange)
                            x = x + Step_X;//x的值比上一点有变化
                        else
                            y = y + Step_Y;//y的值比上一点有变化
                        e = e - 2 * dx;
                    }
                }
            }
        }
    }