ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)

news2024/11/17 17:35:00

本文利用6818开发板完成LCD屏上绘制任意的矩形,圆形,三角形或五角星形图案,还有绘制太极,五星红旗的方案。

 

目录

映射

绘制矩形

代码思路

代码实现

 实践出真知

绘制圆形

代码思路

代码实现

绘制三角形

代码思路

代码实现

绘制五角星

代码思路

代码实现

绘制太极

代码思路

代码实现

绘制五星红旗

代码思路

代码实现


映射

#include <stdio.h>
#include <math.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>

unsigned int *plcd =NULL;

/* 
Lcd_Init :LCD初始化,打开LCD屏幕,并完成映射机制
 */
int Lcd_Init()
{
	int fd = open("/dev/fb0",O_RDWR);
	if(-1 == fd)
	{
		perror("open error");
		return -1;
	}
	plcd = mmap(NULL,800 * 480 * 4,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
}

 /* 
 Display :用映射的方法画一个点的颜色
 参数:
    color :画点的颜色
    x :点的X坐标
    y :点的Y坐标
  */
void Display(unsigned int color,int x,int y)
{
	if(x >= 0 && x < 800 && y >= 0 && y < 480){
		*(plcd + y * 800 + x) = color;
	}
}

/* 
Lcd_Uninit :解映射,关闭LCD屏
 */
void Lcd_Uninit()
{
    munmap(plcd,800*480*4);
    close(fd);
}

绘制矩形

代码思路

1.实现思考传参,使用那些参数可以确定一个矩形的位置呢,有两种思路:

        一是像下述代码中传入矩形右上角顶点的坐标信息与矩形的长于宽(我们已这一种为例)

        二是传入矩形左上角顶点与右下角顶点的坐标信息

2.如下if语句所写,判断哪些点位于矩形中,就将哪些点绘制。

如果使用第二种思路,if语句中应该写

if(i>=y1 && i<=y2 && j>=x1 && j<=x2)
{
        Display(col,j,i);
}

代码实现

/* 
rectangle :画一个矩形
参数:
    x :矩形左上点的X坐标
    y :矩形左上点的y坐标
    l :矩形的长度
    h :矩形的宽度
    col:矩形的颜色
 */
void rectangle(int x,int y,int l,int h,unsigned int col)
{
    int i=0,j=0;
    for(i = 0;i < 480;i++)
    {
        for(j = 0;j < 800;j++)
        {
            if(i>=y && i<=y+h && j>=x && j<=x+l)
            {
                Display(col,j,i);
            }
        }
    }
}

 实践出真知

题目 :将LCD屏等分成四个矩形,并绘制不同颜色

/* 
si_rectangle :将屏幕分割成四等分
参数:
    col1,col2,col3,col4:分别为四个矩形的颜色
 */
void si_rectangle(unsigned col1,unsigned col2,unsigned col3,unsigned col4)
{
    rectangle(0,0,400,240,col1);
    rectangle(400,0,800,240,col2);
    rectangle(0,240,400,480,col3);
    rectangle(400,240,800,480,col4);
}

绘制圆形

代码思路

1.思考什么样的传参可以确定一个圆形

        显然传入圆心坐标与圆的半径就可以确定圆的位置啦

2.通过圆的方程将满足在圆内的点绘制颜色即可

代码实现

/* 
screen_quan :画圈
参数:
    int x0 :圆心的X轴
    int y0 :圆心的Y轴
    int r  :圆的半径
    unsigned int colour :圆的颜色
 */
int screen_quan(int x,int y,int r,unsigned int colour)
{
    
    int i=0,j=0;
    unsigned int col = 0xffffff;
    for(i = 0;i < 480;i++)
    {
        for(j = 0;j < 800; j++)
        {
            if((j-x)*(j-x) +(i-y)*(i-y) <= r*r)
            {
                Display(colour,j,i);
            }
        }
    }
    return 0;
}

绘制三角形

代码思路

1.思考什么样的传参可以确定一个三角形

        当传入三角形的三个顶点的坐标信息,就可以确定三角形的位置啦

2.要如何判断有哪些点在三角形内呢

        首先将三角形的三条边的一次方程求出来,然后利用每条边的第三个顶点来判断这个三角形与这条直线的相对位置。如果第三个顶点的坐标代入直线方程是大于0的,那么说明三角形是位于直线大于0的那边,在下面写if语句是,将遍历的坐标代入直线方程,大于0的便是满足在三角形内的点;三条边都是这个道理,就能形成一个三角形区域啦。

代码实现

/* 
triangle :画三角形
参数:
    x1 :三角形第一个顶点的X坐标
    y1 :三角形第一个顶点的y坐标
    x2 :三角形第二个顶点的X坐标
    y2 :三角形第二个顶点的y坐标
    x3 :三角形第三个顶点的X坐标
    y3 :三角形第三个顶点的y坐标
    col:三角形的颜色
 */
void triangle(int x1,int y1,int x2,int y2,int x3,int y3,int col)
{
    //flag:代表本三角形在本直线的左边(0)还是右边(1)(左边右边是抽象概念)
    int i,j,flag1=0,flag2=0,flag3=0;
    float A1,B1,C1,A2,B2,C2,A3,B3,C3;
    //1号点与2号点的直线方程的A,B,C
    A1 = y2 - y1;
    B1 = x1 - x2;
    C1 = x2*y1 - x1*y2;
    //2号点与3号点的直线方程的A,B,C
    A2 = y2 - y3;
    B2 = x3 - x2;
    C2 = x2*y3 - x3*y2;
    //1号点与3号点的直线方程的A,B,C
    A3 = y3 - y1;
    B3 = x1 - x3;
    C3 = x3*y1 - x1*y3;

    //判断第三个点与直线的相对位置
    if(x3*A1+y3*B1+C1 > 0)  flag1=1;
    if(x1*A2+y1*B2+C2 > 0)  flag2=1;
    if(x2*A3+y2*B3+C3 > 0)  flag3=1;

    for(i=0;i<480;i++){
        for(j=0;j<800;j++){
            if(flag1 == 1){
                if(flag2 == 1){
                    if(j*A1+i*B1+C1 > 0 && j*A2+i*B2+C2 > 0 && j*A3+i*B3+C3 < 0)
                    {
                        Display(col,j,i);
                    }
                }
                else{
                    if(flag3 == 1){
                        if(j*A1+i*B1+C1 > 0 && j*A2+i*B2+C2 < 0 && j*A3+i*B3+C3 > 0)
                        {
                            Display(col,j,i);
                        }
                    }
                    else{
                        if(j*A1+i*B1+C1 > 0 && j*A2+i*B2+C2 < 0 && j*A3+i*B3+C3 < 0)
                        {
                            Display(col,j,i);
                        }
                    }
                }
            }
            else{
                if(flag2 == 0){
                    if(j*A1+i*B1+C1 < 0 && j*A2+i*B2+C2 < 0 && j*A3+i*B3+C3 > 0)
                    {
                        Display(col,j,i);
                    }
                }
                else{
                    if(flag3 == 1){
                        if(j*A1+i*B1+C1 < 0 && j*A2+i*B2+C2 > 0 && j*A3+i*B3+C3 > 0)
                        {
                            Display(col,j,i);
                        }
                    }
                    else{
                        if(j*A1+i*B1+C1 < 0 && j*A2+i*B2+C2 > 0 && j*A3+i*B3+C3 < 0)
                        {
                            Display(col,j,i);
                        }
                    }
                }
            }
        }
    }
}

绘制五角星

代码思路

1.思考什么样的传参可以确定一个五角星

        对于一个正五角星来说,传入中心点的坐标与中心点到外顶点的距离就可以确定一个五角星的位置了。

2.利用绘制三角形的函数,来绘制五角星

        首先我们要知道五角星十个顶点的坐标,利用中心点坐标,中心点到外顶点的距离,以及五角星的倾斜度,就可以用下函数中for循环中的公式求出十个顶点的坐标信息。

        然后将五角星拆成三个由两个外顶点与一个内顶点组成的三角形即可。

代码实现

/* 
five_Pointed :画五角星
参数:
    x :五角星的在正中心点的X坐标
    y :五角星的在正中心点的Y坐标
    R :中心点到外顶点的长度
    col:五角星的颜色
    yDegree :五角星的倾斜程度
 */
void five_Pointed(int x,int y,int R,unsigned int col,int yDegree)
{
    struct Vertex
    {
        int x;
        int y;
    };
    struct Vertex RVertex[5], rVertex[5];              //外围5个顶点的坐标与内部五个顶点的坐标
    
    double rad = 3.1415926 / 180;                    //每度的弧度值
    double r = R * sin(18 * rad) / cos(36 * rad);    //五角星短轴的长度
    for (int k = 0; k < 5; k++)                      //求取坐标
    {
       RVertex[k].x = (int)(x - (R * cos((90 + k * 72 + yDegree) *rad)));
       RVertex[k].y = (int)(y - (R * sin((90 + k * 72 + yDegree) * rad)));
       rVertex[k].x = (int)(x - (r * cos((90 + 36 + k * 72 + yDegree) *rad)));
       rVertex[k].y = (int)(y - (r * sin((90 + 36 + k * 72 + yDegree) * rad)));
    }
    triangle(RVertex[1].x,RVertex[1].y,RVertex[3].x,RVertex[3].y,rVertex[4].x,rVertex[4].y,col);
    triangle(RVertex[2].x,RVertex[2].y,RVertex[4].x,RVertex[4].y,rVertex[0].x,rVertex[0].y,col);
    triangle(RVertex[3].x,RVertex[3].y,RVertex[0].x,RVertex[0].y,rVertex[1].x,rVertex[1].y,col);
}

绘制太极

代码思路

1.思考什么样的传参可以确定一个太极

        传入太极中心点的坐标信息与大圆的半径即可

2.要熟练运用覆盖的思想

        如果是想着太极中间那两段圆弧,想利用那两度圆弧直接把两边的阴阳鱼画出来,可以,蛋很麻烦,所以我们来选择一条更简单的路线。

        首先我们在画大圆的基础上,将圆劈成两半,这个操作很简单,只要在判断圆的if语句里加上X小于中心点的X坐标(或者大于),就可以将两个半圆绘制好。

        然后然后确定上下一大一小的两个圆的坐标信息,较大的那个圆是为例绘制那两段圆弧(鱼头),上面鱼头的圆心的X坐标就是中心点的X坐标,而Y坐标是中心点Y坐标加半径的一半,而这个鱼头的半径就是大圆半径的一半,下面同理。上下两个鱼眼的圆心与上面所说的鱼头圆心一样,半径按比例缩小一些即可。

        获得这些圆心与半径后,直接调用上面写的画圆函数即可,太极就完成啦。

代码实现

/* 
taiji :画一个太极
参数:
    x :中心点的X坐标
    y :中心点的Y坐标
    r :大圆半径
    col1 :一边的颜色
    col2 :另一半的颜色
 */
void taiji(int x,int y,int r,unsigned int col1,unsigned int col2)
{
    int i=0,j=0;
    for(i = 0;i < 480;i++)
    {
        for(j = 0;j < 800; j++)
        {
            if((j-x)*(j-x) +(i-y)*(i-y) <= r*r && j < x)
            {
                Display(col1,j,i);
            }
            else if((j-x)*(j-x) +(i-y)*(i-y) <= r*r && j > x)
            {
                Display(col2,j,i);
            }
        }
    }
    screen_quan(x,y-r/2,r/2,col1);
    screen_quan(x,y+r/2,r/2,col2);
    screen_quan(x,y-r/2,r/5,col2);
    screen_quan(x,y+r/2,r/5,col1);
}

绘制五星红旗

代码思路

1.主要是利用上面画五角星的函数来完成五星红旗的制作

2.先画红色底色

3.确定五个五角星的位置,调用画五角星的函数直接绘制即可

代码实现

/* 
national_flag :画国旗
 */
void national_flag()
{
    int i=0,j=0;
    for(i = 0;i < 480;i++)
    {
        for(j = 0;j < 800; j++)
        {
           Display(0xff0000,j,i);
        }
    }
    five_Pointed(110,150,70,0xffff00,0);
    five_Pointed(200,60,40,0xffff00,20);
    five_Pointed(270,130,40,0xffff00,40);
    five_Pointed(270,230,40,0xffff00,0);
    five_Pointed(200,290,40,0xffff00,40);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【回答问题】ChatGPT上线了!用给写出可执行的实体链接模型

如何实现一个实体链接模型/代码 在实现实体链接模型之前&#xff0c;您需要确定所要链接的实体类型&#xff08;例如人名、地名、组织机构等&#xff09;。然后&#xff0c;您需要准备一份包含大量实体及其相应识别码的实体百科数据集。接着&#xff0c;您可以使用深度学习模型…

乾元通多卡聚合通信系统在应急通信领域的解决方案

后疫情时代&#xff0c;日益增多的大型集会类事件给现有通信系统带来极大的压力。目前&#xff0c;我国已经认识到应急通信系统的重要性&#xff0c;因此我国各个部门已经配置了不少应急通信系统和设备&#xff0c;并且积累了相当的使用经验。 在不同情况下&#xff0c;对应急…

基础数据结构——数组

目录 一、前言 二、一维数组 1、定义和初始化 2、一维变长数组 3、一维正向遍历 4、一维反向遍历 5、一维数组区间操作、一维数组从 a[1] 开始&#xff0c;读入一维数组 6、一维数组例题1 7、一维数组例题2 三、二维数组 1、二维数组初始化 2、三维数组初始化 3…

HTTP_day02

掘金地址 结合 小林 coding 当键入网址后&#xff0c;到网页显示&#xff0c;其间发生了什么 DNS 服务器 专门保存了 Web 服务器域名与 IP 的对应关系 域名用“.”分隔成多个单词&#xff0c;级别从左到右逐级升高&#xff0c;最右边的被称为“顶级域名” DNS 服务器是一个分…

聊聊Spring中最常用的11个扩展点

前言 我们一说到spring&#xff0c;可能第一个想到的是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。 没错&#xff0c;它们是spring的基石&#xff0c;得益于它们的优秀设计&#xff0c;使得spring能够从众多优秀框架中脱颖而出。 除…

第三十六讲:神州无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…

业务状态实时监控预警,「告警配置」来帮您

腾讯云数据连接器iPaaS团队服务了各行各业的数百家客户后&#xff0c;发现许多企业有大量的自建应用/SaaS应用&#xff0c;却缺乏一套可靠灵活的告警系统。当相关的IT系统/资源调配出现故障后&#xff0c;往往是影响到业务系统被用户投诉后&#xff0c;技术人员才发现故障并展开…

【超详细】LightGBM介绍与应用

目录 1. LightGBM简介 2. LightGBM详细介绍 2.1 单边梯度抽样算法 2.2 直方图算法 2.3 互斥特征捆绑算法 2.4 基于最大深度的 Leaf-wise 的垂直生长算法&#xff08;带深度限制的 Leaf-wise 算法&#xff09; 2.5 类别特征最优分割 &#xff08;直接支持类别特征&#xf…

【自学Python】Windows安装Python

Windows安装Python Python下载 Python下载地址 https://www.python.org/Python下载 打开上面的链接&#xff0c;打开 Python 的下载页面&#xff0c;如下图所示&#xff1a; 我们把鼠标放到 Downloads 上&#xff0c;然后点击 Windows&#xff0c;此时界面如下图所示&#…

Docker简介

Docker官网链接&#xff1a; http://docker.p2hp.com/问题&#xff1a;我们开发的嵌入式项目基本是基于虚拟机下的ubuntu的&#xff0c;如果每一个项目要求的系统版本、库版本、交叉编译工具链等不一样&#xff0c;我们就需要为每一个项目安装一个对应的ubuntu&#xff0c;这既…

【Leetcode】111. 二叉树的最小深度

一、题目 1、题目描述 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2…

4.0、Linux-文件属性查看和修改学习

4.0、Linux-文件属性查看和修改学习 基本属性 Linux 系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限&#xff1b;为了保护系统的安全性&#xff0c;Linux 系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限…

Linux0基础入门,教你如何在Shell中使用正则表达式

正则表达式 在 shell 脚本中成功运用 sed 编辑器和 gawk 程序的关键在于熟练使用正则表达式。这可不是件简单的事&#xff0c;从大量数据中过滤出特定数据可能会&#xff08;而且经常会&#xff09;很复杂。本章将介绍如何在 sed 编辑器和 gawk 程序中创建正则表达式来过滤出需…

聚观早报 | 元旦机票预订量增长145%;小米集团副总裁崔宝秋离职

今日要闻&#xff1a;元旦跨境机票预订量增长145%&#xff1b;小米集团副总裁崔宝秋离职&#xff1b;抖音推出桌面端聊天软件&#xff1b;《阿凡达2》全球票房破14亿美元&#xff1b;苹果 A17 芯片要用 3nm 工艺元旦跨境机票预订量增长145% 1 月 2 日&#xff0c;各旅游平台发布…

小工具集锦,5款好用的良心软件

今天来给大家推荐5款良心软件,每款都是经过时间检验的精品,用起来让你的工作效率提升飞快&#xff0c;各个都让你觉得相见恨晚&#xff01; 1.高效截图——Snipaste 我曾经尝试过 FastStone Capture、ShareX 等多款截图软件&#xff0c;直到遇见 Snipaste 才画上句点。除了基…

“当不存在跨域问题,也解决了数据验证时,还出现:No ‘Access-Control-Allow-Origin‘,说存在跨域问题 ”的解决办法

不存在跨域问题&#xff0c;数据验证也弄好了&#xff0c;还出现下面的问题&#xff1a;Access to XMLHttpRequest at https://m.maizuo.com/gateway?cityId440100&pageNum1&pageSize10&type1&k7325551 from origin http://localhost:8080 has been blocked b…

OpenCv:直方图均衡化(HE),自适应直方图均衡化(AHE),限制对比度自适应直方图均衡化(CLAHE)

总结了使用Python OpenCv处理图像直方图均衡化(HE)&#xff0c;自适应直方图均衡化(AHE)&#xff0c;限制对比度自适应直方图均衡化(CLAHE)的方法。 目录直方图均衡化(HE)自适应直方图均衡化(AHE)限制对比度自适应直方图均衡化(CLAHE)代码测试结果场景1场景2直方图均衡化(HE) …

MySQL 体系结构

MySQL经典体系结构 MySQL连接: MySQL Protocol(MySQL协议) Socket (Unix Scoket)本地连接 比如:mysql -uroot -p123 -S /tmp/mysql.sock TCP/IP(远程连接) 比如:mysql -uroot -p123 -h 10.0.0.51 -P3306 API (应用程序、开发) Native API C、PHP、JDBC、ODBC、.NET、Pyth…

大数据资源整合分析平台_企业大数据管理软件_大数据资源整合管理系统

在现如今大数据时代下&#xff0c;很多公司拥有大量的数据信息&#xff0c;这些数据繁多并且复杂&#xff0c;对于不懂技术的人员来讲&#xff0c;无疑是巨大的难题&#xff0c;这些数据背后存在着巨大的价值&#xff0c;我们可以利用大数据的方式&#xff0c;来提高数据的使用…

戴尔灵越14电脑U盘重装系统方法分享

戴尔灵越14电脑U盘重装系统方法分享。一些用户的戴尔灵越14电脑在进行了系统升级之后&#xff0c;出现了系统不兼容的情况&#xff0c;导致自己的电脑桌面出现了蓝屏的情况。那么这个情况下我们怎么去将系统进行重装呢&#xff1f;一起来看看U盘重装系统的方法吧。 准备工作&am…