对Framebuffer的操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>
#include <linux/fb.h>

#define TRUE       1
#define FALSE     0

#define MIN(x,y)               ((x)>(y)?(y):(x))
#define MAX(x,y)               ((x)>(y)?(x):(y))

typedef struct fbdev{
               int fb;
               unsigned long fb_mem_offset;
               unsigned long fb_mem;
               struct fb_fix_screeninfo fb_fix;
               struct fb_var_screeninfo fb_var;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <asm/page.h>
#include <linux/fb.h>

#define TRUE       1
#define FALSE     0

#define MIN(x,y)               ((x)>(y)?(y):(x))
#define MAX(x,y)               ((x)>(y)?(x):(y))

typedef struct fbdev{
               int fb;
               unsigned long fb_mem_offset;
               unsigned long fb_mem;
               struct fb_fix_screeninfo fb_fix;
               struct fb_var_screeninfo fb_var;
               char dev[20];
} FBDEV, *PFBDEV;

typedef struct point{
               int x;
               int y;
               int z;

} POINT, *PPOINT;

int fb_open(PFBDEV pFbdev)
{
        pFbdev->fb = open(pFbdev->dev, O_RDWR);
        if(pFbdev->fb < 0)
        {
                printf("Error opening %s: %m. Check kernel config\n", pFbdev->dev);
                return FALSE;
        }
        if (-1 == ioctl(pFbdev->fb,FBIOGET_VSCREENINFO,&(pFbdev->fb_var)))
        {
                printf("ioctl FBIOGET_VSCREENINFO\n");
                return FALSE;
        }
        if (-1 == ioctl(pFbdev->fb,FBIOGET_FSCREENINFO,&(pFbdev->fb_fix)))
        {
                printf("ioctl FBIOGET_FSCREENINFO\n");
                return FALSE;
        }

        pFbdev->fb_mem_offset = (unsigned long)(pFbdev->fb_fix.smem_start) & (~PAGE_MASK);
        pFbdev->fb_mem = (unsigned long int)mmap(NULL, pFbdev->fb_fix.smem_len +
                        pFbdev->fb_mem_offset,
                        PROT_READ | PROT_WRITE, MAP_SHARED, pFbdev->fb, 0);
        if (-1L == (long) pFbdev->fb_mem)
        {
                printf("mmap error! mem:%ld offset:%ld\n", pFbdev->fb_mem,
                                pFbdev->fb_mem_offset);
                return FALSE;
        }

        return TRUE;
}

void fb_close(PFBDEV pFbdev)
{
        close(pFbdev->fb);
        pFbdev->fb=-1;
}

void draw_dot (PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b)
{
        uint32_t offset;
        uint8_t color[4];
        color[0] = b;
        color[1] = g;
        color[2] = r;
        color[3] = 0x0;
        offset = p.y*pFbdev->fb_fix.line_length+4*p.x;
        fb_memcpy((void*)(pFbdev->fb_mem + pFbdev->fb_mem_offset + offset), color, 4);
}


void draw_line(PFBDEV pFbdev, POINT p1, POINT p2, uint8_t r, uint8_t g, uint8_t b)
{
        POINT p;
        int x,y;
        for( x=MIN(p1.x,p2.x); x<=MAX(p1.x,p2.x); x++ )
        {
                y = (p2.y-p1.y)*(x-p1.x)/(p2.x-p1.x) + p1.y;
                p.x = x;
                p.y = y;
                draw_dot(pFbdev, p, r, g, b);
        }
}

void draw_triangle(PFBDEV pFbdev, POINT p1, POINT p2, POINT p3, uint8_t r, uint8_t g, uint8_t b)
{
        POINT p[3];
        p[0] = p1;
        p[1] = p2;
        p[2] = p3;
        draw_polygon(pFbdev, 3, p, r, g, b);
}

void draw_polygon(PFBDEV pFbdev, uint32_t num, PPOINT array, uint8_t r, uint8_t g, uint8_t b)
{
        int i;
        for(i=0; i<num; i++)
        {
                draw_line(pFbdev, array[i], array[(i+1)%num], r, g, b);
        }
}


void draw_circle(PFBDEV pFbdev, POINT center, uint32_t radius, uint8_t r, uint8_t g, uint8_t b)
{
        POINT p;
        int x,y,tmp;
        for(x=center.x-radius; x<=center.x+radius; x++)
        {
                p.x = x;
                tmp = sqrt(radius*radius -(x-center.x)*(x-center.x));
                p.y = center.y + tmp;
                draw_dot(pFbdev, p, r, g, b);
                p.y = center.y - tmp;
                draw_dot(pFbdev, p, r, g, b);
        }
        for(y=center.y-radius; y<=center.y+radius; y++)
        {
                p.y = y;
                tmp = sqrt(radius*radius - (y-center.y)*(y-center.y));
                p.x = center.x + tmp;
                draw_dot(pFbdev, p, r, g, b);
                p.x = center.x - tmp;
                draw_dot(pFbdev, p, r, g, b);
        }
}

void draw_parabola_x(PFBDEV pFbdev, POINT center, int a, uint8_t r, uint8_t g, uint8_t b)
{
        int x;
        POINT p;
        for(x=center.x-100; x<center.x+100; x++)
        {
                p.x = x;
                p.y = (x-center.x)*(x-center.x)/a + center.y;
                draw_dot(pFbdev, p, r, g, b);
        }
}


void draw_parabola_y(PFBDEV pFbdev, POINT center, int a, uint8_t r, uint8_t g, uint8_t b)
{
        int y;
        POINT p;
        for(y=center.y-100; y<center.y+100; y++)
        {
                p.y = y;
                p.x = (y-center.y)*(y-center.y)/a + center.x;
                draw_dot(pFbdev, p, r, g, b);
        }
}

int main(void)
{
        FBDEV fb;
        memset(&fb, 0, sizeof(FBDEV));
        strcpy(fb.dev, "/dev/fb0");
        if(fb_open(&fb)==FALSE)
        {
                printf("open frame buffer error\n");
                return 0;
        }

        POINT p1, p2, p3;

        p1.x = 300;
        p1.y = 450;
        p2.x = 500;
        p2.y = 300;
        draw_line( &fb, p1, p2, 0x0, 0xff, 0x0 );

        p1.x = 200;
        p1.y = 200;
        p2.x = 300;
        p2.y = 400;
        p3.x = 500;
        p3.y = 250;
        draw_triangle(&fb, p1, p2, p3, 0x0, 0xff, 0x0);

        POINT center = { 600, 500, 0 };
        int radius = 100;
        draw_circle(&fb, center, radius, 0x0, 0xff, 0x0);

        center.x = 700;
        center.y = 250;
        int a = -100;
        draw_parabola_x(&fb, center, a, 0x0, 0xff, 0x0);
        draw_parabola_x(&fb, center, -a, 0x0, 0xff, 0x0);
        draw_parabola_y(&fb, center, a, 0x0, 0xff, 0x0);
        draw_parabola_y(&fb, center, -a, 0x0, 0xff, 0x0);

        fb_close(&fb);
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值