OpenEdv-开源电子网

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

请问红色圆圈中有一个白叉的c语言显示算法怎么做?

[复制链接]

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-3-28
在线时间
1 小时
发表于 2013-3-28 21:13:21 | 显示全部楼层 |阅读模式
     


小弟最近想用stm32做一个如下图的警告界面,不知道中间的白叉如何实现?我试过一条一条的画线,但是效果十分不好
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1817
金钱
1817
注册时间
2011-10-9
在线时间
231 小时
发表于 2013-3-28 21:49:57 | 显示全部楼层
你直接显示一个bmp不行?
回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-3-28
在线时间
1 小时
 楼主| 发表于 2013-3-28 22:18:08 | 显示全部楼层
回复【2楼】simms01:
---------------------------------
可以是可以,但是感觉这样似乎就不能调整大小了
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1817
金钱
1817
注册时间
2011-10-9
在线时间
231 小时
发表于 2013-3-28 22:19:42 | 显示全部楼层
刚好有个画斜线的函数 你看凑合用不
改一下 就成了画一个斜的矩形 再改一下就成了中间的叉了
// 在指定的位置画斜线
// 入参 x0, y0, x1, y1: 所画线的位置
void LCD_paintLineOblique(int x0, int y0, int x1, int y1)
{
    int x, y;
    uint16_t * pixel, * pRam;
    uint32_t slope;

    if (x0 == x1)
    {
        LCD_paintLineVertical(x0, y0, y1);
        return;
    }

    if (y0 == y1)
    {
        LCD_paintLineHorizontal(x0, y0, x1);
        return;
    }
    
    if (x1 < x0)
    {
        x = x0;
        y = y0;
        x0 = x1;
        y0 = y1;
        x1 = x;
        y1 = y;
    }
    
    if (y1 > y0)
    {
        slope = ((uint32_t)(y1-y0) << 10)/((uint32_t)(x1-x0));
    }
    else
    {
        slope = ((uint32_t)(y0-y1) << 10)/((uint32_t)(x1-x0));
    }

    pRam = g_lcdFrame; 
    
    pixel = pRam + y0*g_lcdHSize + x0;

    y = y0;

if (g_lcdPenSize > 1)
{
    lcdPaintCircle1(x0, y0, pRam);
lcdfillColor(x0, y0, g_lcdPenColor, pRam);
    }
else
{
        *pixel = g_lcdPenColor;
}

    pixel++;
    
    for (x = x0 + 1; x <= x1; x++)
    {
        // X在确定的情况下,找一个合适的Y点
        if (y1 > y0)
        {
            while ((((uint32_t)(y - y0) << 10) < slope*(x-x0)))
            {
                y++;
                pixel+=g_lcdHSize;
            }
        }
        else
        {
            while ((((uint32_t)(y0 - y) << 10) < slope*(x-x0)))
            {
                y--;
                pixel-=g_lcdHSize;
            }
        }
        
        // 循环退出,Y点已找到。
        
        if (g_lcdPenSize > 1)
{
            lcdPaintCircle1(x, y, pRam);
}
else
{
            *pixel = g_lcdPenColor;
}

        pixel++;
    }    
}

回复 支持 反对

使用道具 举报

3

主题

11

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-3-28
在线时间
1 小时
 楼主| 发表于 2013-4-1 20:55:05 | 显示全部楼层
谢啦,真好用上
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-4-2 16:44:56 | 显示全部楼层
可以存成一幅图像, 
这样就要快的多
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 06:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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