云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 单片机12864画线

单片机12864画线

  • 62 次阅读
  • 3 次下载
  • 2025/5/3 9:42:28

uchar x1,y1;

for(x=0;x<(4*3.1415);x+=0.1) //4*3.1415)=125.6<127 {

y=sin(x); x1=10*x;

y1=31-(10*y+0.5);

LCD_SET_Dot(x1,y1,1); } }

//y1=31-(10*y+0.5);这条语句是对y值进行四舍五入!

void main() {

Init_ST7920();

LCD_Clear_GDRAM();

v_Lcd12864DrawLine_f( 0, 0, 127, 63, 1 ) ; v_Lcd12864DrawLine_f( 0, 63, 127, 0 , 1 ) ; v_Lcd12864DrawLine_f( 12, 0, 127, 63, 1 ) ; v_Lcd12864DrawLine_f( 52, 63, 127, 0 , 1 ) ; v_Lcd12864DrawLine_f( 32, 63, 98, 0, 1 ) ; v_Lcd12864DrawLine_f( 67, 0, 127, 63 , 1 ) ; DelayMs(10000);

LCD_Clear_GDRAM();

LCD_SET_Line( 0,0,127,0,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,7,127,7,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,15,127,15,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,23,127,23,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,31,127,31,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,39,127,39,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,47,127,47,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,55,127,55,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,63,127,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 0,0,0,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 15,0,15,63,1 ) ;

DelayUs2x(5);

LCD_SET_Line( 31,0,31,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 47,0,47,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 63,0,63,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 79,0,79,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 95,0,95,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 111,0,111,63,1 ) ; DelayUs2x(5);

LCD_SET_Line( 127,0,127,63,1 ) ; DelayMs(10000);

LCD_Clear_GDRAM(); fsin(); while(1) { } }

以前看到Bresenham画线算法,直接拿来用,没有去推导它,近日,参考一些资料,特整理其算法推导过程如下。各位大虾如果知道其细节,赶紧闪过,不用浪费时间了。

基本上Bresenham画线算法的思路如下:

// 假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2). // 根据对称性,可推导至全象限内的线段. 1.画起点(x1,y1).

2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点. 2.1.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点为U(x1+1,y1+1) 2.2.否则,下个点为B(x1+1,y1) 3.画点(U或者B). 4.跳回第2步. 5.结束.

这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点. 设线段方程:ax+by+c=0(x1

从第一个点开始,我们有F(x,1,y1) = a*x1+b*y1+c=0 下面求线段ax+by+c=0与x=x1+1的交点:

由a*(x1+1)+b*y+c = 0, 求出交点坐标y=(-c-a(x1+1))/b

所以交点与M的y坐标差值Sub1 = (-c-a(x1+1))/b - (y1+0.5) = -a/b-0.5,即Sub1的处始值为-a/b-0.5。 则可得条件当 Sub1 = -a/b-0.5>0时候,即下个点为U. 反之,下个点为B.

代入a/b,则Sub1 = dy/dx-0.5.

因为是个循环中都要判断Sub,所以得求出循环下的Sub表达式,我们可以求出Sub的差值的表达式.下面求x=x1+2时的Sub,即Sub2 1.如果下下个点是下个点的右上邻接点,则

Sub2 = (-c-a(x1+2))/b - (y1+1.5) = -2a/b - 1.5

故Sub差值Dsub = Sub2 - Sub1 = -2a/b - 1.5 - (-a/b-0.5) = -a/b - 1.代入a/b得Dsub = dy/dx -1; 2.如果下下个点是下个点的右邻接点,

Sub2 = (-c-a(x1+2))/b - (y1+0.5) = -2a/b - 0.5

故Sub差值Dsub = Sub2 - Sub1 = -2a/b - 0.5 - (-a/b-0.5) = -a/b. 代入a/b得Dsub = dy/dx;

于是,我们有了Sub的处始值Sub1 = -a/b-0.5 = dy/dx-0.5,又有了Sub的差值的表达式Dsub = dy/dx -1 (当Sub1 > 0)或 dy/dx(当Sub1 < 0).细化工作完成。

于是pcode可以细化如下: // Pcode for Bresenham Line // By SoRoMan x=x1; y=y1; dx = x2-x1; dy = y2-y1;

Sub = dy/dx-0.5; // 赋初值,下个要画的点与中点的差值 DrawPixel(x, y); // 画起点 while(x

if(Sub > 0) // 下个要画的点为当前点的右上邻接点 {

Sub += dy/dx - 1; //下下个要画的点与中点的差值 y++; // 右上邻接点y需增1 }

else// 下个要画的点为当前点的右邻接点 {

Sub += dy/dx; }

// 画下个点 DrawPixel(x,y); }

PS:一般优化:

为避免小数转整数以及除法运算,由于Sub只是用来进行正负判断,所以可以令Sub = 2*dx*Sub = 2dy-dx,则 相应的DSub = 2dy - 2dx或2dy.

搜索更多关于: 单片机12864画线 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

uchar x1,y1; for(x=0;x<(4*3.1415);x+=0.1) //4*3.1415)=125.6<127 { y=sin(x); x1=10*x; y1=31-(10*y+0.5); LCD_SET_Dot(x1,y1,1); } } //y1=31-(10*y+0.5);这条语句是对y值进行四舍五入! void main() { Init_ST7920(); LCD_Clear_GDRAM(); v_Lcd12864DrawLine_f( 0, 0, 127, 63, 1 ) ; v_Lcd12864DrawLine_f( 0, 63, 127, 0 , 1 ) ; v_Lcd

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com