搜索
bottom↓
回复: 55

大家有没有画实心圆的算法?

[复制链接]

出0入0汤圆

发表于 2013-8-24 15:18:41 | 显示全部楼层 |阅读模式
就是用LCD画一个实心圆~~不是空心的哦~~是实心,可以填充任意颜色的~~~

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-8-24 15:22:36 来自手机 | 显示全部楼层
当然有,计算机图形学 这本书讲得很详细,从点到线,再到各种几何图形

出0入0汤圆

发表于 2013-8-24 15:25:49 | 显示全部楼层
半径不同的 空心同心圆 嵌套。

出0入0汤圆

发表于 2013-8-24 15:27:30 | 显示全部楼层
void FillCircle(int x0,int y0,int r,int mode)
{
int x,y;
int deltax,deltay;
int d;
int xi;
x=0;
y=r;
deltax=3;
deltay=2-r-r;
d=1-r;

draw(x+x0,y+y0,mode);
draw(x+x0,-y+y0,mode);
for(xi=-r+x0;xi<=r+x0;xi++)
        draw(xi,y0,mode);//水平线填充
while(x<y)
{
   if(d<0)
   {
     d+=deltax;
     deltax+=2;
     x++;
   }
   else
   {
     d+=(deltax+deltay);
     deltax+=2;
     deltay+=2;
     x++;
     y--;
   }
   for(xi=-x+x0;xi<=x+x0;xi++)
   {
     draw(xi,-y+y0,mode);
     draw(xi,y+y0,mode);//扫描线填充
   }
   for(xi=-y+x0;xi<=y+x0;xi++)
   {
     draw(xi,-x+y0,mode);
     draw(xi,x+y0,mode);//扫描线填充其量
   }
  }
}

出0入0汤圆

 楼主| 发表于 2013-8-24 15:35:54 | 显示全部楼层
senjet 发表于 2013-8-24 15:27
void FillCircle(int x0,int y0,int r,int mode)
{
int x,y;

你这个draw函数的底层是干什么的?还有mode?

出0入0汤圆

发表于 2013-8-24 15:46:01 | 显示全部楼层
直接用勾股定理就可以了。

知道半径R,知道圆心坐标,那就可以算出四分之一圆的坐标,通过跟圆心坐标的加减换算,可以得出上半圆的坐标,然后分别与圆心换算,得出下半圆的坐标,并每个上下坐标画垂直线。

也可以左右画线,看LCD驱动哪个实现起来更高速

出0入0汤圆

发表于 2013-8-24 15:46:59 | 显示全部楼层
本帖最后由 senjet 于 2013-8-24 15:50 编辑
myqiang1990 发表于 2013-8-24 15:35
你这个draw函数的底层是干什么的?还有mode?


就是在x,y处画点啊,mode是颜色。这是快速画填充圆算法。相应的还有画线、画非填充圆、画椭圆,全部以画点为基础。
void line(uchar x0,uchar y0,uchar x1, uchar y1,uchar mode)
{         int e; //e 表示实际直线中的某一点与像素中点之间的距离  
           uchar i,x,y,dx,dy,tmp;
        signed char sx,sy;
        char exchange=0;

    x = x0;
    y = y0;
        if(x1>=x0)
                dx=x1-x0;
        else
                dx=x0-x1;
        if(y1>=y0)
                dy=y1-y0;
        else
                dy=y0-y1;

    //计算坐标的增量:1,0 or -1  
    sx = (x1 - x0) == 0  ? 0 : ( (x1 - x0) < 0  ? -1 : 1);
    sy = (y1 - y0) == 0  ? 0 : ( (y1 - y0) < 0  ? -1 : 1);
    //斜率的绝对值 >1 or <1
    if (dy > dx)
    {   tmp = dx;
        dx  = dy;
        dy  = tmp;
        exchange = 1;
    }

    //非整数算法中 e = dy / dx - 1/2  
    //现在扩大了(2 * dx)倍  
    e = 2 * dy - dx;  

    for (i=1;i<=dx+1;i++)
    {
        //自定义的绘制像素的函数
        draw(x,y,mode);

        while (e > 0)
        {
            if (exchange)
                x += sx;
            else
                y += sy;
         
            //非整数算法中 e -= 1  
            //现在扩大了(2 * dx)倍  
            e -= 2 * dx;
        }

        //当斜率绝对值大于1时,y坐标总是增加一个单位  
        if (exchange)
            y += sy;
        else
            x += sx;

        e += 2 * dy;
        }

}

void circle(uchar x,uchar y,uchar R,uchar mode)
{
//圆心(x1,y1),当前像素I(xi,yi),右像素H(xi+1,y),右下像素D(xi+1,yi-1),下像素V(xi,yi-1)
int xi,yi,dd,m,n;
//圆心距差值平方dh=(xi+1)*(xi+1)+yi*yi-R*R; dd=(xi+1)*(xi+1)+(yi-1)*(yi-1)-R*R; dv=xi*xi+(yi-1)*(yi-1)-R*R;
xi=0; //起点(0,R)
yi=R;
dd=2-2*R; //起点的右下像素(1,R-1)的圆心距差值dd=1+(R-1)*(R-1)-R*R
while(yi>=xi) //循环到八分之一圆;yi>=0即可以画出四分圆
{
   draw(xi+x,yi+y,mode);   //2区,坐标平移(x,y)画圆
   draw(yi+x,xi+y,mode);   //1区
   draw(-xi+x,yi+y,mode); //3区
   draw(-yi+x,xi+y,mode); //4区
   draw(-yi+x,-xi+y,mode); //5区
   draw(-xi+x,-yi+y,mode); //6区
   draw(xi+x,-yi+y,mode); //7区
   draw(yi+x,-xi+y,mode); //8区
   if(dd<0) //D在圆内;H在圆上或圆外;选择H或D,dh>=0,dd<0,m=|dh|-|dd|=2*(dd+yi)-1;
   {
    m=2*(dd+yi)-1;
    if(m<=0) //取右像素H(xi+1,yi);m=0时 取右点
    {
     dd=dd+2*xi+3; //求H的右下像素(xi+2,yi-1),dd=(xi+2)*(xi+2)+(yi-1)*(yi-1)-R*R
     xi=xi+1;
    }
    else //取右下像素D(xi+1,yi-1)
    {
     dd=dd+2*(xi-yi+3); //求D的右下像素(xi+2,yi-2),dd=(xi+2)*(xi+2)+(yi-2)*(yi-2)-R*R
     xi=xi+1;
     yi=yi-1;
    }
   }
   else if(dd>0) //D在圆外;V在圆外或圆上;选择D或V;dd>0,dv<=0,n=|dd|-|dv|=2*(dd-xi)-1;
   {
    n=2*(dd-xi)-1;
    if(n<=0) //取右下像素D(xi+1,yi-1);n=0时取
    {
     dd=dd+2*(xi-yi+3); //求D的右下像素(xi+2,yi-2),dd=(xi+2)*(xi+2)+(yi-2)*(yi-2)-R*R
     xi=xi+1;
     yi=yi-1;
    }
    else //取下像素V(xi,yi-1)
    {
     dd=dd-2*yi+3; //求V的右下像素(xi+1,yi-2)dd=(xi+1)*(xi+1)+(yi-2)*(yi-2)-R*R
     yi=yi-1;
   
    }
   }
   else if(dd==0) //D在圆上,取D(xi+1,yi-1)
   {
    dd=dd+2*(xi-yi+3); //求D的右下像素(xi+2,yi-2),dd=(xi+2)*(xi+2)+(yi-2)*(yi-2)-R*R
    xi=xi+1;
    yi=yi-1;
   }
}
}

void ellipse(int x0, int y0, int rx, int ry,int mode) {
  int OutConst, Sum, SumY;
  int x,y;
  int xOld;
  uint32_t _rx = rx;
  uint32_t _ry = ry;
  OutConst = _rx*_rx*_ry*_ry  /* Constant as explaint above */
            +(_rx*_rx*_ry>>1); /* To compensate for rounding */
  xOld = x = rx;
  for (y=0; y<=ry; y++) {
    if (y==ry) {
      x=0;
    } else {
      SumY =((int)(rx*rx))*((int)(y*y)); /* Does not change in loop */
      while (Sum = SumY + ((int)(ry*ry))*((int)(x*x)),
             (x>0) && (Sum>OutConst)) x--;
    }
    /* Since we draw lines, we can not draw on the first
        iteration
    */
    if (y) {
      line(x0-xOld,y0-y+1,x0-x,y0-y,mode);
      line(x0-xOld,y0+y-1,x0-x,y0+y,mode);
      line(x0+xOld,y0-y+1,x0+x,y0-y,mode);
      line(x0+xOld,y0+y-1,x0+x,y0+y,mode);
    }
    xOld = x;
  }
}

出0入0汤圆

 楼主| 发表于 2013-8-24 15:48:04 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-8-24 15:50 编辑
senjet 发表于 2013-8-24 15:46
就是在x,y处画点啊,mode是颜色


哦~~~谢谢~~今晚试试~~~你有没有亲身实践过可不可行啊~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-24 15:52:38 | 显示全部楼层
senjet 发表于 2013-8-24 15:27
void FillCircle(int x0,int y0,int r,int mode)
{
int x,y;

大致讲一下原理吧?

出0入0汤圆

 楼主| 发表于 2013-8-24 16:05:43 | 显示全部楼层
senjet 发表于 2013-8-24 15:46
就是在x,y处画点啊,mode是颜色。这是快速画填充圆算法。相应的还有画线、画非填充圆、画椭圆,全部以画 ...

果然可以画一个填充圆,,谢谢你咯~~~~

出0入0汤圆

发表于 2013-8-25 00:13:05 | 显示全部楼层
senjet 发表于 2013-8-24 15:46
就是在x,y处画点啊,mode是颜色。这是快速画填充圆算法。相应的还有画线、画非填充圆、画椭圆,全部以画 ...

可以不用这么麻烦。Bresenham算法画圆画8个点改成4条线就可以填充。。。

void LCD_DrawCircle(int xc,int yc,int r,int color)
{
    int x,y,d;
    y = r;
    d = 3 - (r + r);
    x = 0;

    while(x <= y)
    {
          LCD_DrawLine(xc+x,yc+y,xc-x,yc+y,color);
          LCD_DrawLine(xc+x,yc-y,xc-x,yc-y,color);
          LCD_DrawLine(xc+y,yc+x,xc-y,yc+x,color);
          LCD_DrawLine(xc+y,yc-x,xc-y,yc-x,color);                       
          if(d < 0)
         {
             d += 4*x + 6;
         }
         else
        {
            d+=4*(x - y)+ 10;
            y --;
        }
        x ++;
    }
}

出0入0汤圆

发表于 2013-8-25 00:32:06 | 显示全部楼层
czg1411 发表于 2013-8-25 00:13
可以不用这么麻烦。Bresenham算法画圆画8个点改成4条线就可以填充。。。

void LCD_DrawCircle(int xc,in ...

别忘了画线也是以画点为基楚的。

出0入0汤圆

发表于 2013-8-25 01:08:15 | 显示全部楼层
senjet 发表于 2013-8-25 00:32
别忘了画线也是以画点为基楚的。

把你自己的画圆和画椭圆的两个函数比较一下看看画线的好还是画点的好。
LCD上用画点的方法组成一条横线和直接画一条横线的效率差距不是一点点。

出0入0汤圆

发表于 2013-8-25 07:39:30 | 显示全部楼层
等起床
了去测试一下

出0入0汤圆

发表于 2013-8-25 14:29:37 | 显示全部楼层
czg1411 发表于 2013-8-25 01:08
把你自己的画圆和画椭圆的两个函数比较一下看看画线的好还是画点的好。
LCD上用画点的方法组成一条横线和 ...

画椭圆和画圆之所以用画线而不是画点是为了连续性,如果以画点来写,就不一定连续了,有可能是虚点圆。事实上画线的效率不像你说的一定比画点高,要看具体的LCD,比如LCD是单色的,每个字节有8像素,这种情况下画线效率是可以优化得比画点高,但如果是8bpp以上且没有窗口读写功能的LCD,画线就只能调用画点来完成了,这种情况下直接调用画点肯定比调用画线效率高。

出0入0汤圆

发表于 2013-8-25 15:53:59 | 显示全部楼层
senjet 发表于 2013-8-25 14:29
画椭圆和画圆之所以用画线而不是画点是为了连续性,如果以画点来写,就不一定连续了,有可能是虚点圆。事 ...

争这个没意思。用过才知道。。

出0入8汤圆

发表于 2013-8-25 16:05:02 | 显示全部楼层
myqiang1990 发表于 2013-8-24 15:48
哦~~~谢谢~~今晚试试~~~你有没有亲身实践过可不可行啊~~

楼主你的图片好香辣啊,哈哈

出0入85汤圆

发表于 2013-8-25 16:09:58 | 显示全部楼层
czg1411 发表于 2013-8-25 15:53
争这个没意思。用过才知道。。

实践是检验真理唯一标准

出0入0汤圆

发表于 2013-8-25 16:47:00 | 显示全部楼层
知道圆心,半径就可以了。在矩形中画圆。半径内的填充自己要的颜色,半径外的,读取颜色值再填充就好了

出0入0汤圆

发表于 2013-8-25 16:51:37 | 显示全部楼层
UcGUI里面找到原函数复制出来就好了。

出0入0汤圆

发表于 2013-8-25 16:58:08 | 显示全部楼层
czg1411 发表于 2013-8-25 15:53
争这个没意思。用过才知道。。

本来就没跟你争,只是告诉你而已没那么绝对而已,你信不信无所谓。本人亲自写过不下几十种显示设备的底层驱动,知道如何效率高。对上面贴出的而言,画线不会比画点高,因为这里画线本身就是以画点为基楚的,考虑到多调用一层函数,入栈出栈也需要额外的时间,即使考虑到画线的循环次数少一些,顶多两者效率差不多而已。

出0入0汤圆

发表于 2013-8-25 17:52:05 | 显示全部楼层
先收藏了      

出0入0汤圆

发表于 2013-8-25 21:09:22 来自手机 | 显示全部楼层
画实心圆算法,收藏了。

出0入0汤圆

发表于 2013-8-25 22:40:49 | 显示全部楼层
我觉得可以先画圆再填充

出870入263汤圆

发表于 2013-8-31 21:13:45 | 显示全部楼层
senjet 发表于 2013-8-25 00:32
别忘了画线也是以画点为基楚的。

你这说法不完全正确。如果你的系统有可直接访问的显存,那是无所谓画点和画线区别的;但是如果你使用的是像ILI9325,HX8347,NT35702等等这类外接LCD模块,它们不能直接访问显存,而是通过先设置Window的左上角和右下角坐标,再写入这个window内的像素值。这样,画线比画点的效率不是高一点点!
这就值得考虑在上层应用中用画线代替画点了。

出870入263汤圆

发表于 2013-8-31 21:28:02 | 显示全部楼层
本帖最后由 armstrong 于 2013-8-31 21:46 编辑
senjet 发表于 2013-8-25 14:29
画椭圆和画圆之所以用画线而不是画点是为了连续性,如果以画点来写,就不一定连续了,有可能是虚点圆。事 ...


说的具体点就是:
假设设置左上角坐标的耗时为Ta,设置右下角坐标的耗时为Tb,传输一个像素值的耗时为Tc,
那么画n个像素的”水平线“和”垂直线“的函数可以优化为总时间Tall=(Ta+Tb+n*Tc),
而单独绘制n个像素的点所耗时间是:Tall=n*(Ta+Tb+Tc)。
请问你那个更耗时呢?
同样的道理,图像的块拷贝操作也是如此优化的,关键就是window的概念,现在的外部LCD控制器都有这个功能。
讨论问题你不能拿你以前的“成就”来压别人(言下之意就是你肯定正确,你是权威,你是至尊)。我更相信“三人行必有我师”。

出0入0汤圆

发表于 2013-9-1 02:26:08 | 显示全部楼层
举个很常用的例子...SSD1963....

画一个点需要FSMC传送5次....x0 y0 x1 y1 color...也就是x0, y0, x0, y0, color
画一条线需要FSMC传送4+N次...x0 y0 x0 y1 color color color...N....
也就是点是一个像素的线....

SSD1963是可以设置从左到右 从右到左 从上到下 从下到上 逐行 隔行的自增方式的...
也就是在输出文字的时候其实是先读取x0 y0 x1 y1范围内的值 再更改 然后再写回...
也就是一个文字需要4 + width  * height * 2 完成一次字的读写...

SSD1963准确来说并没有点的概念和线的概念...所有的都是一个Rectangle...包括位图和字体...
但是常规GUI绘制通常选择竖线作为基本元素...也就是所有的制图都由竖线完成...
所以竖线或横线是GUI的基本元素...而不是点...

据说RA8875支持Rectangle单色填充....那样画GUI更快...

的确基本所有的320X240以下的控制器直接点读...点写...
这种控制器本身速度都非常慢...点读/点写损失的速度也不在乎了...价格便宜结构简单...

出0入0汤圆

发表于 2013-9-1 02:29:47 | 显示全部楼层
本帖最后由 adce 于 2013-9-1 02:31 编辑

另外楼主...你写GUI...应该去看看别人的GUI怎么写的啊...DrawHLine是画横线....
ucGUI的FillCircle
  1. void GL_FillCircle(int x0, int y0, int r) {
  2.   I32 i;
  3.   int imax = ((I32)((I32)r*707))/1000+1;
  4.   I32 sqmax = (I32)r*(I32)r+(I32)r/2;
  5.   I32 x=r;
  6.   LCD_HL_DrawHLine(x0-r,y0,x0+r);
  7.   for (i=1; i<= imax; i++) {
  8.     if ((i*i+x*x) >sqmax) {
  9.       /* draw lines from outside */
  10.       if (x>imax) {
  11.         LCD_HL_DrawHLine (x0-i+1,y0+x, x0+i-1);
  12.         LCD_HL_DrawHLine (x0-i+1,y0-x, x0+i-1);
  13.       }
  14.       x--;
  15.     }
  16.     /* draw lines from inside (center) */
  17.     LCD_HL_DrawHLine(x0-x,y0+i, x0+x);
  18.     LCD_HL_DrawHLine(x0-x,y0-i, x0+x);
  19.   }
  20. }
复制代码

出0入0汤圆

 楼主| 发表于 2013-9-1 10:48:06 | 显示全部楼层
我没有看过别人的,只是很久以前瞄了几眼ucgui,大体知道到程序架构,后来按照这个思路写了一个,比较简单,但是绝对是gui的典型架构,,用消息驱动,,等会传个视频吧,,吧设计思路说一下,,

出0入0汤圆

发表于 2013-9-1 11:38:43 | 显示全部楼层
armstrong 发表于 2013-8-31 21:28
说的具体点就是:
假设设置左上角坐标的耗时为Ta,设置右下角坐标的耗时为Tb,传输一个像素值的耗时为Tc ...

你到底看明白我说的没有?你拿我说的大概意思稍微详细解释一遍然后拿来反驳我?这表示你很牛逼?

出0入0汤圆

发表于 2013-9-1 11:43:37 | 显示全部楼层
armstrong 发表于 2013-8-31 21:28
说的具体点就是:
假设设置左上角坐标的耗时为Ta,设置右下角坐标的耗时为Tb,传输一个像素值的耗时为Tc ...

如果你小学语文是体育老师教的,那我在这给你概括一下我说的意思:我说对我上面贴的程序而言,画线不会比画点快,因为上面画线也是最终调用的画点函数,这只是最通用的,只要实线画点就可以,但不一定是最有效率的!

出0入0汤圆

 楼主| 发表于 2013-9-1 12:02:49 | 显示全部楼层
大家不用争了,,,各有优势,每种算法纯在必然有其纯在的意义。。。每种事物都有两面,,所以合适就好~~~打点快还是画线快?这个说不清楚~~你比如RA8875里面内置了2D绘图引擎~~可以用硬件画很多图形~~~而且还可以进行矩形快速填充~~~你说你们打点快画线快,还是我用硬件引擎画得快??所以争论没必要~~~合适就好了~~

出0入0汤圆

发表于 2013-9-1 12:14:46 | 显示全部楼层
myqiang1990 发表于 2013-9-1 12:02
大家不用争了,,,各有优势,每种算法纯在必然有其纯在的意义。。。每种事物都有两面,,所以合适就好~~~ ...

这正是我上面表达的意思,上面那几个人看都没看清楚别人说的就一副教训人的样子,断章取义,真是不可理喻。

出0入0汤圆

发表于 2013-9-1 16:31:17 | 显示全部楼层
myqiang1990 发表于 2013-9-1 12:02
大家不用争了,,,各有优势,每种算法纯在必然有其纯在的意义。。。每种事物都有两面,,所以合适就好~~~ ...


RA8875/W5100/CH375...这些都不是传统器件吧...

我想知道你的GUI的抗锯齿怎么做的...我弄的速度不是很理想...

出870入263汤圆

发表于 2013-9-1 19:36:48 | 显示全部楼层
adce 发表于 2013-9-1 16:31
RA8875/W5100/CH375...这些都不是传统器件吧...

我想知道你的GUI的抗锯齿怎么做的...我弄的速度不是很理 ...

抗锯齿得依赖软件算法,计算像素的偏离率,折算成透明度,然后进行alpha混合。
看看ucgui源代码吧。

出0入0汤圆

发表于 2013-9-1 19:48:25 | 显示全部楼层
ucGUI的抗锯齿是超采样...不如不用...

出0入4汤圆

发表于 2013-9-1 20:24:55 | 显示全部楼层
for循环,竖着画线

出0入0汤圆

发表于 2013-9-1 20:55:27 | 显示全部楼层
是什么型号的LCD啊!

出0入0汤圆

发表于 2013-9-1 21:14:45 | 显示全部楼层
senjet 发表于 2013-9-1 11:43
如果你小学语文是体育老师教的,那我在这给你概括一下我说的意思:我说对我上面贴的程序而言,画线不会比 ...

目测画线效率比画点高,因为画线不一定调用画点函数,直接做一个循环写入即可,而画点就要加上函数调用的开销了。
COZ114大侠写过一个NB的GUI,是真功夫,不只是纸上跟你谈兵而已

出0入0汤圆

 楼主| 发表于 2013-9-2 09:33:24 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-9-2 09:35 编辑
adce 发表于 2013-9-1 19:48
ucGUI的抗锯齿是超采样...不如不用...


http://v.youku.com/v_show/id_XNjAzOTU3Mzgw.html
多谢大家的指点,把我写的GUI传上来给大家看看,因为项目比较急10月初要出来,所以写得简单点了(问大家画实心圆,就是为了做Radio控件的~~ ),写这个主控+GUI花了近两个月这样~~GUI只实现了button..checkbox..radio...dialog..widows..mutilpage..srcollbar..控件~~~以后有时间了在完善把~~反正现在用够用~~~
          GUI架构基于消息驱动,所有控件基于:对象+属性,对象是由一个对象数据结构,把所有控件对象按照父节点,子节点用链表连接(窗体管理),兄弟链表横向连接,孩子节点竖向连接~~~每个控件除了有自己的窗体对象外,还有自己的属性~~属性按照不同的控件有自己不同的属性,比如button..有大小,类型,标题等等~~~在创建控件的时候,先申请一个窗体对象内存,然后再申请一个属性内存,然后将该窗体对象连入自己的属性区,属性也有一个指针指向自己的窗体对象~~~每个控件有自己的回调函数,控件回调函数负责维护控件的状态,比如获得焦点,失去焦点,还有向其父节点发送消息~~还有其他控件就不介绍了,细节的实现方式也不介绍了~~所有控件的最顶层父亲是桌面窗体(大家看到那些色块就是一个个窗体)~~消息驱动是调用一个触摸函数,触摸函数里面会根据当前坐标,发送消息到指定的窗体(每个窗体有自己的回调函数~~获得当前窗体回调函数的办法跟UCGUI一样,就是按照节点递归查询那个窗体在当前坐标内~~)~~~其实就是UCGUI架构的一个微型版~~UCGUI我没有研仔细究过,我只是大概了解了他的架构~~我看程序一般不会去仔细研究很细节的东西~~我只看整体架构如何~~

出0入0汤圆

发表于 2013-9-2 11:12:19 | 显示全部楼层
SNOOKER 发表于 2013-9-1 21:14
目测画线效率比画点高,因为画线不一定调用画点函数,直接做一个循环写入即可,而画点就要加上函数调用的 ...

真不知道还该说什么好,我都强调很多次了我说的画线不一定比画点效率高是对我上面贴出的程序而言,这么多人看都没看清楚,到底想干什么?谁不知道很多情况下,特别是有2D硬件加速的情况下,甚至都可以直接画圆、画多边形……也不过是几个指令的事,效率当然高了,这些我也没有否认啊,我只是对最开始那位说的“画线一定比画点”效率高提出质疑,表示这不是绝对的,然后稍微解释了一下为什么,竟然还这么多人跟我"争",你们仔细看清楚,前后连起来看,我说的跟你们”反驳“的有区别吗?不都一个意思吗?!最后一次跟你们这些断章取义的人”狡辩“,以后再不回复,要不然智商都被拉到与你们一样的水平了,肯定会被你们以丰富的经验打败!

出0入0汤圆

发表于 2013-9-2 11:45:55 | 显示全部楼层
画空心圆搞定了实心圆也类似。只不过计算空心圆出来的X,Y坐标在实心圆里作为填充边界来用。

出0入0汤圆

发表于 2013-9-2 13:34:53 | 显示全部楼层
senjet 发表于 2013-9-2 11:12
真不知道还该说什么好,我都强调很多次了我说的画线不一定比画点效率高是对我上面贴出的程序而言,这么多 ...

服了。首先你搞清楚。LZ是问画实心圆算法。是在LCD上画。
如果有硬件绘图还要算法做什么。所以不要把2D硬件加速扯到这里来。
还有不要说别人智商什么的。

出0入0汤圆

发表于 2013-9-2 17:57:53 | 显示全部楼层
czg1411 发表于 2013-9-2 13:34
服了。首先你搞清楚。LZ是问画实心圆算法。是在LCD上画。
如果有硬件绘图还要算法做什么。所以不要把2D硬 ...

我看你就一纯SB,这2D加速什么的是后面的人先提到的,不是我首先提的,明白否?

出0入0汤圆

发表于 2013-9-2 18:33:30 | 显示全部楼层
senjet 发表于 2013-9-2 17:57
我看你就一纯SB,这2D加速什么的是后面的人先提到的,不是我首先提的,明白否? ...

呀。开始咬人了。

是不是要所有人都支持你的观点才满意?

你不是“写过不下几十种显示设备的底层驱动”
拿出一个调用画点函数画直线比画直线快的。
画多长的横线 长度你自己定。

出0入0汤圆

发表于 2013-9-2 20:05:58 | 显示全部楼层
myqiang1990 发表于 2013-9-2 09:33
多谢大家的指点,把我写的GUI传上来给大家看看,因为项目比较急10月初要出来,所以写得简单点了(问大家 ...

你实现的那个叫ProgressBar....不叫Scrollbar...

出0入0汤圆

 楼主| 发表于 2013-9-3 09:08:12 | 显示全部楼层
本帖最后由 myqiang1990 于 2013-9-3 09:56 编辑
adce 发表于 2013-9-2 20:05
你实现的那个叫ProgressBar....不叫Scrollbar...


哦~~~那叫错了~我闲麻烦~~没有在里面做滑块~~以后加上~~~其实还有个messagebox

出0入0汤圆

发表于 2013-9-3 21:29:33 | 显示全部楼层
myqiang1990 发表于 2013-9-2 09:33
多谢大家的指点,把我写的GUI传上来给大家看看,因为项目比较急10月初要出来,所以写得简单点了(问大家 ...

NICE!希望楼主能介绍更多的实现细节,让我等学习一下

出0入0汤圆

发表于 2014-8-1 16:57:53 | 显示全部楼层
NB 学习了..

出0入0汤圆

发表于 2016-1-21 01:31:46 | 显示全部楼层
好帖,深夜也要顶,可以睡个好觉了

出0入18汤圆

发表于 2016-1-21 09:03:02 | 显示全部楼层
还好 是 园   ,之前 我 画扇型  擦  累呀

出0入10汤圆

发表于 2016-1-21 09:18:59 | 显示全部楼层
我觉得下面的楼层关于画点还是画线快可以另开一个帖子。

出0入0汤圆

发表于 2016-1-21 09:39:56 | 显示全部楼层
高手对决,有意思,继续

出0入0汤圆

发表于 2016-1-21 11:44:35 | 显示全部楼层
先标记收下,以后备用。

出0入0汤圆

发表于 2017-5-14 16:19:37 | 显示全部楼层
senjet 发表于 2013-8-24 15:27
void FillCircle(int x0,int y0,int r,int mode)
{
int x,y;

实测代码可以用,谢谢分享

出0入0汤圆

发表于 2017-5-14 19:36:08 | 显示全部楼层
学习啦
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 18:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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