//******************************************************************
//函数名: _draw_circle_8
//功能: 8对称性画圆算法(内部调用)
//输入参数:(xc,yc) :圆中心坐标
// (x,y):光标相对于圆心的坐标
// c:填充的颜色
//返回值: 无
//修改记录:无
//******************************************************************
static void _draw_circle_8(int xc, int yc, int x, int y, u16 c)
{
LCD_DrawPoint(xc + x, yc + y, c);
LCD_DrawPoint(xc - x, yc + y, c);
LCD_DrawPoint(xc + x, yc - y, c);
LCD_DrawPoint(xc - x, yc - y, c);
LCD_DrawPoint(xc + y, yc + x, c);
LCD_DrawPoint(xc - y, yc + x, c);
LCD_DrawPoint(xc + y, yc - x, c);
LCD_DrawPoint(xc - y, yc - x, c);
}
//******************************************************************
//函数名: gui_circle
//功能: 在指定位置画一个指定大小的圆(填充)
//输入参数:(xc,yc) :圆中心坐标
// c:填充的颜色
// r:圆半径
// fill:填充判断标志,1-填充,0-不填充
//返回值: 无
//修改记录:无
//******************************************************************
void LCD_DrawCircle(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++)
_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) {
_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++;
}
}
}
void LCD_DrawCircleSlow(int xc, int yc,u16 color,int r, int fill)
{
#if 0//0
// int x = 0, y = r, yi, d;
// d = 3 - 2 * r;
// while (x <= y) {
// _draw_circle_8(xc, yc, x, y, color);
// if (d < 0) {
// d = d + 4 * x + 6;
// } else {
// d = d + 4 * (x - y) + 10;
// y--;
// }
// x++;
// delay_ms(50);
// }
int x=0,y=r;
while (x <= y) {
if(x*x+y*y<r*r)x++;//圆内
else y--;//圆外
LCD_DrawPoint(xc+x,yc+y,color);
LCD_DrawPoint(xc-x,yc+y,color);
LCD_DrawPoint(xc-y,yc+x,color);
LCD_DrawPoint(xc-y,yc-x,color);
LCD_DrawPoint(xc+y,yc+x,color);
LCD_DrawPoint(xc+y,yc-x,color);
LCD_DrawPoint(xc+x,yc-y,color);
LCD_DrawPoint(xc-x,yc-y,color);
delay_ms(50);
}
#else
// #define lcd_draw_point LCD_DrawPoint
// uint16_t i,y;
// if((xc < r) || (yc < r)) //保证能画出完整的圆
// return;
//
// for(i = xc-r; i <= xc; i++){
// y = sqrt(pow(r,2)-pow((xc-i),2)); //求出在垂直坐标上的偏移
// //画左上半圆
// lcd_draw_point(i,yc-y,color);
// //画左下半圆
// lcd_draw_point(i,yc+y,color);
// //画右上半圆
// lcd_draw_point(xc*2-i,yc-y,color);
// //画右下半圆
// lcd_draw_point(xc*2-i,yc+y,color);
//
// delay_ms(50);
// }
int systick = get_tick();
int x=0,y=0;
for(int i=-90;i<270;i+=2)// for(float i=0;i<360;i+=2)//顺时针
// for(int i=270;i>-90;i-=2)//逆时针
{
#define PI 3.1415926
x=(int)(r*cos(PI*i/180));//+0.5;//2pi~360
y=(int)(r*sin(PI*i/180));//+0.5;
LCD_DrawPoint(40+x, 40+y,color);//20ms
//LCD_DrawCircle(xc+x, yc+y,color,3-2,1);//1~59ms;2~122ms
// LCD_ShowString(0,120, int2str(x*1000 ,4) ,WHITE,BLACK,16,0);
// delay_ms(10);
}
#endif
int take_time = get_tick()-systick;
LCD_ShowString(0,120, int2str(take_time ,4) ,WHITE,BLACK,16,0);delay_ms(1000);//59//122Ms
}
typedef struct
{
int16_t hCos;
int16_t hSin;
} Trig_Components;uint16_t const SINE_tabel[180/2]={0,
572,1144,1715,2286,2856,3425,3993,4560,
5126,5690,6252,6813,7371,7927,8481,9032,
9580,10126,10668,11207,11743,12275,12803,13328,
13848,14365,14876,15384,15886,16384,16877,17364,
17847,18324,18795,19261,19720,20174,20622,21063,
21498,21926,22348,22763,23170,23571,23965,24351,
24730,25102,25466,25822,26170,26510,26842,27166,
27482,27789,28088,28378,28660,28932,29197,29452,
29698,29935,30163,30382,30592,30792,30983,31164,
31336,31499,31651,31795,31928,32052,32166,32270,
32365,32449,32524,32588,32643,32688,32723,32748,
32763,
// 32768,32763,32748,32723,32688,32643,32588,
//32524,32449,32365,32270,32166,32052,31928,31795,
//31651,31499,31336,31164,30983,30792,30592,30382,
//30163,29935,29698,29452,29197,28932,28660,28378,
//28088,27789,27482,27166,26842,26510,26170,25822,
//25466,25102,24730,24351,23965,23170,22763,22348,
//21926,21498,21063,20174,19720,19261,18795,18324,
//17847,17364,16384,15886,15384,14876,14365,13848 ,
//13328 ,12803 ,12275 ,11743 ,11207 ,10668 ,10126 ,9580 ,
//9032 ,8481 ,7927 ,7371 ,6813 ,6252 ,5690 ,5126 ,
//4560 ,3993 ,3425 ,2856 ,2286 ,1715 ,1144 ,572 ,0 ,
};
extern Trig_Components MCM_Trig_Functions( int16_t hAngle );
void LCD_DrawCircleTable(int xc, int yc,u16 color,int r, int fill)
{
Trig_Components sincos;
int x=0,y=0;
int systick = get_tick();
// #define PI 3.1415926
#define PI 3.1415926535898
for(int i=0;i<360;i+=1)//+1 6ms;+2 3ms;
// for(int i=-90;i<270;i+=2)// //顺时针
// for(int i=270;i>-90;i-=2)//逆时针
{
//sincos=MCM_Trig_Functions(PI*i/180);
if(i<90)//
{
x=r*SINE_tabel[(90-i)%90]/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
y=r*SINE_tabel[(i)%90]/32768;(int)(r*sin(PI*i/180));//+0.5;
}
else if(i<180)
{
x=r*( -SINE_tabel[(i-90)%90])/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
y=r*SINE_tabel[(180-i)%90]/32768;(int)(r*sin(PI*i/180));//+0.5;
}
else if(i<270)
{
x=r*( -SINE_tabel[(270-i)%90])/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
y=r*( -SINE_tabel[(i-180)%90])/32768;(int)(r*sin(PI*i/180));//+0.5;
}
else
{
x=r*SINE_tabel[(i-270)%90]/32768;//r*sincos.hCos;//(int)(r*cos(PI*i/180));//+0.5;//2pi~360
y=r*( -SINE_tabel[(360-i)%90])/32768;(int)(r*sin(PI*i/180));//+0.5;
}
//LCD_DrawPoint(40+x, 40+y,color);//6ms
LCD_DrawCircle(xc+x, yc+y,color,3-2,1);//1~42ms;2~105ms
//LCD_ShowString(0,120, int2str(x*1000 ,4) ,WHITE,BLACK,16,0);
//delay_ms(10);
}
int take_time = get_tick()-systick;
LCD_ShowString(0,120, int2str(take_time ,4) ,WHITE,BLACK,16,0);delay_ms(1000);//42//105MS
}