功能:由滑鼠單擊給定初末點位置作出相應直線,
1,打開VS2019 選擇新建專案 Windows 表單應用(.NET framework)

2,此處專案名稱命名為“Computer_Graphics”,專案建立后出現如下視圖
3,在左側工具箱選中“MenuStrip”將其拖入“Form1”表單中

鍵入想要設計的功能,這里設計了如圖所示三種畫直線的演算法

表單設計完成,開始寫代碼,現在代碼區插入如下代碼
Color BackColor1 = Color.White; //指定表單背景色
Color ForeColor1 = Color.Black; //指定線的顏色
public int MenuID = 0, PressNum = 0; //pressnum = 1時畫直線
public Point Firstpoint = new Point(0, 0); //定義第一個點
public Point Secondpoint = new Point(0, 0); //定義第二個點
public int Ways = 1; //記錄在表單中的操作

由于直線初末位置由滑鼠單擊表單給出,所以要先定義表單的滑鼠單擊回應函式,先單擊選中表單,在界面右下角找到屬性框,點擊“事件”(小閃電圖示)在下面給出的事件中找到“MouseClick”,雙擊進入代碼視窗
進入代碼區后,鍵入如下代碼
Graphics g = CreateGraphics();
Pen Mypen = new Pen(Color.Red, 1);
if (MenuID == 1)
{
if (PressNum == 0)
{
Firstpoint.X = e.X; Firstpoint.Y = e.Y;
Secondpoint.X = e.X; Secondpoint.Y = e.Y;
}
else
{
if (Ways == 1)
{
DDLline(Firstpoint.X, Firstpoint.Y, Secondpoint.X, Secondpoint.Y);//------呼叫DDA畫直線
}
if (Ways == 2)
{
Midpoint(Firstpoint.X, Firstpoint.Y, Secondpoint.X, Secondpoint.Y);//------呼叫中點畫線法
}
if (Ways == 3)
{
Bresenham(Firstpoint.X, Firstpoint.Y, Secondpoint.X, Secondpoint.Y);//-----呼叫bresenham演算法
}
}
PressNum++;
if (PressNum >= 2)
PressNum = 0;
}

此時還需要一個滑鼠移動函式記錄滑鼠在表單中的移動位置,同樣選中表單,在界面右下角找到屬性框,點擊“事件”(小閃電圖示)在下面給出的事件中找到“MouseMove”,雙擊進入代碼視窗

進入代碼區后鍵入如下代碼
Graphics g = CreateGraphics();
Pen Backpen = new Pen(BackColor1, 1);
Pen Mypen = new Pen(ForeColor1, 1);
if (MenuID == 1 && PressNum == 1)
{
if (!(e.X == Secondpoint.X && e.Y == Secondpoint.Y))
{
g.DrawLine(Backpen, Firstpoint.X, Firstpoint.Y, Secondpoint.X, Secondpoint.Y);//底層白線,可不要
g.DrawLine(Mypen, Firstpoint.X, Firstpoint.Y, e.X, e.Y);//中間線黑線,可不要
Secondpoint.X = e.X;
Secondpoint.Y = e.Y;
}
}

接下來完善功能代碼,回到“Form1” 視窗,找到之前設計的“DDA畫線法”,雙擊進入代碼區域,鍵入如下代碼
Ways = 1;
MenuID = 1;插入代碼片

同樣的方式創立“中點畫線法”,“Bresenham畫線法”單擊回應函式

劃重點:三種直線演算法函式的設計
1.DDA畫線法
代碼區鍵入如下代碼
private void DDLline(int x0, int y0, int x1, int y1)//------------DDA畫直線
{
Graphics g = CreateGraphics();
Pen b = new Pen(Color.Red, 1);
if (x0 == x1 && y0 == y1)
return;
double x = x0, y = y0;
double dx, dy, k;
dx = x1 - x0;
dy = y1 - y0;
k = dy / dx;
if (k <= 1 && k > 0)
{
if (x1 < x0)
{
x = x0;
x0 = x1;
x1 = (int)x;
y = y1;
}
for (x = x0; x <= x1; x++)
{
g.DrawRectangle(b, (int)x, (int)(y + 0.5), 1, 1);
y = y + k;
}
}
if (k > 0 && k > 1)
{
if (y1 < y0)
{
y = y0;
y0 = y1;
y1 = (int)y;
x = x1;
}
for (y = y0; y <= y1; y++)
{
g.DrawRectangle(b, (int)(x + 0.5), (int)y, 1, 1);
x = x + (1 / k);
}
}
if (k == 0)
{
if (x1 < x0)
{
x = x0;
x0 = x1;
x1 = (int)x;
y = y1;
}
for (x = x0; x < x1; x++)
{
g.DrawRectangle(b, (int)x, (int)y, 1, 1);
}
}
if (k < 0 && k <= -1)
{
if (y1 < y0)
{
y = y0;
y0 = y1;
y1 = (int)y;
x = x1;
}
for (y = y0; y <= y1; y++)
{
g.DrawRectangle(b, (int)(x + 0.5), (int)y, 1, 1);
x = x + (1 / k);
}
}
if (k < 0 && k > -1)
{
if (x1 < x0)
{
x = x0;
x0 = x1;
x1 = (int)x;
y = y1;
}
for (x = x0; x <= x1; x++)
{
g.DrawRectangle(b, (int)x, (int)(y + 0.5), 1, 1);
y = y + k;
}
}
if (x1 == x0)
{
if (y1 < y0)
{
y = y0;
y0 = y1;
y1 = (int)y;
x = x1;
}
for (y = y0; y <= y1; y++)
{
g.DrawRectangle(b, (int)x, (int)y, 1, 1);
}
}
}
放個圖

2,中點畫線法
代碼區鍵入如下代碼
private void Midpoint(int x0, int y0, int x1, int y1)//------------中點畫線法
{
Graphics g = CreateGraphics();
Pen p = new Pen(Color.Green, 1);
if (x0 == x1 && y0 == y1)
return;
double a = y0 - y1;
double b = x1 - x0;
double c = x0 * y1 - x1 * y0;
double x, y, k, d;
k = -a / b;
//--------------------------------------
if (k > 0 && k < 1)
{
if (x1 > x0)
{
y = y0;
for (x = x0; x < x1;)
{
d = a * (x + 1) + b * (y + 0.5) + c;
if (d < 0)
{ x++; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ x++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
if (x1 < x0)
{
y = y1;
for (x = x1; x < x0;)
{
d = a * (x + 1) + b * (y + 0.5) + c;
if (d > 0)
{ x++; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ x++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
}
//-------------------------
if (k >= 1)
{
if (y1 > y0)
{
x = x0;
for (y = y0; y < y1;)
{
d = a * (x + 1) + b * (y + 0.5) + c;
if (d > 0)
{ x++; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
if (y1 < y0)
{
x = x1;
for (y = y1; y < y0;)
{
d = a * (x + 1) + b * (y + 0.5) + c;
if (d < 0)
{ x++; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
}
//------------------------------------
if (k <= 0 && k > -1)
{
if (x1 > x0)
{
y = y1;
for (x = x1; x > x0;)
{
d = a * (x - 1) + b * (y + 0.5) + c;
if (d < 0)
{ x--; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ x--; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
if (x0 > x1)
{
y = y0;
for (x = x0; x > x1;)
{
d = a * (x - 1) + b * (y + 0.5) + c;
if (d > 0)
{ x--; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ x--; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
}
//---------------------------------------
if (k <= -1)
{
if (y1 > y0)
{
x = x0;
for (y = y0; y < y1;)
{
d = a * (x + 1) + b * (y + 0.5) + c;
if (d < 0)
{ x--; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
if (y1 < y0)
{
x = x1;
for (y = y1; y < y0;)
{
d = a * (x + 1) + b * (y + 0.5) + c;
if (d > 0)
{ x--; y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
else
{ y++; g.DrawRectangle(p, (int)x, (int)y, 1, 1); }
}
}
}
//---------------------------------------
if (x1 == x0)
{
x = x0;
if (y1 < y0)
{
y = y0;
y0 = y1;
y1 = (int)y;
x = x1;
}
for (y = y0; y <= y1; y++)
{
g.DrawRectangle(p, (int)x, (int)y, 1, 1);
}
}
}
3,Bresenham畫線法
代碼區鍵入如下代碼
private void Bresenham(int x0, int y0, int x1, int y1)//--------------------------Bresenham演算法
{
Graphics g = CreateGraphics();
Pen p = new Pen(Color.Blue, 1);
if (x0 == x1 && y0 == y1)
return;
double dx = x1 - x0;
double dy = y1 - y0;
double k = dy / dx;
double e = -0.5;
int x = x0;
int y = y0;
int i;
if (k > 0 && k <= 1)
{
if (x1 < x0)
{
x = x1;
y = y1;
dx = x0 - x1;
dy = y0 - y1;
}
for (i = 0; i <= dx; i++)
{
g.DrawRectangle(p, x, y, 1, 1);
x = x + 1;
e = e + k;
if (e >= 0)
{
y++;
e = e - 1;
}
}
}
//-----------------------------------------
if (k > 1)
{
if (y1 < y0)
{
x = x1;
y = y1;
dx = x0 - x1;
dy = y0 - y1;
}
for (i = 0; i <= dy; i++)
{
g.DrawRectangle(p, x, y, 1, 1);
y = y + 1;
e = e + 1 / k;
if (e >= 0)
{
x++;
e = e - 1;
}
}
}
//--------------------------------------------
if (k <= -1)
{
if (y1 < y0)
{
x = x1;
y = y1;
dx = x0 - x1;
dy = y0 - y1;
}
for (i = 0; i <= dy; i++)
{
g.DrawRectangle(p, x, y, 1, 1);
y = y + 1;
e = e - 1 / k;
if (e >= 0)
{
x--;
e = e - 1;
}
}
}
//--------------------------------------
if (k < 0 && k > -1)
{
if (x1 < x0)
{
x = x1;
y = y1;
dx = x0 - x1;
dy = y0 - y1;
}
for (i = 0; i <= dx; i++)
{
g.DrawRectangle(p, x, y, 1, 1);
x = x + 1;
e = e - k;
if (e >= 0)
{
y--;
e = e - 1;
}
}
}
//---------------------------------------
if (x1 == x0)
{
if (y1 < y0)
{
y = y0;
y0 = y1;
y1 = y;
x = x1;
}
for (y = y0; y <= y1; y++)
{
g.DrawRectangle(p, x, y, 1, 1);
}
}
//--------------------------
if (k == 0)
{
if (x1 < x0)
{
x = x0;
x0 = x1;
x1 = x;
y = y1;
}
for (x = x0; x < x1; x++)
{
g.DrawRectangle(p, x, y, 1, 1);
}
}
}
畫直線功能大功告成
運行結果

設計一個清除畫線功能,點擊清除進入代碼區
鍵入如下代碼
Graphics g = CreateGraphics();
g.Clear(Color.White);
MenuID = 0;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276184.html
標籤:其他
上一篇:計算機網路奇奇怪怪的知識點整理
下一篇:深度剖析資料在記憶體中的存盤方式
