在lcd屏幕显示圆

 * name;Circle
 * function:画圆
 * parameter;none
 * ReValue;none
 * author;小北blog
 * attention;none
 * date;2024.05.10
 * Copyright(c) 2024 huahuadebaby99@163.com All rights Reserved
 *****************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
    // 1.打开文件
    int lcd_fd = open("/dev/fb0", O_RDWR);
    if (lcd_fd == -1)
    {
        perror("lcd open failed!");
    }

    // 2.写入颜色

    int x, y;                          // x和y轴
    int cx = 400, cy = 240;            // 圆心坐标
    int color_buffer[800 * 480] = {0}; // 初始化缓冲区
    int i, j;
    int r = 200; // 半径
    for (i = 0; i < 480; i++)
    {
        for (j = 0; j < 800; j++)
        {
            y = i;
            x = j;
            if (((x - cx) * (x - cx) + (y - cy) * (y - cy)) < (r * r))
            {
                color_buffer[800 * i + j] = 0x00FF0000; // 红色
            }
            else
                color_buffer[800 * i + j] = 0x000000FF; // 蓝色
        }
    }

    write(lcd_fd, color_buffer, 800 * 480 * 4);
    // 3.关闭文件
    close(lcd_fd);
    return 0;
}````

效果:800*400分辨率lcd屏幕

![](https://img2024.cnblogs.com/blog/3432067/202405/3432067-20240525162710276-61536593.jpg)

总结:
1.搭建框架,还是老步骤,open lcd屏幕,错误处理,写入颜色(两个for循环)write,最后关闭lcd(close),因为数组申请的是栈空间不用手动释放
2.最需要注意的是圆的代码怎么写,
先写好两个for循环,然后定义x和y轴变量,定义初始化圆的半径圆心坐标(两个变量),还有缓冲区,这些数据可以用宏定义来更改代码效果,如屏幕大小或者圆的大小,目前未优化可移植性。这块代码难度在于嵌套的for循环是要做一个判断写入颜色的,判断依据是离圆心的距离小于半径的大小那么就写入目标颜色,在这之前要用i和j的数据,所以要用i和j的数据更新到x和y坐标轴上。接下来要用坐标轴判断是否在圆内,因为sqrt()函数参数是表达式出现了错误,所以用宏定义也是相同的,所以我是直接用三角函数关系判断像素点到圆心的距离,因为目前用不了sqrt()函数,所以这块if()里面的三角平方公式不是很直观。
解释:if (((x - cx) * (x - cx) + (y - cy) * (y - cy)) < (r * r)) x或者y减去对应的坐标的平方再开方的值是相对于圆心的距离
数学公式:在一个直角三角形直角两条边各平方之和 等于 斜边的平方
X*X + Y*Y = R*R
posted @ 2024-05-25 16:27  小北bolg  阅读(14)  评论(0编辑  收藏  举报