[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画

>_<:这里的动画是黄色矩形区域中一个模仿俯视图的起重机运作动画,一个是模仿主视图的吊钩的运动。通过改变初始Init函数中的数据b_x,b_y实现矩形区域的移动。当实时采集时要首先根据起重机的实际情况改变比例,当传感器传来数据时就相当于这里的run函数,只要把传感器数据接收函数和相关函数结合即可。

>_<:main code:


  1 #include "stdlib.h"
2 #include "GUI.H"
3 /*
4 颜色
5 */
6 #define Black 0x000000
7 #define White 0xFFFFFF
8 #define Blue 0xFF0000
9 #define Red 0x0000FF
10 /*
11 画矩形区----------改造的和51一样的函数
12 */
13 void Rectangle(int left,int up,int right,int down,U16 color)
14 {
15 GUI_SetColor(color);
16 GUI_DrawHLine(up,left,right);//横线
17 GUI_DrawHLine(down,left,right);//横线
18 GUI_DrawVLine(left,up,down);//垂线
19 GUI_DrawVLine(right,up,down);//垂线
20 }
21 /*
22 画线函数-----------改造的和51一样的函数
23 */
24 void Line(int x0,int y0,int x1,int y1,U16 color)
25 {
26 GUI_SetColor(color);
27 GUI_DrawLine(x0,y0,x1,y1);
28 }
29 ///////////////////////////////////////////////////////////////////////////
30 int b_x,b_y,b_l,b_w;//轨道的x,y,长,宽
31 //大车的位置,老位置,y值,宽,速度,加速度,左限位,右限位
32 int m_x,m_old_x,m_y,m_l,m_w,m_v,m_a,m_l_limit_p,m_r_limit_p;
33 //小车的位置,老位置,超出部分,速度,加速度,上限位,下限位
34 int s_y,s_old_y,s_extre_part,s_v,s_a,s_u_limit_p,s_d_limit_p;
35
36
37 int h_x,h_y,h_w;//横梁的x,y和宽
38 int move_x_v,move_y_v,move_a;//水平移动速度,
39 int line_x,line_old_x,line_y,line_l,line_old_l;//伸长部分x,老x,y,长,老长
40 //--------------------------------------------------------------
41 void init1()
42 {
43 b_x=40,b_y=120,b_l=100,b_w=420;
44 m_x=m_old_x=b_x+10,m_y=b_y-10,m_l=120,m_w=50,m_v=1,m_a=0,m_l_limit_p=40,m_r_limit_p=b_x+b_w-m_l_limit_p;
45 s_y=s_old_y=b_y+10,s_extre_part=10,s_v=1,s_a=0,s_u_limit_p=b_y+10,s_d_limit_p=b_y+b_l-10;
46 }
47 void init2()
48 {
49 h_x=b_x,h_y=b_y+b_l+60,h_w=b_w;
50 move_x_v=s_v*h_w/m_l,move_y_v=2,move_a=0;
51 line_x=line_old_x=100,line_y=h_y+3,line_l=line_old_l=50;
52 }
53 //---------------------------Draw-------------------------------
54 void drawBig()
55 {
56 Line(b_x,b_y,b_x+b_w,b_y,Black);
57 Line(b_x,b_y+b_l,b_x+b_w,b_y+b_l,Black);
58 }//主梁画
59 void drawMiddle()
60 {
61 if(m_x!=m_old_x)Line(m_old_x,m_y,m_old_x,m_y+m_l,White);
62 Line(m_x,m_y,m_x,m_y+m_l,Blue);
63 if(m_x!=m_old_x)Line(m_old_x+m_w,m_y,m_old_x+m_w,m_y+m_l,White);
64 Line(m_x+m_w,m_y,m_x+m_w,m_y+m_l,Blue);
65 }//画横梁
66 void drawSmall()
67 {
68 if(s_old_y!=s_y || m_x!=m_old_x)Line(m_old_x-s_extre_part,s_old_y,m_old_x+m_w+s_extre_part,s_old_y,White);
69 Line(m_x-s_extre_part,s_y,m_x+m_w+s_extre_part,s_y,Red);
70 }//画小车
71 void draw1()
72 {
73 drawBig();//画主梁
74 drawMiddle();//画横梁
75 drawSmall();//画小车
76 }//总画函数
77 //----------------------------run-----------------------------
78 void runMiddle()
79 {
80 m_old_x=m_x;
81 m_x+=m_v;
82 if(m_x+m_w>=m_r_limit_p || m_x<=m_l_limit_p)m_v*=-1;//达到警戒线
83 }//横梁移动
84 void runSmall()
85 {
86 s_old_y=s_y;
87 line_old_x=line_x;
88 s_y+=s_v;
89 line_x+=move_x_v;
90 if(s_y>=s_d_limit_p || s_y<=s_u_limit_p){
91 s_v*=-1;
92 move_x_v*=-1;
93 }//达到警戒线
94 }//小车移动
95 void run1()
96 {
97 runMiddle();
98 runSmall();
99 }//运动函数
100 /////////////////////////////////////////////////////////////////////////////////
101 //-------------------------draw--------------------------------
102 void drawGou()
103 {
104 if(line_old_x!=line_x || line_old_l!=line_old_l){
105 Rectangle(line_old_x-3,line_y+line_old_l,line_old_x+3,line_y+line_old_l+6,White);
106 Line(line_old_x,line_y+line_old_l+6,line_old_x,line_y+line_old_l+9,White);
107 Line(line_old_x,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+9,White);
108 Line(line_old_x+6,line_y+line_old_l+9,line_old_x+6,line_y+line_old_l+15,White);
109 Line(line_old_x+6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+15,White);
110 Line(line_old_x-6,line_y+line_old_l+15,line_old_x-6,line_y+line_old_l+12,White);
111 }
112 Rectangle(line_x-3,line_y+line_l,line_x+3,line_y+line_l+6,Blue);
113 Line(line_x,line_y+line_l+6,line_x,line_y+line_l+9,Black);
114 Line(line_x,line_y+line_l+9,line_x+6,line_y+line_l+9,Black);
115 Line(line_x+6,line_y+line_l+9,line_x+6,line_y+line_l+15,Black);
116 Line(line_x+6,line_y+line_l+15,line_x-6,line_y+line_l+15,Black);
117 Line(line_x-6,line_y+line_l+15,line_x-6,line_y+line_l+12,Black);
118 }//画勾,x,y为绳的下端,r为大小
119 void drawH()
120 {
121 Line(h_x,h_y,h_x+h_w,h_y,Black);
122 }//画横梁
123 void drawHuaKuai()
124 {
125 if(line_old_x!=line_x)Rectangle(line_old_x-6*3/4,line_y-6,line_old_x+6*3/4,line_y,White);
126 Rectangle(line_x-6*3/4,line_y-6,line_x+6*3/4,line_y,Blue);
127 }//画滑块,x,y为绳的上端,r为大小
128 void drawLine()
129 {
130 if(line_old_l!=line_l || line_x!=line_old_x)Line(line_old_x,line_y,line_old_x,line_y+line_old_l,White);
131 Line(line_x,line_y,line_x,line_y+line_l,Black);
132 }//画线
133 void draw2()
134 {
135 drawH();
136 drawHuaKuai();
137 drawLine();
138 drawGou();
139 }
140 ///////////////////////////////////////////////////////////////////////////
141 //-------------------------draw尺子--------------------------------
142 void draw0()
143 {
144 GUI_SetColor(GUI_YELLOW);
145 GUI_FillRect(b_x-15,b_y-15,b_x+b_w+15,h_y+190);
146 Rectangle(b_x-15,b_y-15,b_x+b_w+15,h_y+190,GUI_BLUE);//画边框
147 }
148 ///////////////////////////////////////////////////////////////////////////
149 void Fun(void)//fun里面的Fun函数------一切动画贴图都在此
150 {
151 init1();//初始化1画面
152 init2();//初始化2画面
153 GUI_SetBkColor(WHITE);
154 GUI_Clear();
155 //GUI_DrawBitmap(&bmkk,0,0);
156 draw0();
157 while(1)
158 {
159 run1();
160 line_old_l=line_l;
161 line_l+=1;
162 if(line_l>160)line_l=10;
163 draw1();
164 draw2();
165 GUI_Delay(1);
166 }
167 }

[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画,布布扣,bubuko.com

时间: 2024-10-16 12:12:01

[stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画的相关文章

计算机图形学(二)输出图元_2_ OpenGL画线函数

 OpenGL画线函数 图形软件包一般都提供一个描述一条或多条直线段的函数,其中每一直线段由两个端点坐标位置定义.在OpenGL中,和选择一个点位置一样,我们使用glVertex函数选择单个端点的坐标位置.我们使用一对glBegin/g1End来引入一串端点位置.有三个OpenGL符号常量可用于指定如何把这一串端点位置连接成一组直线段.默认情况下,每一符号常量显示白色实线. 使用图元线常量GL_LINES可连接每一对相邻端点而得到一组直线段.通常,这会导致一组未连接的线段,除非重复某些坐标位置.

STM32+uCOS-II+uc/GUI移植 (uC/GUI API函数学习一)

最近一段时间以来,想学习移植uCGUI.在网络上找了大量的移植资料和学习教程,加上自己的不断努力,成功的完成了移植.现将学习中遇到的问题和已经记录下来,方面自己的翻阅,也可以为初学者提供一条捷径. uC/GUI基本函数: 在LCD上显示文本 GUI_DispString("") 参数:你希望显示的文本 选定坐标 GUI_GotoXY(x,y) 例如:在(10,10)坐标点位置,显示Hello World!文本 GUI_GotoXY(10,10); GUI_DispString(&quo

AGG第三十九课 rasterizer_scanline_aa画线函数疑惑

头文件 #include<agg_rasterizer_scanline_aa.h> 类型 template<class Clip =rasterizer_sl_clip_int> class rasterizer_scanline_aa 成员函数 void add_path(VertexSource&vs,unsigned path_id=0)加入顶点源 void reset() 清空上一次的渲染缓存数据,每次调用add_path函数之前都需要执行该操作 其中也提供了简单

MFC画线功能总结

MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始端点,其二,利用不同的方法实现画线.下面着重学习总结画线功能实现方法. 在OnLButtonDown函数中记录起始端点,CPoint m_ptOrigin = point; 在OnLButtonUp函数中实现画线.方法如下: 画线方法一:利用SDK全局函数实现视图窗口画线功能 //获取设备描述表 HDC hdc; //调用全局函数获得当前窗口的设备描述表,CWnd::m_hWnd根据继承原理,CDrawView继承了CWnd类的数据成

matlab练习程序(Bresenham画线)

Bresenham画线算图形学中最基础的知识了,可惜我并没有选修过图形学,所有还是有必要熟悉一下. 上一篇用到的画线函数应该算是数值微分法,也是我最常用的一种方法,不过这种方法似乎并不是很好. 这里的画线方法比上一种方法好. 算法原理如下: 过各行各列象素中心构造一组虚拟网格线.按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素. 该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素. 更细节的原理参考这里.

计算机图形学DDA画线法+中点画线法+Bresenham画线法

#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> void line1(){ line(100, 100, 200, 400); line(100, 400, 200, 100); line(0, 200, 300, 300); line(0, 300, 300, 200); } void lineDDA(int x0, int y0, int x1,

利用C语言编辑画图程序的实现方法

不知道大家在进行开发县级电网调度自动化系统的时候,是否都会遇到一个问题就是:要绘制一个电力系统一次接线图.大家都应该知道其实电力系统的一次接线图是较为复杂的,如果想要使用一般的编程方法来进行绘制的话,基本上就是行不通的.那么我们应该怎样才可以更加的高效直接呢?今天小编就会给大家介绍一个方法,那就是:利用C语言编辑画图程序的实现方法.希望这篇教程对于大家有所帮助. 一.实现方法 在教程开始之前,小编先为大家介绍一下在编程程序里面早已定义了几个特殊按钮.为什么小编要为大家介绍这几个特殊按钮呢?那是因

uc/GUI在SylixOS下的应用

1 工作准备 1.1 环境准备 在使用之前,须安装有SylixOS的集成开发套件,由于系统上安装的防火墙软件或者杀毒软件,可能会影响到集成开发软件的使用,因此,在使用本套件前请关闭计算机上的windows 防火墙以及杀毒软件. 因后续操作需要在模拟器上进行展示(本文档以mini2440模拟器进行模拟展示),所以在进行后续章节操作前,请完成 mini2440模拟器的配置并启动. 注意:本文档提供库只支持ARM体系结构,其他体系架构暂不支持. 1.2 资源准备 请通过网上搜索或其他方式获取类GUI库

用 eric6 与 PyQt5 实现python的极速GUI编程(系列03)---- Drawing(绘图)(3)-- 画线

[概览] 本文实现如下的程序:(在窗体中绘画出各种不同风格的线条) 主要步骤如下: 1.在eric6中新建项目,新建窗体 2.(自动打开)进入PyQt5 Desinger,编辑图形界面,保存 3.回到eric 6,对上一步得到的界面文件 drawing.ui 文件右击,编译窗体,得到 Ui_drawing.py 文件 4.然后再对 drawing.ui 文件右击,生成对话框代码,得到 drawing.py 文件.(在drawing.py中添加自己的程序逻辑) 5.py2exe打包成exe文件(此