OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6775|回复: 4

液晶屏怎么用画点方式画出椭圆

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-10-8
在线时间
3 小时
发表于 2013-10-11 23:23:05 | 显示全部楼层 |阅读模式
如题,已知画点函数,请教大神们画椭圆的原理及函数

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-10-12 08:56:44 | 显示全部楼层
这是我以前做的一个程序, 你参考下。

//brush -是否填充
//color - 边沿颜色
//bcolor- 填充颜色
void ellipsepoint(int x,int y,int x0,int y0, Color color , Color bcolor, bool brush) //
{  
MLine ln;
//LCD_DrawPoint
LCD_SetPixel( x+x0, y+y0, color);
LCD_SetPixel(-x+x0, y+y0, color);
LCD_SetPixel(-x+x0,-y+y0, color);
LCD_SetPixel( x+x0,-y+y0, color);

if(brush)
{
ln.start.x = x+x0-1 , ln.start.y = y+y0-1, ln.end.x = -x+x0+1, ln.end.y = y+y0-1, ln.color = bcolor, LCD_DrawLine(ln);
ln.start.x = x+x0-1 , ln.start.y =-y+y0+1, ln.end.x = -x+x0+1, ln.end.y =-y+y0+1, ln.color = bcolor, LCD_DrawLine(ln);
}
}

void LCD_DrawEllipse(pMEllipse e, bool brush) //椭圆画法 
{  
int a = e->a,  b = e->b;
Color color= e->pencolor;
int x = 0, y = b ;

float d1,d2;

d1=b*b+a*a*(-b+0.25);
while (b*b*(x+1)<a*a*(y-0.5))
{
ellipsepoint(x,y,e->p.x,e->p.y,color, e->brushcolor, brush);
if(d1<=0)
{
d1+=b*b*(2*x+3);
x++;
}
else
{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;
y--;
}
}
ellipsepoint(x,y,e->p.x,e->p.y,color, e->brushcolor, brush);
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>=0)
{
if(d2<=0)
{
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;
y--;
}
else
{
d2+=a*a*(-2*y+3);
y--;
}
ellipsepoint(x,y,e->p.x,e->p.y,color, e->brushcolor, brush);
}
}
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-10-12 08:58:26 | 显示全部楼层
补充: 
画线函数:

void LCD_DrawLine(pMLine L)
{
  u16 t; 
MPoint p;
int xerr=0,yerr=0,delta_x,delta_y,distance; 
int incx,incy,uRow,uCol; 

delta_x=L->end.x - L->start.x; //计算坐标增量 
delta_y=L->end.y - L->start.y; 

uRow=L->start.x; 
uCol=L->start.y; 

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) //选取基本增量坐标轴 - 斜率< 1
distance=delta_x;
else 
distance=delta_y; 

for(t=0;t<=distance+1;t++ ) //画线输出 
{  
p.x = uRow; p.y = uCol; 
LCD_DrawPoint(p, L->color); //画点 

xerr+=delta_x ; 
yerr+=delta_y ; 
if(xerr>distance) 
xerr-=distance; 
uRow+=incx; 
if(yerr>distance) 
yerr-=distance; 
uCol+=incy; 
}  

}

回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-10-12 09:01:09 | 显示全部楼层
补充2 : 颜色定义:
/* LCD color R5-G6-B5*/
typedef enum {
clWhite     =0xFFFF, //白色
clBlack     =0x0000, //黑色
clMaroon       =0x8000, //栗色
  
clMoneyGreen   =0xC6F8, //美钞那样的浅绿色
clAqua         =0x07FF, //浅绿色
clGreen       =0x0400, //深绿色
clLime         =0x07E0, //正绿色
clTeal         =0x0410, //茶绿色
clOlive       =0x8400, //橄榄色
clNavy         =0x0010,   //青色

clRed         =0xF800, //红色
clJacinth =0xFC08, //橘红色
clOrange =0xFC00, //橙红色
clLtPink =0xFC1F, //浅粉色
clFuchsia     =0xF81F, //紫红色
    clPink =0xD938, //粉红色
clPurple     =0x8010, //浅紫色
clDkCarnation =0x4010, //深紫色
clPeachblow =0xF810, //桃红色
clBrown =0x8200, //褐色
clYellow       =0xFFE0, //黄色
  clCream       =0xFFDE, //奶油色

clBlue         =0x001F, //蓝色
  clSkyBlue       =0xA65E, //天蓝色

clLtGray       =0xC618, //浅灰色
clMedGray     =0xA514,   //灰色
clGray       =0x8410,   //深灰色
clSilver     =0xC618, //银灰色
  
}Color;
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-12 10:02:10 | 显示全部楼层
我的是从ucGUI里面抄出来的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-11 14:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表