专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
两点之间画线不连续问题请教
2019-07-21 02:06
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
9285
3
1227
大家好。我在画线是把点存到数组里面,然后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楼】北极圈的黄昏:
---------------------------------
我是画直线的啊。。。。
加载中...
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
不是我自己写的,参考网上的 来源我也记不得了。你可以参考下
//******************************************************************
//函数名: 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;
}
}
}
---------------------------------
我是画直线的啊。。。。
一周热门 更多>