抛砖引玉,依照角度画圆的半径线,有更好的方法吗?

flyunlimit 2014-11-12 04:51:48
u16 sintr[]={
0,87,175 ,349 ,523 ,698 ,872 ,1045 ,1219 ,1392 ,1564 ,1736,
1908 ,2079 ,2250 ,2419 ,2588 ,2756 ,2924 ,3090 ,3256 ,3420,
3584 ,3746 ,3907 ,4067 ,4226 ,4384 ,4540 ,4695 ,4848 ,5000,
5150 ,5299 ,5446 ,5592 ,5736 ,5878 ,6018 ,6157 ,6293 ,6428,
6561 ,6691 ,6820 ,6947 ,7071 ,7193 ,7314 ,7431 ,7547 ,7660,
7771 ,7880 ,7986 ,8090 ,8192 ,8290 ,8387 ,8480 ,8572 ,8660,
8746 ,8829 ,8910 ,8988 ,9063 ,9135 ,9205 ,9272 ,9336 ,9397,
9455 ,9511 ,9563 ,9613 ,9659 ,9703 ,9744 ,9781 ,9816 ,9848,
9877 ,9903 ,9925 ,9945 ,9962 ,9976 ,9986 ,9994 ,9998 ,10000
}; //0~90的正弦值,扩大10000倍,共91个,


//-------------------------------------------------------------------------------
//画圆的半径线
//Draw_Circle_R
//x0,y0圆心坐标,radius 是半径,angle是角度0~360整数
//-------------------------------------------------------------------------------
void Draw_Circle_R(u16 x0,u16 y0,u8 radius,u16 angle)
{
u8 x1,y1;
if(angle<90)
{
x1=x0+sintr[angle]*radius/10000;
y1=y0-sintr[90-angle]*radius/10000;
}
else if(angle<180)
{
angle-=90;
x1=x0+sintr[90-angle]*radius/10000;
y1=y0+sintr[angle]*radius/10000;
}
else if(angle<270)
{
angle-=180;
x1=x0-sintr[angle]*radius/10000;
y1=y0+sintr[90-angle]*radius/10000;
}
else if(angle<360)
{
angle-=270;
x1=x0-sintr[90-angle]*radius/10000;
y1=y0-sintr[angle]*radius/10000;
}
LCD_DrawLine(x0,y0,x1,y1);//画任意2点间的直线
}
自己写的,读取角度传感器的角度,然后在一个圆环,从圆心出发画一段线表示角度位置。
常见的类似应用是画秒针。不过我这里精确到1度.
想偷懒,在百度上搜了半天,没找到什么简单的算法。
最后自己算好0~90的正弦值,函数自己写了
...全文
242 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2014-11-24
  • 打赏
  • 举报
回复
查表法,在嵌入式开发中很常见。而且,你的表也不大。
flyunlimit 2014-11-14
  • 打赏
  • 举报
回复
引用 2 楼 xuweiwei1860 的回复:
直接用matlab进行计算然后 牺牲内存换取速度 查表的方式
你的思想和楼上类似,而且更加语焉不详,你打算算好什么来保存? 而且半径如果是变化的呢? 你们提出的都还不如我的方法好。 就像画圆有Bresenham算法一样,我就不信换个角度半径线就没有便捷的算法吗? CSDN这种程序员扎堆的地方拿不出个像样的方法来?
flyunlimit 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
直接保存0-90的各个点坐标值(圆心为0点),然后根据角度直接查表得到
但是半径就是定死的了。而且要保存的数因为是xy坐标,翻了一番。
用户 昵称 2014-11-14
  • 打赏
  • 举报
回复
这查表法本来就是很常见的做法,你这么做很正确,还改什么 画圆,画直线,自己实现一般都找插值算法。
fly 100% 2014-11-12
  • 打赏
  • 举报
回复
直接用matlab进行计算然后 牺牲内存换取速度 查表的方式
worldy 2014-11-12
  • 打赏
  • 举报
回复
直接保存0-90的各个点坐标值(圆心为0点),然后根据角度直接查表得到

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧