两点之间画线不连续问题请教

2019-07-21 02:06发布

大家好。我在画线是把点存到数组里面,然后x坐标每次加1,依次把数组对应到x坐标上,然后把x和x+1两点之间话直线,之后x++,但是如果我的传感器不更新数据线条是连续的,数据更新的话偶尔会有断点产生,很不理解,就算我采集数据有误,点也应该连续的吧?会是因为画线速度跟不上吗?求指教~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
北极圈的黄昏
1楼-- · 2019-07-21 03:04
画各种图形的一些算法

不是我自己写的,参考网上的  来源我也记不得了。你可以参考下


//******************************************************************
//函数名:  GUI_DrawLine
//作者:    
//日期:    
//功能:    GUI画线
//输入参数:x1,y1:起点坐标
//         x2,y2:终点坐标 
//返回值:  无
//修改记录:无
//****************************************************************** 
void GUI_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)//画线 
{
u16 t; 
int xerr=0,yerr=0,delta_x,delta_y,distance; 
u16 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++ )//画线输出 
{  
GUI_DrawPoint(uRow,uCol,color);//画点 
xerr+=delta_x ; 
yerr+=delta_y ; 
if(xerr>distance) 

xerr-=distance; 
uRow+=incx; 

if(yerr>distance) 

yerr-=distance; 
uCol+=incy; 

}  
}

//******************************************************************
//函数名:  GUI_DrawRectangle
//作者:    
//日期:    
//功能:    GUI画矩形(非填充)
//输入参数:(x1,y1),(x2,y2):矩形的对角坐标
//返回值:  无
//修改记录:无
//******************************************************************  
void GUI_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
GUI_DrawLine(x1,y1,x2,y1,color);
GUI_DrawLine(x1,y1,x1,y2,color);
GUI_DrawLine(x1,y2,x2,y2,color);
GUI_DrawLine(x2,y1,x2,y2,color);
}
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)
{  
u16 i,j;
u16 width=ex-sx+1;  //得到填充的宽度
u16 height=ey-sy+1; //高度
LCD_SetPos(sx,sy,ex-1,ey-1);//设置显示窗口
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
GUI_DrawPoint(sx+j,sy+i,color); //写入数据   
}
LCD_SetPos(0,0,239,319);//恢复窗口设置为全屏
}
//******************************************************************
//函数名:  GUI_DrawFillRectangle
//作者:    
//日期:    
//功能:    GUI画矩形(填充)
//输入参数:(x1,y1),(x2,y2):矩形的对角坐标
//返回值:  无
//修改记录:无
//******************************************************************   
void GUI_DrawFillRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
LCD_Fill(x1,y1,x2,y2,color);


void GUI_DrawPoint(int x,int y,u16 color) //打一个有颜 {MOD}的点
{
LCD_SetPoints(x,y);
wr_dat(color);

//******************************************************************
//函数名:  GUI_draw_circle_8
//作者:    
//日期:       
//功能:    8对称性画圆算法(内部调用)
//输入参数:(xc,yc):圆中心坐标
//  (x,y):光标相对于圆心的坐标
//          c:填充的颜 {MOD}
//返回值:  无
//修改记录:无
//******************************************************************  
void GUI_draw_circle_8(int xc, int yc, int x, int y, u16 color)
{
GUI_DrawPoint(xc + x, yc + y, color);

GUI_DrawPoint(xc - x, yc + y, color);

GUI_DrawPoint(xc + x, yc - y, color);

GUI_DrawPoint(xc - x, yc - y, color);

GUI_DrawPoint(xc + y, yc + x, color);

GUI_DrawPoint(xc - y, yc + x, color);

GUI_DrawPoint(xc + y, yc - x, color);

GUI_DrawPoint(xc - y, yc - x, color);
}
//******************************************************************
//函数名:  GUI_circle
//作者:    
//日期:    
//功能:    在指定位置画一个指定大小的圆(填充)
//输入参数:(xc,yc):圆中心坐标
//          c:填充的颜 {MOD}
//   r:圆半径
//   fill:填充判断标志,1-填充,0-不填充
//返回值:  无
//修改记录:无
//******************************************************************  
void GUI_circle(int xc, int yc,u16 c,int r, int fill)
{
int x = 0, y = r, yi, d;

d = 3 - 2 * r;


if (fill) 
{
// 如果填充(画实心圆)
while (x ><= y) 
{
for (yi = x; yi <= y; yi++)
{
GUI_draw_circle_8(xc, yc, x, yi, c);
}

if (d < 0) 
{
d = d + 4 * x + 6;

else 
{
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}

else 
{
// 如果不填充(画空心圆)
while (x <= y)
    {
GUI_draw_circle_8(xc, yc, x, y, c);
if (d < 0) 
{
d = d + 4 * x + 6;

else 
{
d = d + 4 * (x - y) + 10;
y--;
}
x++;
}
}
}
//******************************************************************
//函数名:  GUI_PutChar
//作者:    
//日期:    
//功能:    在指定位置画一个指定大小的圆(填充)
//输入参数:(x,y):字符的坐标
//          c:字符
//  
//   fColor:字符填充的颜 {MOD}
// bColor:背景颜 {MOD}
//返回值:  无
//修改记录:无
//****************************************************************** 

void GUI_PutChar(unsigned short x, unsigned short y, char c, unsigned int fColor, unsigned int bColor)//显示单个字符 
{
LCD_PutChar8x16( x, y, c, fColor, bColor );
}
/******************************************************************
 - 功能描述:将一个字符串转为32位的变量,比如"1234"转为1234
 - 隶属模块:公开函数模块
 - 函数属性:外部,用户可调用
 - 参数说明:str:指向待转换的字符串           
 - 返回说明:转换后的数值
 ******************************************************************/
//
//void u32tostr(unsigned long dat,char *str) 
//{
// char idata temp[20];
// unsigned char idata i=0,j=0;
//
// i=0;
// while(dat)
// {
//  temp=dat%10+0x30;
//  i++;
//  dat/=10;
// }
// j=i;
// for(i=0;i<j;i++)
// {
//  str=temp[j-i-1];
// }
// if(!i) {str[i++]='0';}
// str=0;
//}
//******************************************************************
//函数名:  GUI_PutString
//作者:    
//日期:    
//功能:    在指定位置画一个指定大小的圆(填充)
//输入参数:(x,y):字符的坐标
//          *s:字符串
//  
//   fColor:字符串填充的颜 {MOD}
// bColor:背景颜 {MOD}
//返回值:  无
//修改记录:无
//******************************************************************
 void GUI_PutString(unsigned short x, unsigned short y, unsigned char *s, unsigned int fColor, unsigned int bColor)// 显示字符串
 {
 unsigned char l=0;
while(*s) 
{
if( *s >< 0x80) 
    {
GUI_PutChar(x+l*8,y,*s,fColor,bColor);
s++;l++;
}
else
    {
PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor);
s+=2;l+=2;
}
}
}
北极圈的黄昏
2楼-- · 2019-07-21 07:08
你直接打点(x++,y)这种形式画出来的点 极有可能 不是连续的  就算是你的 数据连续  画出来的线  也不一定 连续。你可以参考一些画直线 和画圆的算法
loveshipting
3楼-- · 2019-07-21 10:18
回复【2楼】北极圈的黄昏:
---------------------------------
我是画直线的啊。。。。

一周热门 更多>