1. 程式人生 > >基於Bresenham和DDA演算法畫線段

基於Bresenham和DDA演算法畫線段

直線:y=kx+b 為了將他在顯示屏上顯示出來,我們需要為相應的點賦值,那麼考慮到計算機的乘法執行效率,我們肯定不會選擇用Y=kx+b這個表示式求值,然後進行畫線段。

我們應當是將它轉化為加法運算。

下面提供兩種常見的演算法:

方法1:DDA演算法

DDA演算法的思想是

1.判斷直線是近x軸線段,還是近y軸線段

2.求出delt_x,delt_y ,以較大值為總步長,每次以此為標準,步進,然後求另一個值的增長值.

實現:

void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
{
    u16 t; 
	int xerr=0,yerr=0,delta_x,delta_y,distance; 
	int incx,incy,uRow,uCol; 

	delta_x=x2-x1; //計算座標增量 
	delta_y=y2-y1; 
	uRow=x1; 
	uCol=y1; 
	if(delta_x>0)incx=1; //設定單步方向 
	else if(delta_x==0)incx=0;//垂直線 
	else {incx=-1;delta_x=-delta_x;} 
	if(delta_y>0)incy=1; 
	else if(delta_y==0)incy=0;//水平線 
	else{incy=-1;delta_y=-delta_y;} 
	
	if( delta_x>delta_y)distance=delta_x; //選取基本增量座標軸 
	else distance=delta_y; 
	for(t=0;t<=distance+1;t++ )//畫線輸出 
	{  
		LCD_DrawPoint(uRow,uCol);//畫點 
		xerr+=delta_x ; 
		yerr+=delta_y ; 
		if(xerr>distance) 
		{ 
			xerr-=distance; 
			uRow+=incx; 
		} 
		if(yerr>distance) 
		{ 
			yerr-=distance; 
			uCol+=incy; 
		} 
	}  
} 

方法二:Bresenham演算法實現

演算法思想:

dBresenham演算法只要求做加法和乘二運算

1.      核心要解決的是下個點選用y+1,還是y

2.      基本要求不能有乘法運算

3.      表示式為   y=mx+b;起始點為(x,y)

4.      y(k+1)=m(x+1)+b;  d1=y(k+1)-y=m(x+1)+b-y  ;d2=y+1- y(k+1)=y+1-m(x+1)-b;
所以判斷下個點y的座標就演變成求d1,d2的差值

d1-d2>0 --------------à(x+1,y+1)

d1-d2<0-------------à(x+1,y)

d1-d2= 2m(x+1)-2y+2b-1

delt(x)=x2-x1>0

 還是含有乘法運算,所以繼續化簡

 p=delt(x)*(d1-d2)=2delt(y)*(x+1)-2delt(x)*y-(2b-1)*delt(x)=2*delt(y)*x-2delt(x)*y+c【c=2*delt(y)+delt(x)(2b-1)】

p(X(i+1))-p(X(i))=2delt(y)-2delt(x)(Y(i+1)-Y(i))  

p(i)>0 Y(i+1)-Y(i)=1; else =0;

最後得到p1=2delt(y)-delt(x);

p(X(i+1))= p(X(i))+2delt(y)-2delt(x)(Y(i+1)-Y(i))

這樣就求出了p的值

程式碼實現:

void LCD_DrawLine(u16 x1, u16 y1,u16 x2,u16 y2)
{
int delta_x,delta_y,x,y,inc1,inc2;
u8 p;

delta_x=fabs(x1-x2);
delta_y=fabs(y1-y2);
p=2*delta_y-delta_x;
inc1=2*(delta_y-delta_x);
inc2=2*delta_y;
//判斷方向
if(x10)
{
p+=inc1;
y++;
}
else
p+=inc2;
LCD_DrawPoint(x,y);
}
}
說明:上述程式碼實現均是基於stm32處理器,tftLCD2.8寸屏上實現的

相關推薦

基於BresenhamDDA演算法線段

直線:y=kx+b 為了將他在顯示屏上顯示出來,我們需要為相應的點賦值,那麼考慮到計算機的乘法執行效率,我們肯定不會選擇用Y=kx+b這個表示式求值,然後進行畫線段。 我們應當是將它轉化為加法運算。 下面提供兩種常見的演算法: 方法1:DDA演算法 DDA演算法的思想是 1

OpenGL中點演算法DDA演算法直線

#include "stdafx.h" #include<windows.h> #include<GL/gl.h> #include<GL/glu.h> #include<GL/glaux.h> #include<std

【OpenGL】使用DDA演算法

DDA(數字微分分析儀...好高大上的樣子)演算法其實就是利用直線方程來生成直線的演算法,給定起點(x0,y0)和終點(xEnd,yEnd),這條直線就唯一確定了,它的斜率是k=(yEnd-y0)/(xEnd-x0)。對於x方向我們取增量為1,那麼下一個x值,即xi+1=x

直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法改進的Bresenham演算法掃描轉換直線段P1P2

直線生成演算法的實現:分別利用DDA演算法、中點Bresenham演算法和改進的Bresenham演算法掃描轉換直線段P1P2,其中P1為(0, 0), P2為(8, 6)。   // fhk.cpp : 定義控制檯應用程式的入口點。 // #include <iost

【機器學習演算法實現】logistic迴歸 基於PythonNumpy函式庫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【機器學習演算法實現】kNN演算法 手寫識別——基於PythonNumPy函式庫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

車間排程_基於DFS貪心的可隨機化求解演算法_C++實現

一、作業車間排程問題描述     作業車間排程問題(Job Shop Scheduling, JSP)是最經典的幾個NP-hard問題之一。其應用領域極其廣泛,涉及航母排程,機場飛機排程,港口碼頭貨船排程,汽車加工流水線等。     JS

Project-3:基於迴圈桶實現 djikstra 演算法

Project-3:基於堆和迴圈桶實現 djikstra 演算法 實驗原理 堆: 堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於(或不小於)其左子節點和右子節點的值。最大堆和最小堆是二叉堆的兩種形式。最大堆:根結點的鍵值是所有堆結點鍵值

Opencv影象處理---基於距離變換分水嶺演算法的影象分割

程式碼 #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main(int, char** argv) {

基於使用者的推薦演算法基於商品的推薦演算法

基於使用者的協同過濾    如圖1所示,在推薦系統中,用m×n的打分矩陣表示使用者對物品的喜好情況,一般用打分來表示使用者對商品的喜好程度,分數越高表示該使用者對這個商品越感興趣,而數值為空表示不瞭解或是沒有買過這個商品。 圖1 用於個性化推薦系統的打分矩陣    如圖2所示

線段樹:CDOJ1591-An easy problem A (RMQ演算法最簡單的線段樹模板)

An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Problem Description N個數排

基於C++OpenCv的SIFT_影象區域性特徵檢測演算法程式碼的實現

SIFT:尺度不變特徵變換匹配演算法詳解 本章將要講解的內容如下所示:    1)SIFT演算法的簡介    2)SIFT演算法的實現細節    3)SIFT演算法的應用領域    4)SIFT演算法的改進與擴充套件 一 SIFT演算法的簡介   1)傳統的特徵提取方法 成

推薦演算法概述:基於內容的推薦演算法、協同過濾推薦演算法基於知識的推薦演算法

所謂推薦演算法就是利用使用者的一些行為,通過一些數學演算法,推測出使用者可能喜歡的東西。推薦演算法主要分為兩種 1. 基於內容的推薦      基於內容的資訊推薦方法的理論依據主要來自於資訊檢索和

神級程式設計師帶來的:基於PythonTensorflow的電影推薦演算法

userIdmovieIdratingtimestamp9999967162682.5106557937010000067162694.0106514920110000167163654.0107094036310000267163852.510709796631000036

Bresenham演算法直線

void Bresenham_line(CDC *pDC, int x0, int y0, int x1, int y1, long color) { int dx = abs(x1

排序演算法:圖解快速排序演算法--附帶基於PythonJavaScript的實現

快速排序有三大要素 分別是   第一:找基準值--key   第二:分割槽  第三:比較數字大小 先來看下快速排序流程: 基準值key選取了第一個元素78 基準值是可以任意一個元素 因為選擇了最左邊的資料,那麼就從右邊開始遍歷 經過上一輪變化key變成了

[資料探勘]離群點檢測---基於kNN的離群點檢測、LOF演算法CLOF演算法

參考文獻 [1]. 陶晶. 基於聚類和密度的離群點檢測方法[D]. 華南理工大學, 2014. [2].王雪英. 離群點預處理及檢測演算法研究[D]. 西南交通大學, 2009. [3].胡婷婷. 資料探勘中的離群點檢測演算法研究[D]. 廈門大

演算法-基於ID3C4.5的決策樹演算法

目錄   摘要 構建過程 ID3演算法 注意點: C4.5 參考文獻: 摘要 決策樹演算法是相對比較清晰簡單的有監督分類演算法,所謂有監督就是需要給出標準的已知分類的樣本資料集,根據資料集訓練或者說構建出一個模型,然後根據模型對新的資料進行預測分類。

基於佇列雜湊的種子填充演算法

繼 https://blog.csdn.net/u013749051/article/details/84553642 之後, 我又對種子填充演算法進行了改進,主要利用了雜湊的思想,以空間換時間,把這個演算法的速度再次優化了。 這次的優化效果非常好,填充大面積區域稍有卡頓。 下面是效果圖