frame buffer编程--画点功能和新增字符串代替RGBT
(一):寫在前面
這一次進(jìn)行了一個(gè)比較大的迭代,在這里我先把相對(duì)于上一個(gè)版本的改進(jìn)做一個(gè)解釋:
- 1:進(jìn)一步完善畫點(diǎn),增加了使用字符串代替RGBT值
- 2:實(shí)現(xiàn)字符串解析出RGBT值
- 3:增加了畫圓的算法
- 4:進(jìn)一步增強(qiáng)了代碼注釋
這四個(gè)點(diǎn)是這一節(jié)實(shí)現(xiàn)的主要內(nèi)容.這樣的修改為下面進(jìn)一步的實(shí)現(xiàn)提供了方便.
(二):功能介紹
首先我做的是把顏色相關(guān)的代碼單獨(dú)分離開來,新增加一個(gè)color.h文件,專用于顏色相關(guān)的操作和屬性表示.下面就是對(duì)畫點(diǎn),畫線,和畫圓的進(jìn)一步增強(qiáng).
1:畫點(diǎn)的進(jìn)一步增強(qiáng)
在畫點(diǎn)的時(shí)候,之前都是使用結(jié)構(gòu)體POINT來代替點(diǎn)的位置,但是,平時(shí)我們?cè)谑褂玫臅r(shí)候,比較方便的就是直接指定點(diǎn)的x,y值,所以,我首先增加了指定點(diǎn)的x,y值來畫點(diǎn).
/** 該函數(shù)用于指定點(diǎn)的橫坐標(biāo),縱坐標(biāo)的值來畫點(diǎn)* @param pFbdev 參考結(jié)構(gòu)體 fbdev* @param x 點(diǎn)的坐標(biāo)對(duì)應(yīng)的橫坐標(biāo)的值* @param y 點(diǎn)的坐標(biāo)對(duì)應(yīng)的縱坐標(biāo)的值* @param r 顏色對(duì)應(yīng)的R值 * @param g 顏色對(duì)應(yīng)的G值* @param b 顏色對(duì)應(yīng)的B值*/ void draw_x_y_dot(PFBDEV pFbdev,int x,int y,uint8_t r,uint8_t g,uint8_t b);另一方面,之前無論是在畫點(diǎn),畫線還是畫其他形狀的時(shí)候,我們都僅僅是指定他們顏色的RGB值,但是沒有對(duì)透明度的指定,所以,在這里,我又新增了一個(gè)指定透明度來畫點(diǎn)的實(shí)現(xiàn).
/** 該函數(shù)用于實(shí)現(xiàn)畫點(diǎn),不過在這個(gè)函數(shù)中需要設(shè)定透明度參數(shù)* @param pFbdev 參考結(jié)構(gòu)體 fbdev* @param p 點(diǎn)的坐標(biāo)* @param r 顏色對(duì)應(yīng)的R值* @param g 顏色對(duì)應(yīng)的G值* @param b 顏色對(duì)應(yīng)的B值* @param t 顏色對(duì)應(yīng)的透明度值* @return void*/ void draw_dot_with_trans(PFBDEV pFbdev,POINT p,uint8_t r,uint8_t g,uint8_t b,uint8_t t);還有就是把指定透明度和指定x,y值相結(jié)合實(shí)現(xiàn)一個(gè)畫點(diǎn)的函數(shù)實(shí)現(xiàn).
/** 該函數(shù)用于指定點(diǎn)的橫坐標(biāo),縱坐標(biāo)的值,并且必須指明透明度來畫點(diǎn)* @param pFbdev 參考結(jié)構(gòu)體 fbdev* @param x 點(diǎn)的坐標(biāo)對(duì)應(yīng)的橫坐標(biāo)的值* @param y 點(diǎn)的坐標(biāo)對(duì)應(yīng)的縱坐標(biāo)的值* @param r 顏色對(duì)應(yīng)的R值 * @param g 顏色對(duì)應(yīng)的G值* @param b 顏色對(duì)應(yīng)的B值* @param t 顏色對(duì)應(yīng)的透明度值*/ void draw_x_y_dot_with_trans(PFBDEV pFbdev,int x,int y,uint8_t r,uint8_t g,uint8_t b,uint8_t t);后面又增加了一些別的畫點(diǎn)的函數(shù),包括在RGBT結(jié)構(gòu)體中指定透明度啊等等函數(shù).這里不再贅余.
2:字符串代表顏色
在我們的程序中,我們可以知道,無論是顏色的RGBT值,都是使用uint8_t作為其類型的.也就是8為的正整形數(shù)字.我們可以使用兩個(gè)16進(jìn)制數(shù)來表示8位,例如0xff,轉(zhuǎn)換成二進(jìn)制數(shù)就是11111111.這樣就能代表顏色了.對(duì)于RGBT都是這樣表示,所以,我們使用”FFFFFFFF”來表示RGBT很合適.
下面這個(gè)代碼是我將字符串轉(zhuǎn)換成RGBT的算法,這個(gè)算法現(xiàn)在我感覺很不好,后期還需要修改.
RGBT getRGBT(const char *temp){RGBT rgbt; char *c_tmp;c_tmp = (char *)malloc(4 * sizeof(int));c_tmp[0] = '0';c_tmp[1] = 'x';int r,g,b,t;//RGBT值的計(jì)算c_tmp[2] = temp[0];c_tmp[3] = temp[1];r = strtol(c_tmp,NULL,16);c_tmp[2] = temp[2];c_tmp[3] = temp[3];g = strtol(c_tmp,NULL,16);c_tmp[2] = temp[4];c_tmp[3] = temp[5];b = strtol(c_tmp,NULL,16);c_tmp[2] = temp[6];c_tmp[3] = temp[7];t = strtol(c_tmp,NULL,16);rgbt.r = r;rgbt.g = g;rgbt.b = b;rgbt.t = t;return rgbt; }這樣,以后就可以方便的時(shí)候字符串來代替RGBT值了.
3:畫圓的實(shí)現(xiàn)
畫圓的實(shí)現(xiàn)比較簡(jiǎn)單,就是使用方程式:
這樣,我們已經(jīng)知道圓的中心點(diǎn)(a,b),還有圓的半徑R了.那么我們就可以使用上面的公式將圓畫出來.
//畫圓 void draw_circle(PFBDEV pFbdev,int x,int y,int radius,const char *color) {double i;int tmp;for(i = x - radius; i < x + radius;i+=0.01){tmp = sqrt(radius * radius - (i - x) * (i - x));draw_x_y_color_dot_with_string(pFbdev,i,(tmp + y),color);draw_x_y_color_dot_with_string(pFbdev,i,(-tmp + y),color);} }注意 i+= 0.01 這個(gè)地方,如果將0.01換成別的,會(huì)有不一樣的效果,大家如果有興趣可以嘗試一下.
(三):后期規(guī)劃
在后面的時(shí)候,我們將畫點(diǎn),畫線,畫各種圖形分開來,正確實(shí)現(xiàn)一個(gè)在命令行界面下的一個(gè)小型的圖形庫(kù).主要是為了好玩,有趣.
(四):寫在后面
生活的樂趣就是充滿了很多不定因素.
大家可以登陸我的github下載源碼:
github地址
轉(zhuǎn)載于:https://www.cnblogs.com/bobo1223/p/7287506.html
總結(jié)
以上是生活随笔為你收集整理的frame buffer编程--画点功能和新增字符串代替RGBT的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把nc v6的源码看懂
- 下一篇: RPC调用框架比较分析