zoukankan      html  css  js  c++  java
  • LCD圆弧绘制算法~基于逐点比较算法,入口参数:弧线起点、终点(逆时针方向)、圆心


    以下分不同象限分别给出算法,便于各位理解。area1即为第一象限,依次类推。

    /************************圆弧插补算法
        液晶坐标系统如下:
        0------->x
        |
        |
        |
        y
        调用实例如下:
        arc_chabu_area1(120,340,120,275,180,340);    
        arc_chabu_area2(415,145,390,110,415,100);
        arc_chabu_area3(250,225,250,275,200,225);
        arc_chabu_area4(250,225,300,225,250,275);
        
        注意:调用弧线的起始和终点按逆时针方向
                                                              
    ******************************************/
    void arc_chabu_area1(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
    {
        
        u16 x,y,xi,yi;
        u8 e;
        x=xi=x2;
        y=yi=y2;
        POINT_COLOR=GRAY;
        e=abs(x2-x1)+abs(y2-y1);
        while(e!=0)
        {
            if(fi1>=0)
            {
                 x=xi-1;
                 fi1=fi1+2*(x0-xi)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                 xi=x;
                 e--;
            }
            else
            {
                y=yi-1;
                fi1=fi1+2*(y0-yi)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                yi=y;
                e--;
            }    
        }    

    }

    void arc_chabu_area2(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
    {
        
        u16 x,y,xi,yi;
        u8 e;
        x=xi=x2;
        y=yi=y2;
        e=abs(x2-x1)+abs(y2-y1);
        while(e!=0)
        {
            if(fi2>=0)
            {
                 y=yi+1;
                 fi2=fi2+2*(yi-y0)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                 yi=y;
                 e--;
            }
            else
            {
                x=xi-1;
                fi2=fi2+2*(x0-xi)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                xi=x;
                e--;
            }    
        }    

    }


    void arc_chabu_area3(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
    {
        
        u16 x,y,xi,yi;
        u8 e;
        x=xi=x2;
        y=yi=y2;
        e=abs(x2-x1)+abs(y2-y1);
        while(e!=0)
        {
            if(fi3>=0)
            {
                 x=xi+1;
                 fi3=fi3+2*(xi-x0)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                 xi=x;
                 e--;
            }
            else
            {
                y=yi+1;
                fi3=fi3+2*(yi-y0)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                yi=y;
                e--;
            }    
        }    

    }

    void arc_chabu_area4(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2)
    {
        
        u16 x,y,xi,yi;
        u8 e;
        x=xi=x2;
        y=yi=y2;
        e=abs(x2-x1)+abs(y2-y1);
        while(e!=0)
        {
            if(fi4>=0)
            {
                 y=yi-1;
                 fi4=fi4+2*(y0-yi)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                 yi=y;
                 e--;
            }
            else
            {
                x=xi+1;
                fi4=fi4+2*(xi-x0)+1;
                LCD_DrawLine(xi,yi,x,y,5);
                xi=x;
                e--;
            }    
        }    

    }

    如图中lcd的液晶上的弧线即通过该算法绘制


  • 相关阅读:
    mybatis 缓存
    mybatis 动态sql
    新手必读:游戏编程入门指南
    22条常用JavaScript开发小技巧
    Unity即将全面升级 实时3D技术及大场景编辑未来可期!
    10分钟学会Python基础知识
    如何用UE4制作非写实草浪
    最适合设计师的前端学习路径有哪些?
    超全面的C++游戏开发面试问题总结
    如何学习大型项目的源码?虚幻引擎源码学习思路分享
  • 原文地址:https://www.cnblogs.com/siahekai/p/5840337.html
Copyright © 2011-2022 走看看