草庐IT

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

勾栏听曲_0 2025-01-17 原文

本文利用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);
}

有关ARM6818开发板画任意矩形,圆形,三角形,五角星,6818开发板画太极,画五星红旗(含码源与思路)的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  3. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  4. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  5. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  7. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  10. ruby - Rails 开发服务器、PDFKit 和多线程 - 2

    我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:

随机推荐