文章目录

  • 一、点
  • 二、线
  • 二、矩形
  • 二、圆

主要描述了,点、线、矩形、圆的图形绘制实现方法,供大家了解熟悉。
在调用时注意屏幕宽高的设置以及osd地址的修改。


宏定义

图形叠加地址:osd_address
屏幕最大长宽:x_max y_max

#define  osd_address  0x870000
#define  x_max  640
#define  y_max  512

一、点

用于屏幕上的绘制点使用
在x,y的位置绘制一个点,灰度为gray

void draw_pixel(int x, int y, int gray)
{//边界确定if((x < 1) || (x > x_max) || (y < 1) || (y > y_max) )  return;//地址赋值_addr = (y-1) * x_max + x-1 + osd_address;*_addr = gray;
}

二、线

横线

x1和x2为横线两个端点的横坐标,y为纵坐标
在x1,y的位置绘制长度为(x2-x1)的横线,灰度为gray

void draw_xline(int x1, int x2, int y, int gray)
{int   exch, x;if( (y < 1) || (y > y_max) )  return;if(x1 > x2){exch = x2;x2 = x1;x1 = exch;}if (x1 < 1)         x1=1;if (x2  > x_max)    x2=x_max;_addr = (y-1) * x_max + x1 + osd_address;for (x=x1; x<=x2 ;x++){*_addr++ = gray;}
}

竖线

y1和y2为横线两个端点的横坐标,y为纵坐标
在x,y1的位置绘制长度为y2-y1的竖线,灰度为gray

void draw_yline(alt_u8 _page, int x, int y1,  int y2, int gray)
{alt_u8 * _addr = 0,*osd_address;int   exch, y;if( (x < 1) || (x > x_max) )  return;if(y1 > y2){exch = y2;y2 = y1;y1 = exch;}if (y1 < 1)         y1=1;if (y2  > y_max)    y2=y_max;_addr = (y1-1) * x_max + x + osd_address;for (y=y1;y<=y2;y++){*_addr = gray;_addr +=  x_max;}
}

任意线

屏幕上的竖线和横线或者斜线都可以用这个函数绘制
绘制起点(X1,Y1)到终点(X2,Y2)的直线,灰度为gray

void draw_line(alt_u8 _page, int x1, int y1, int x2, int y2, int gray)
{int  dx, dy, exch;int x,y,i=1;//计算两点差dx = x2 - x1;dy = y2 - y1;if((0 ==dx) && (0 == dy)) draw_pixel(_page,x1,y1,gray);else if(0 == dx) draw_yline(_page, x1,  y1,  y2,  gray);else if(0 == dy) draw_xline(_page, x1,  x2,  y2,  gray);else{if(abs(dx)  >= abs (dy)){if(x1 <= x2){for(x=x1; x<= x2; x++){y = y1+(x-x1)*dy/dx;draw_pixel(_page,x,y,gray);}}else{for(x=x1; x >= x2; x--){y =  y1+(x-x1)*dy/dx;draw_pixel(_page,x,y,gray);}}}else{if(y1 <= y2){for(y=y1; y<=y2; y++){x = x1+(y-y1)*dx/dy;draw_pixel(_page, x,y,gray);}}else{for(y=y1; y>= y2; y--){x = x1+(y-y1)*dx/dy;draw_pixel(_page, x,y,gray);}}}}
}

二、矩形

绘制长x2-x1,宽y2-y1,灰度为gray的实心矩形
如果想绘制空心的可以将以上的绘制线的函数结合即可。

void draw_bar(int x1, int y1, int x2, int y2, int gray)
{alt_u8 * _addr = 0,*osd_address;;int   exch, x,y;if(x1 > x2){exch = x2;x2 = x1;x1 = exch;}if(y1 > y2){exch = y2;y2 = y1;y1 = exch;}for (y=y1;y<=y2;y++){_addr = (y-1) * x_max + x1 + osd_address;for (x=x1; x<=x2 ;x++){*_addr++ = gray;}}
}

二、圆

在(x,y)中绘制一个半径为radius灰度为gray的圆
center_x,center_y为圆心;radius为半径

void draw_circle(int center_x,int center_y,int radius,int gray)
{int var,offset;alt_u8 * _addr = 0, *osd_address;//右方边界限制if(radius>x_max-center_x ){radius = x_max-center_x;}//下方边界限制if( radius>y_max-center_y ){radius = y_max-center_y;}//左方边界限制if(radius>center_x ){radius = center_x;}//上方边界限制if(radius>center_y){radius = center_y;}//遍历x/y轴 向x/y两侧的圆上的点写像素for(var = -radius ; var<radius ; var++){offset = sqrt(radius*radius - var*var);_addr = (center_y+offset-1) * x_max + center_x+var + osd_address;*_addr = gray;_addr = (center_y-offset-1) * x_max + center_x+var + osd_address;*_addr = gray;_addr = (center_y+var-1) * x_max + center_x+offset + osd_address;*_addr = gray;_addr = (center_y+var-1) * x_max + center_x-offset + osd_address;*_addr = gray;}}

创作不易,请大佬们点个赞! 有问题请留言讨论!

屏幕上绘制图形——基于C语言绘制图形(点、线、矩形、圆)相关推荐

  1. 在屏幕上显示一个短句c语言编程,在屏幕上显示Hllo.ppt

    在屏幕上显示Hllo * * §2.1 在屏幕上显示Hello World 第2章 用C语言编写程序 用算例尽快进入编程 例2-1 在屏幕上显示一个短句: Hello World /* 显示" ...

  2. r语言 图形一览_R语言实战—图形篇(图形初阶)

    最近沉迷学习R语言,不得不说<R语言实战>真的太详细了,详细的阅读完这本书后,我的收获不小.为了方便自己复习,将这本书的内容整理归纳为两个部分:统计篇(数据分析)和图形篇(数据可视化). ...

  3. 图形基本变换c语言代码,图形变换-C语言课程设计.doc

    学号 <> 课程设计报告 图形变换网络工程班级:16(3)姓名:指导教师:成绩: 计算机学院 2017 年 5月 10日 目录- 1 - 1 设计要求- 2 - 2 程序功能- 2 - 3 ...

  4. r语言 断轴 画图_基于R语言绘制坐标轴截断图

    画图时经常遇到不同组的数据大小相差很大,大数据就会掩盖小数据的变化规律,这时候可以对Y轴进行截断,从而可以在不同层面(大数据和小数据层面)全面反映数据变化情况,如下图所示. 搜索截断图绘制的方法,有根 ...

  5. r语言 index_基于R语言绘制BBC风格图表

    作者:吴健 中国科学院大学 R语言.统计学爱好者,尤其擅长R语言和Arcgis在生态领域的应用分享 个人公众号:统计与编程语言 近日在google上浏览一篇文章<BBC Visual and D ...

  6. r语言 图形一览_R语言之图形概览

    本文将讨论用R语言自带的基本绘图系统和ggplot2包来讨论基本图形的绘制. 一.条形图(bar chart): 我在学习这部分时会遇到这样的困惑,觉得条形图(bar chart)和直方图(histo ...

  7. r语言 图形一览_R语言常见图形(1)

    本文涉及的基础图形有条形图.饼图.直方图.核密度图.箱线图.点图. 条形图 条形图通过垂直或水平的条形展示类别变量的分布(频数). 函数barplot() 调用格式: barplot(height) ...

  8. pythonturtle画飞机_浅谈pygame编写外星人入侵游戏第一步(屏幕上绘制飞机)......

    本人小白 刚开始学习python半月,到目前将python基础语法跑了一遍,不算透彻,只是有一些映像...... 于是学着做外星人入侵游戏,想从项目中深度学习,直接上目前的效果图: --------- ...

  9. Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...

    怎么用java编写如下程序在屏幕上输出如下图形 * *** ***** ******* ***** ... 4个答案  提问时间: 2011-12-16  22个赞 回答:这个图形对吧? * *** ...

最新文章

  1. leetcode-24 两两交换链表中的节点
  2. 批量修改漫游配置文件路径
  3. Java构造函数的使用_java中构造函数的使用方法
  4. linux libffi 简介 高级语言互调库
  5. centos 5.x 安装 zendOptimizer 5.x
  6. Eclipse常用的高效插件
  7. Pulsar集群搭建部署
  8. 记录每次更新到仓库 —— Git 学习笔记 10
  9. 生成和合入patch的两种方式
  10. [原创]换一份工作要考虑什么?
  11. NDK集成libjpeg和libpng
  12. 安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步
  13. 计算机等级考试2010,2010年全国计算机等级考试相关政策
  14. Kafka:常用命令
  15. 网管教程+从入门到精通软件篇
  16. oracle中sqlplus,Oracle sqlplus命令的详细解析
  17. 极速办公ppt里面如何插入表格
  18. linux cab文件怎么安装包,IE控件cab包手动安装
  19. Unity全面入门笔记6-常用数学类型
  20. 使用计算机控制台方法,电脑打开控制面板的几种方法

热门文章

  1. uni-app运行到微信小程序
  2. Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法
  3. MySql实验嵌套查询_实验五 数据库的嵌套查询实验
  4. crm软件对于中小企业究竟有哪些好处呢?
  5. 我的2016--找工作总结
  6. android https请求证书过滤白名单,Android处理https请求的证书问题
  7. 关于springboot的将自建user对象交给springboot容器管理时出现的小问题
  8. 【技术新趋势】合合信息:文本纠错提升OCR任务准确率的方法
  9. 网络安全工程师从0单排日记---(0)
  10. bash脚本截取字符串的两种方法