屏幕上绘制图形——基于C语言绘制图形(点、线、矩形、圆)
文章目录
- 一、点
- 二、线
- 二、矩形
- 二、圆
主要描述了,点、线、矩形、圆的图形绘制实现方法,供大家了解熟悉。
在调用时注意屏幕宽高的设置以及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语言绘制图形(点、线、矩形、圆)相关推荐
- 在屏幕上显示一个短句c语言编程,在屏幕上显示Hllo.ppt
在屏幕上显示Hllo * * §2.1 在屏幕上显示Hello World 第2章 用C语言编写程序 用算例尽快进入编程 例2-1 在屏幕上显示一个短句: Hello World /* 显示" ...
- r语言 图形一览_R语言实战—图形篇(图形初阶)
最近沉迷学习R语言,不得不说<R语言实战>真的太详细了,详细的阅读完这本书后,我的收获不小.为了方便自己复习,将这本书的内容整理归纳为两个部分:统计篇(数据分析)和图形篇(数据可视化). ...
- 图形基本变换c语言代码,图形变换-C语言课程设计.doc
学号 <> 课程设计报告 图形变换网络工程班级:16(3)姓名:指导教师:成绩: 计算机学院 2017 年 5月 10日 目录- 1 - 1 设计要求- 2 - 2 程序功能- 2 - 3 ...
- r语言 断轴 画图_基于R语言绘制坐标轴截断图
画图时经常遇到不同组的数据大小相差很大,大数据就会掩盖小数据的变化规律,这时候可以对Y轴进行截断,从而可以在不同层面(大数据和小数据层面)全面反映数据变化情况,如下图所示. 搜索截断图绘制的方法,有根 ...
- r语言 index_基于R语言绘制BBC风格图表
作者:吴健 中国科学院大学 R语言.统计学爱好者,尤其擅长R语言和Arcgis在生态领域的应用分享 个人公众号:统计与编程语言 近日在google上浏览一篇文章<BBC Visual and D ...
- r语言 图形一览_R语言之图形概览
本文将讨论用R语言自带的基本绘图系统和ggplot2包来讨论基本图形的绘制. 一.条形图(bar chart): 我在学习这部分时会遇到这样的困惑,觉得条形图(bar chart)和直方图(histo ...
- r语言 图形一览_R语言常见图形(1)
本文涉及的基础图形有条形图.饼图.直方图.核密度图.箱线图.点图. 条形图 条形图通过垂直或水平的条形展示类别变量的分布(频数). 函数barplot() 调用格式: barplot(height) ...
- pythonturtle画飞机_浅谈pygame编写外星人入侵游戏第一步(屏幕上绘制飞机)......
本人小白 刚开始学习python半月,到目前将python基础语法跑了一遍,不算透彻,只是有一些映像...... 于是学着做外星人入侵游戏,想从项目中深度学习,直接上目前的效果图: --------- ...
- Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...
怎么用java编写如下程序在屏幕上输出如下图形 * *** ***** ******* ***** ... 4个答案 提问时间: 2011-12-16 22个赞 回答:这个图形对吧? * *** ...
最新文章
- leetcode-24 两两交换链表中的节点
- 批量修改漫游配置文件路径
- Java构造函数的使用_java中构造函数的使用方法
- linux libffi 简介 高级语言互调库
- centos 5.x 安装 zendOptimizer 5.x
- Eclipse常用的高效插件
- Pulsar集群搭建部署
- 记录每次更新到仓库 —— Git 学习笔记 10
- 生成和合入patch的两种方式
- [原创]换一份工作要考虑什么?
- NDK集成libjpeg和libpng
- 安卓模拟器获取服务器信息出错,安卓模拟器客户端与服务器不同步
- 计算机等级考试2010,2010年全国计算机等级考试相关政策
- Kafka:常用命令
- 网管教程+从入门到精通软件篇
- oracle中sqlplus,Oracle sqlplus命令的详细解析
- 极速办公ppt里面如何插入表格
- linux cab文件怎么安装包,IE控件cab包手动安装
- Unity全面入门笔记6-常用数学类型
- 使用计算机控制台方法,电脑打开控制面板的几种方法
热门文章
- uni-app运行到微信小程序
- Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法
- MySql实验嵌套查询_实验五 数据库的嵌套查询实验
- crm软件对于中小企业究竟有哪些好处呢?
- 我的2016--找工作总结
- android https请求证书过滤白名单,Android处理https请求的证书问题
- 关于springboot的将自建user对象交给springboot容器管理时出现的小问题
- 【技术新趋势】合合信息:文本纠错提升OCR任务准确率的方法
- 网络安全工程师从0单排日记---(0)
- bash脚本截取字符串的两种方法