基於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))
程式碼實現:
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寸屏上實現的
相關推薦
基於Bresenham和DDA演算法畫線段
直線: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迴歸 基於Python和Numpy函式庫
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【機器學習演算法實現】kNN演算法 手寫識別——基於Python和NumPy函式庫
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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. 基於內容的推薦 基於內容的資訊推薦方法的理論依據主要來自於資訊檢索和
神級程式設計師帶來的:基於Python和Tensorflow的電影推薦演算法!
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
排序演算法:圖解快速排序演算法--附帶基於Python和JavaScript的實現
快速排序有三大要素 分別是 第一:找基準值--key 第二:分割槽 第三:比較數字大小 先來看下快速排序流程: 基準值key選取了第一個元素78 基準值是可以任意一個元素 因為選擇了最左邊的資料,那麼就從右邊開始遍歷 經過上一輪變化key變成了
[資料探勘]離群點檢測---基於kNN的離群點檢測、LOF演算法和CLOF演算法
參考文獻 [1]. 陶晶. 基於聚類和密度的離群點檢測方法[D]. 華南理工大學, 2014. [2].王雪英. 離群點預處理及檢測演算法研究[D]. 西南交通大學, 2009. [3].胡婷婷. 資料探勘中的離群點檢測演算法研究[D]. 廈門大
演算法-基於ID3和C4.5的決策樹演算法
目錄 摘要 構建過程 ID3演算法 注意點: C4.5 參考文獻: 摘要 決策樹演算法是相對比較清晰簡單的有監督分類演算法,所謂有監督就是需要給出標準的已知分類的樣本資料集,根據資料集訓練或者說構建出一個模型,然後根據模型對新的資料進行預測分類。
基於佇列和雜湊的種子填充演算法
繼 https://blog.csdn.net/u013749051/article/details/84553642 之後, 我又對種子填充演算法進行了改進,主要利用了雜湊的思想,以空間換時間,把這個演算法的速度再次優化了。 這次的優化效果非常好,填充大面積區域稍有卡頓。 下面是效果圖