1、DDA(Digital Differential Analyzer)演算法
DDA演算法是計算機圖形學中最簡單的繪制直線演算法,
已知直線段兩個端點P0(x0,y0),P1(x1,y1),
則可求得直線的斜率:
k = (y2 - y1) / (x2 - x1)
在k,b均求出的條件下,只要知道一個x值,我們就能計算出一個y值,
y = kx + b
如果橫坐標x每次增加1(我們稱其為步進為1,即x = x +1),那么y的步進就為k+b,
x = x + 1
y = y + (k + b)
同樣知道一個y值也能計算出x值,此時y的步進為1,x的步進為(1-b)/k,
y = y + 1
x = x +(1 - b) / k
根據計算出的x值和y值,向下取整,得到坐標(x’,y’),并在(x’,y’)處繪制直線段上的一點,
為進一步簡化計算,通常可令b取0,將起點看作(0,0),
設當前點的坐標為(xi ,yi),下一個像素點的坐標為(xi+1,yi+1)
則用DDA演算法求解(xi+1,yi+1)的計算公式可以概括為:
xi+1 = xi + xStep (1)
yi+1 = yi + yStep (2)
我們一般通過計算 Δx 和 Δy 來確定xStep和yStep:
如果 Δx > Δy ,說明x軸的最大差值大于y軸的最大差值,x軸方向為步進的主方向,
xStep = 1,yStep = k;
如果 Δy> Δx,說明y軸的最大差值大于x軸的最大差值,y軸方向為步進的主方向,
yStep = 1,xStep = 1 / k,
根據這個公式,就能通過(xi,yi)迭代計算出(xi+1、yi+1),然后在坐標系中繪制計算出的(x,y)坐標點,
實作工具:
1) VS2019(C++)
新建專案:

2) 下載插件:Easyx ,使用方法和下載見官網: https://www.easyx.cn/
點擊下載后安裝
在VC2019處點擊安裝

源代碼如下:
#include <iostream>
#include <graphics.h>
#include <math.h>
#include <conio.h>
using namespace std;
void DDALine(int x1, int y1, int x2, int y2)
{
int x0 = 400;
int y0 = 300; //記錄原點坐標
int steps; //記錄步長
int dx, dy; //記錄起點和終點的坐標差值
float x, y; //記錄即時坐標
float delta_x, delta_y; //記錄劃執行緒序中的坐標增量
dx = x2 - x1;
dy = y2 - y1;
if (abs(dx) > abs(dy)) //比較橫縱坐標增量的大小
steps = dx;
else
steps = dy; //確保每次的增量不超過一個單位長度
x = x1;
y = y1; //記錄畫線起點
delta_x = float(dx*1.0) / abs(steps);
delta_y = float(dy*1.0) / abs(steps); //計算相鄰兩個點的增量
putpixel(x, y, RED);
for (int i = 0; i <abs (steps); i++)
{
x = x + delta_x;
y = y + delta_y;
putpixel(x + int (x0 + 0.5), y0 - int(y + 0.5), RED);
Sleep(50);
}
}
int main()
{
int x1, x2, y1, y2;
int x0 = 400, y0 = 300; //坐標軸中心(x0,y0)
cout << "請輸入兩個整數點的坐標(x1,y1),(x2,y2)" << endl;
cin >> x1 >> y1 >> x2 >> y2;
initgraph(x0 * 2, y0 * 2); //初始化圖形視窗大小
line(0, y0, x0 * 2, y0); //坐標軸X
line(x0, 0, x0, y0 * 2); //坐標軸Y
DDALine(x1, y1, x2, y2); //DDA畫線演算法
_getch(); //等待一個任意輸入結束
closegraph(); //關閉圖形視窗
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271332.html
標籤:其他
下一篇:華為數字化IT應用工程師面試經歷
