Framebuffer 画点,画线,画多边形,画圆
转自 http://blog.chinaunix.net/uid-22666248-id-283558.html
- #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;
- void draw_dot (PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b);
- void draw_line(PFBDEV pFbdev, POINT p1, POINT p2, uint8_t r, uint8_t g, uint8_t b);
- void draw_polygon(PFBDEV pFbdev, uint32_t num, PPOINT array, uint8_t r, uint8_t g, uint8_t b);
- void draw_triangle(PFBDEV pFbdev, POINT p1, POINT p2, POINT p3, uint8_t r, uint8_t g, uint8_t b);
- void draw_circle(PFBDEV pFbdev, POINT center, uint32_t radius, uint8_t r, uint8_t g, uint8_t b);
- void draw_parabola_x(PFBDEV pFbdev, POINT center, int a, uint8_t r, uint8_t g, uint8_t b);
- void draw_parabola_y(PFBDEV pFbdev, POINT center, int a, uint8_t r, uint8_t g, uint8_t b);
- 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 fb_memcpy(void *addr, void *color, size_t len)
- {
- memcpy(addr, color, len);
- }
- 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;
- }
Framebuffer 画点,画线,画多边形,画圆相关推荐
- Matlab 画多根线,matlab plot画多条不同颜色的线
在使用matlab画图的时候,有时需要在一个图中画多条线,并且用不同的颜色区分,下面是我的一个demo. matlab代码如下: clear clc close all; kld = [3.9,3.2 ...
- 二维几何基础大合集!《计算几何全家桶(一)》(基础运算、点、线、多边形、圆、网格)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的模板整合计划 目录 1.基本运算 1.1 判断正负函数(sgn) 1.2 点积(数量积.内积)(Dot) 1.3 向量积 ...
- OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字
OpenCV在图像上随机画直线.椭圆.多边形.圆.显示文字 代码如下: /*** @file Drawing_2.cpp* @brief Simple sample code*/#include &l ...
- OpenGL学习笔记:画点、直线和多边形(第二讲)
1.关于点 点的大小默认为1个像素,但也可以改变之. 改变的命令为glPointSize,其函数原型如下: void glPointSize(GLfloat size); size必须大于0.0 ...
- AutoCad-查看坐标数据-画多段线命令-画圆命令-画文字-VBA
文章目录 1.打开VBA 2.动作录制 3.显示坐标 4.VBA宏 4.1.绘制多段线 4.2.绘制圆 4.3.绘制多个多边形 5.函数过程调用 6.画文字 6.1.绘制文字 6.2.CAD设置文字字 ...
- JAVA实现中点画线_实验1-中点画线和Bresenham画线算法的实现
<实验1-中点画线和Bresenham画线算法的实现>由会员分享,可在线阅读,更多相关<实验1-中点画线和Bresenham画线算法的实现(9页珍藏版)>请在人人文库网上搜索. ...
- 18怎么确定板子形状_板绘怎么画线条排线?板绘小白画线不稳怎么办?
想学习绘画去找不到方法?小编为大家提供一套学习素材~~领取方式在文章最后~~ 很多初学者在刚刚接触板绘的时候经常会因为手不稳而无法控制线条的运用,导致画面显得粗糙,形状或结构不标准,画面花等等问题. ...
- viso 画背景框_3分钟漫画教程 | Q版漫画少女线稿,画完暖暖的
今天就跟sunny一起来画一幅 看上去就很温暖的超可爱少女吧! 教程选自家的绘画教程 本次教程用到的画材有: 铅笔 勾线笔 01 起稿部分 用简单的几何画出人物动态,用正圆表现人物脑袋,然后用小一点的 ...
- ArcGIS.Server.9.2.DotNet在ElementGraphicsLayer画点、线、折线、面、圆、矩形的代码
ArcGIS.Server.9.2.DotNet在ElementGraphicsLayer画点.线.折线.面.圆.矩形的代码: 1public class AddTool:IMapServerTo ...
- Sketch小技巧—画出各种星型和多边形的简单方法
sketch拥有很棒的矢量工具以及基本的形状.这十分有利于任何一项制图的起步,无论是网页设计或是图标的设计,或者其他.在Sketch中你能轻松设 计图层面板,而且在这里我们提供你可能需要的各种操作功能 ...
最新文章
- JavaScript 二进制的 AST
- OSI,TCP/IP,五层协议的体系结构,以及各层协议
- 挖掘管理价值:企业软件项目管理实战
- Java---形参个数可变的方法
- c语言程序设计算机基础知识,2018春C语言程序设计(合肥工业大学)
- php自学建议_如何高效自学PHP?
- java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.doWithLocalFieldsV
- php导出Excel表格(无插件)
- MySQL8.0.19解压安装教程
- 单片机c语言程序设计实训100例基于pic pdf,单片机C语言程序设计实训100例 基于AVR+Proteus仿真.pdf...
- 移动应用商店比较分析
- 超市扫码机器服务器系统搭建,超市用的扫码机是怎么个原理?
- DOTA高考全国卷A卷
- 常用二极管IN4148和单片机驱动的一些关系
- java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园
- MyBatis12 结果集映射
- Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿
- photoshop不能保存bmp格式
- 漫画插画绘图工具:MediBangPaintPro for Mac
- python循环语句和跳出语句详解