查看: 2446|回复: 8

[其他] 每天一个问题35天4问 :画实心和空心圆的方法

[复制链接]
  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2015-9-28 22:20:53 | 显示全部楼层 |阅读模式
    本帖最后由 lkl0305 于 2015-9-29 09:57 编辑

    一、问题描述:
    我们在使用TFT屏时,经常需要画一些图形,比如圆形,如何变成画出一个圆形,那如何画一个空心或实心圆呢?

    二、解决办法:
    1、网上方法比较多,比如8点画圆法等,大家可以去参考一下。
    2、但是有很多没有给出画实心或空心的方法。
    3、在这里我根据程序,改动了一下,实现画实心和空心的方法,给大家分享一下:
    其中参数含义时圆心的x、y坐标,半径大小,最后是是新或空心的标志,在程序中根据传递过来的参数,首先画圆的实体,然后画圆的边框,这样既可以画空心圆,也可以画实心圆。
    void TFT_DrawFastCircle(int xc , int yc , int r, uint8_t FillMode)
    {
      if ((FillMode & FILLENTITY) == FILLENTITY){
        TFT_DrawFastCircleEntity(xc, yc, r);
      }
      if ((FillMode & FILLEDGE) == FILLEDGE){
        TFT_DrawFastCircleEdge(xc, yc, r);
      }
    }
    4、画实体和边框的程序如下:
    void TFT_DrawFastCircleEdge(int xc , int yc , int r)
    {
            int x, y, d;
            x = 0;
            y = r;
            d = -r / 2;
      TFT_DrawPoint(xc + x, yc + y, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc - x, yc + y, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc + x, yc - y, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc - x, yc - y, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc + y, yc + x, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc - y, yc + x, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc + y, yc - x, TFT_Dev.TFT_PointColor);
      TFT_DrawPoint(xc - y, yc - x, TFT_Dev.TFT_PointColor);
            if (r % 2 == 0){
                    while (x < y){
          x++;
          if (d < 0){
            d += x;
          }
          else{
            y--;
            d += x - y;
          }
          TFT_DrawPoint(xc + x, yc + y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - x, yc + y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc + x, yc - y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - x, yc - y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc + y, yc + x, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - y, yc + x, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc + y, yc - x, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - y, yc - x, TFT_Dev.TFT_PointColor);
                    }
            }
            else{
        while (x < y){
          x++;
          if (d < 0){
            d += x + 1;
          }
          else{
            y--;
            d += x - y + 1;
          }
          TFT_DrawPoint(xc + x, yc + y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - x, yc + y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc + x, yc - y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - x, yc - y, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc + y, yc + x, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - y, yc + x, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc + y, yc - x, TFT_Dev.TFT_PointColor);
          TFT_DrawPoint(xc - y, yc - x, TFT_Dev.TFT_PointColor);
        }
            }
    }

    void TFT_DrawFastCircleEntity(int xc , int yc , int r)
    {
            int x, y, d;
            x = 0;
            y = r;
            d = -r / 2;
      TFT_FillHorizontalLine(xc + x, yc + y, xc - x, yc + y);
      TFT_FillHorizontalLine(xc + x, yc - y, xc - x, yc - y);
      TFT_FillHorizontalLine(xc + y, yc + x, xc - y, yc + x);
      TFT_FillHorizontalLine(xc + y, yc - x, xc - y, yc - x);
            if (r % 2 == 0){
                    while (x < y){
          x++;
          if (d < 0){
            d += x;
          }
          else{
            y--;
            d += x - y;
          }
          TFT_FillHorizontalLine(xc + x, yc + y, xc - x, yc + y);
          TFT_FillHorizontalLine(xc + x, yc - y, xc - x, yc - y);
          TFT_FillHorizontalLine(xc + y, yc + x, xc - y, yc + x);
          TFT_FillHorizontalLine(xc + y, yc - x, xc - y, yc - x);
                    }
            }
            else{
        while (x < y){
          x++;
          if (d < 0){
            d += x + 1;
          }
          else{
            y--;
            d += x - y + 1;
          }
          TFT_FillHorizontalLine(xc + x, yc + y, xc - x, yc + y);
          TFT_FillHorizontalLine(xc + x, yc - y, xc - x, yc - y);
          TFT_FillHorizontalLine(xc + y, yc + x, xc - y, yc + x);
          TFT_FillHorizontalLine(xc + y, yc - x, xc - y, yc - x);
        }
            }
    }

    三、感想与收获:
    1、其实大家可以将TFT屏画图的程序总结一下,写一个小库来用。

    我知道答案 目前已有8人回答
    回复

    使用道具 举报

    该用户从未签到

    16

    主题

    362

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1026
    最后登录
    2017-5-7
    发表于 2015-9-28 23:19:23 | 显示全部楼层
    坐等高人解答
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    362

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1026
    最后登录
    2017-5-7
    发表于 2015-9-28 23:20:03 | 显示全部楼层
    慢慢收集。。作为写gui库的资料
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-30 10:30:45 | 显示全部楼层
    学习了,谢谢分享
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    171

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    386
    最后登录
    2015-10-22
    发表于 2015-10-17 00:05:34 | 显示全部楼层
    多谢分享!!
    logo.jpg
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
     楼主| 发表于 2015-12-4 23:33:20 | 显示全部楼层

    欢迎交流 1.png 2.png 3.png 5.png 6.png 7.png 8.png 9.png 0.png 4.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2015-12-5 08:33:55 | 显示全部楼层
    谢谢分享,将来试试画圆。现在还没有想如何实现sin,cos计算坐标,尽管只需要1个象限。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-12-5 21:07:27 | 显示全部楼层
    谢谢分享,学习一下
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
     楼主| 发表于 2015-12-5 21:32:20 | 显示全部楼层
    zhjb1 发表于 2015-12-5 08:33
    谢谢分享,将来试试画圆。现在还没有想如何实现sin,cos计算坐标,尽管只需要1个象限。 ...

    望楼主想好了来交流交流哈
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 17:42 , Processed in 0.102024 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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