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; } } } } }
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;
}
}
}
}
}